OSDN Git Service

5f62f3383ddb097cd8682e84769eadf8b67d1c92
[bytom/vapor.git] / consensus / segwit / segwit.go
1 package segwit
2
3 import (
4         "errors"
5
6         "github.com/vapor/consensus"
7         "github.com/vapor/protocol/vm"
8         "github.com/vapor/protocol/vm/vmutil"
9 )
10
11 func IsP2WScript(prog []byte) bool {
12         return IsP2WPKHScript(prog) || IsP2WSHScript(prog) || IsStraightforward(prog)
13 }
14
15 func IsStraightforward(prog []byte) bool {
16         insts, err := vm.ParseProgram(prog)
17         if err != nil {
18                 return false
19         }
20         if len(insts) != 1 {
21                 return false
22         }
23         return insts[0].Op == vm.OP_TRUE || insts[0].Op == vm.OP_FAIL
24 }
25
26 func IsP2WPKHScript(prog []byte) bool {
27         insts, err := vm.ParseProgram(prog)
28         if err != nil {
29                 return false
30         }
31         if len(insts) != 2 {
32                 return false
33         }
34         if insts[0].Op > vm.OP_16 {
35                 return false
36         }
37         return insts[1].Op == vm.OP_DATA_20 && len(insts[1].Data) == consensus.PayToWitnessPubKeyHashDataSize
38 }
39
40 func IsP2WSHScript(prog []byte) bool {
41         insts, err := vm.ParseProgram(prog)
42         if err != nil {
43                 return false
44         }
45         if len(insts) != 2 {
46                 return false
47         }
48         if insts[0].Op > vm.OP_16 {
49                 return false
50         }
51         return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
52 }
53
54 func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
55         insts, err := vm.ParseProgram(prog)
56         if err != nil {
57                 return nil, err
58         }
59         if insts[0].Op == vm.OP_0 {
60                 return vmutil.P2PKHSigProgram(insts[1].Data)
61         }
62         return nil, errors.New("unknow P2PKH version number")
63 }
64
65 func ConvertP2SHProgram(prog []byte) ([]byte, error) {
66         insts, err := vm.ParseProgram(prog)
67         if err != nil {
68                 return nil, err
69         }
70         if insts[0].Op == vm.OP_0 {
71                 return vmutil.P2SHProgram(insts[1].Data)
72         }
73         return nil, errors.New("unknow P2SHP version number")
74 }
75
76 func GetHashFromStandardProg(prog []byte) ([]byte, error) {
77         insts, err := vm.ParseProgram(prog)
78         if err != nil {
79                 return nil, err
80         }
81
82         return insts[1].Data, nil
83 }