OSDN Git Service

feat(bcrp): implement IsBCRPScript func and unit test (#1857)
[bytom/bytom.git] / consensus / segwit / segwit.go
index 3415291..6f70d2c 100644 (file)
@@ -1,13 +1,17 @@
 package segwit
 
 import (
+       "bytes"
        "errors"
 
-       "github.com/bytom/consensus"
-       "github.com/bytom/protocol/vm"
-       "github.com/bytom/protocol/vm/vmutil"
+       "github.com/bytom/bytom/consensus"
+       "github.com/bytom/bytom/protocol/vm"
+       "github.com/bytom/bytom/protocol/vm/vmutil"
 )
 
+//bcrp bytom contract register protocol
+const bcrp = "bcrp"
+
 func IsP2WScript(prog []byte) bool {
        return IsP2WPKHScript(prog) || IsP2WSHScript(prog) || IsStraightforward(prog)
 }
@@ -51,6 +55,46 @@ func IsP2WSHScript(prog []byte) bool {
        return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
 }
 
+// IsBCRPScript checks if a control program is bytom contract register protocol
+// BCRP script format: OP_FAIL + OP_PUSHDATA1 + "04" + hex("bcrp") + OP_PUSHDATA1 + "01" + "01" + OP_PUSHDATA1 + len(contract) + contract
+func IsBCRPScript(prog []byte) bool {
+       inst, err := vm.ParseProgram(prog)
+       if err != nil {
+               return false
+       }
+
+       if len(inst) != 4 {
+               return false
+       }
+
+       if inst[0].Op != vm.OP_FAIL {
+               return false
+       }
+
+       if inst[1].Op != vm.OP_PUSHDATA1 {
+               return false
+       }
+
+       if !bytes.Equal(inst[1].Data, []byte(bcrp)) {
+               return false
+       }
+
+       if inst[2].Op != vm.OP_PUSHDATA1 {
+               return false
+       }
+
+       // version 1
+       if !bytes.Equal(inst[2].Data, []byte{byte(1)}) {
+               return false
+       }
+
+       if inst[3].Op != vm.OP_PUSHDATA1 {
+               return false
+       }
+
+       return true
+}
+
 func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
        insts, err := vm.ParseProgram(prog)
        if err != nil {