X-Git-Url: http://git.osdn.net/view?p=bytom%2Fvapor.git;a=blobdiff_plain;f=protocol%2Fvalidation%2Fvmcontext.go;h=9815b2e3ac45968865f70d4fe9a9e7157b64a08a;hp=10b77d8f29957e021dfc59f60f8b4b4435a7d643;hb=ce85135aab7643cff4426cab11f1b822ad3ef264;hpb=571174f9f9a4e942512505e21dcfa7af06dc3613 diff --git a/protocol/validation/vmcontext.go b/protocol/validation/vmcontext.go index 10b77d8f..9815b2e3 100644 --- a/protocol/validation/vmcontext.go +++ b/protocol/validation/vmcontext.go @@ -32,23 +32,23 @@ func NewTxVMContext(vs *validationState, entry bc.Entry, prog *bc.Program, args destPos = &e.WitnessDestination.Position case *bc.Spend: - switch spentOutput := tx.Entries[*e.SpentOutputId].(type) { - case *bc.IntraChainOutput: - a1 := spentOutput.Source.Value.AssetId.Bytes() - assetID = &a1 - amount = &spentOutput.Source.Value.Amount - destPos = &e.WitnessDestination.Position - s := e.SpentOutputId.Bytes() - spentOutputID = &s + spentOutput := tx.Entries[*e.SpentOutputId].(*bc.IntraChainOutput) + a1 := spentOutput.Source.Value.AssetId.Bytes() + assetID = &a1 + amount = &spentOutput.Source.Value.Amount + destPos = &e.WitnessDestination.Position + s := e.SpentOutputId.Bytes() + spentOutputID = &s + + case *bc.VetoInput: + voteOutput := tx.Entries[*e.SpentOutputId].(*bc.VoteOutput) + a1 := voteOutput.Source.Value.AssetId.Bytes() + assetID = &a1 + amount = &voteOutput.Source.Value.Amount + destPos = &e.WitnessDestination.Position + s := e.SpentOutputId.Bytes() + spentOutputID = &s - case *bc.VoteOutput: - a1 := spentOutput.Source.Value.AssetId.Bytes() - assetID = &a1 - amount = &spentOutput.Source.Value.Amount - destPos = &e.WitnessDestination.Position - s := e.SpentOutputId.Bytes() - spentOutputID = &s - } } var txSigHash *[]byte @@ -173,6 +173,19 @@ func (ec *entryContext) checkOutput(index uint64, amount uint64, assetID []byte, return false, errors.Wrapf(vm.ErrBadValue, "index %d >= 1", index) } return checkEntry(d) + + case *bc.VetoInput: + d, ok := ec.entries[*e.WitnessDestination.Ref] + if !ok { + return false, errors.Wrapf(bc.ErrMissingEntry, "entry for vetoInput destination %x not found", e.WitnessDestination.Ref.Bytes()) + } + if m, ok := d.(*bc.Mux); ok { + return checkMux(m) + } + if index != 0 { + return false, errors.Wrapf(vm.ErrBadValue, "index %d >= 1", index) + } + return checkEntry(d) } return false, vm.ErrContext