OSDN Git Service

Mov (#518)
[bytom/vapor.git] / protocol / validation / vmcontext.go
index c817bc6..16dd185 100644 (file)
@@ -3,11 +3,11 @@ package validation
 import (
        "bytes"
 
-       "github.com/vapor/consensus/segwit"
-       "github.com/vapor/crypto/sha3pool"
-       "github.com/vapor/errors"
-       "github.com/vapor/protocol/bc"
-       "github.com/vapor/protocol/vm"
+       "github.com/bytom/vapor/consensus/segwit"
+       "github.com/bytom/vapor/crypto/sha3pool"
+       "github.com/bytom/vapor/errors"
+       "github.com/bytom/vapor/protocol/bc"
+       "github.com/bytom/vapor/protocol/vm"
 )
 
 // NewTxVMContext generates the vm.Context for BVM
@@ -25,20 +25,32 @@ func NewTxVMContext(vs *validationState, entry bc.Entry, prog *bc.Program, args
        )
 
        switch e := entry.(type) {
-       case *bc.Issuance:
-               a1 := e.Value.AssetId.Bytes()
+       case *bc.CrossChainInput:
+               mainchainOutput := tx.Entries[*e.MainchainOutputId].(*bc.IntraChainOutput)
+               a1 := mainchainOutput.Source.Value.AssetId.Bytes()
                assetID = &a1
-               amount = &e.Value.Amount
+               amount = &mainchainOutput.Source.Value.Amount
                destPos = &e.WitnessDestination.Position
+               s := e.MainchainOutputId.Bytes()
+               spentOutputID = &s
 
        case *bc.Spend:
-               spentOutput := tx.Entries[*e.SpentOutputId].(*bc.Output)
+               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
        }
 
        var txSigHash *[]byte
@@ -86,12 +98,17 @@ func NewTxVMContext(vs *validationState, entry bc.Entry, prog *bc.Program, args
 }
 
 func witnessProgram(prog []byte) []byte {
-       if segwit.IsP2WPKHScript(prog) {
-               if witnessProg, err := segwit.ConvertP2PKHSigProgram([]byte(prog)); err == nil {
+       switch {
+       case segwit.IsP2WPKHScript(prog):
+               if witnessProg, err := segwit.ConvertP2PKHSigProgram(prog); err == nil {
+                       return witnessProg
+               }
+       case segwit.IsP2WSHScript(prog):
+               if witnessProg, err := segwit.ConvertP2SHProgram(prog); err == nil {
                        return witnessProg
                }
-       } else if segwit.IsP2WSHScript(prog) {
-               if witnessProg, err := segwit.ConvertP2SHProgram([]byte(prog)); err == nil {
+       case segwit.IsP2WMCScript(prog):
+               if witnessProg, err := segwit.ConvertP2MCProgram(prog); err == nil {
                        return witnessProg
                }
        }
@@ -113,7 +130,10 @@ func (ec *entryContext) checkOutput(index uint64, amount uint64, assetID []byte,
                }
 
                switch e := e.(type) {
-               case *bc.Output:
+               case *bc.IntraChainOutput:
+                       return check(e.ControlProgram, e.Source.Value), nil
+
+               case *bc.VoteOutput:
                        return check(e.ControlProgram, e.Source.Value), nil
 
                case *bc.Retirement:
@@ -148,10 +168,10 @@ func (ec *entryContext) checkOutput(index uint64, amount uint64, assetID []byte,
        case *bc.Mux:
                return checkMux(e)
 
-       case *bc.Issuance:
+       case *bc.Spend:
                d, ok := ec.entries[*e.WitnessDestination.Ref]
                if !ok {
-                       return false, errors.Wrapf(bc.ErrMissingEntry, "entry for issuance destination %x not found", e.WitnessDestination.Ref.Bytes())
+                       return false, errors.Wrapf(bc.ErrMissingEntry, "entry for spend destination %x not found", e.WitnessDestination.Ref.Bytes())
                }
                if m, ok := d.(*bc.Mux); ok {
                        return checkMux(m)
@@ -161,10 +181,10 @@ func (ec *entryContext) checkOutput(index uint64, amount uint64, assetID []byte,
                }
                return checkEntry(d)
 
-       case *bc.Spend:
+       case *bc.VetoInput:
                d, ok := ec.entries[*e.WitnessDestination.Ref]
                if !ok {
-                       return false, errors.Wrapf(bc.ErrMissingEntry, "entry for spend destination %x not found", e.WitnessDestination.Ref.Bytes())
+                       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)