OSDN Git Service

Hulk did something
[bytom/vapor.git] / consensus / segwit / segwit.go
diff --git a/consensus/segwit/segwit.go b/consensus/segwit/segwit.go
new file mode 100644 (file)
index 0000000..5f62f33
--- /dev/null
@@ -0,0 +1,83 @@
+package segwit
+
+import (
+       "errors"
+
+       "github.com/vapor/consensus"
+       "github.com/vapor/protocol/vm"
+       "github.com/vapor/protocol/vm/vmutil"
+)
+
+func IsP2WScript(prog []byte) bool {
+       return IsP2WPKHScript(prog) || IsP2WSHScript(prog) || IsStraightforward(prog)
+}
+
+func IsStraightforward(prog []byte) bool {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return false
+       }
+       if len(insts) != 1 {
+               return false
+       }
+       return insts[0].Op == vm.OP_TRUE || insts[0].Op == vm.OP_FAIL
+}
+
+func IsP2WPKHScript(prog []byte) bool {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return false
+       }
+       if len(insts) != 2 {
+               return false
+       }
+       if insts[0].Op > vm.OP_16 {
+               return false
+       }
+       return insts[1].Op == vm.OP_DATA_20 && len(insts[1].Data) == consensus.PayToWitnessPubKeyHashDataSize
+}
+
+func IsP2WSHScript(prog []byte) bool {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return false
+       }
+       if len(insts) != 2 {
+               return false
+       }
+       if insts[0].Op > vm.OP_16 {
+               return false
+       }
+       return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
+}
+
+func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return nil, err
+       }
+       if insts[0].Op == vm.OP_0 {
+               return vmutil.P2PKHSigProgram(insts[1].Data)
+       }
+       return nil, errors.New("unknow P2PKH version number")
+}
+
+func ConvertP2SHProgram(prog []byte) ([]byte, error) {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return nil, err
+       }
+       if insts[0].Op == vm.OP_0 {
+               return vmutil.P2SHProgram(insts[1].Data)
+       }
+       return nil, errors.New("unknow P2SHP version number")
+}
+
+func GetHashFromStandardProg(prog []byte) ([]byte, error) {
+       insts, err := vm.ParseProgram(prog)
+       if err != nil {
+               return nil, err
+       }
+
+       return insts[1].Data, nil
+}