6 "github.com/bytom/vapor/consensus"
7 "github.com/bytom/vapor/protocol/vm"
8 "github.com/bytom/vapor/protocol/vm/vmutil"
11 func IsP2WScript(prog []byte) bool {
12 return IsP2WPKHScript(prog) || IsP2WSHScript(prog) || IsStraightforward(prog)
15 func IsStraightforward(prog []byte) bool {
16 insts, err := vm.ParseProgram(prog)
23 return insts[0].Op == vm.OP_TRUE || insts[0].Op == vm.OP_FAIL
26 func IsP2WPKHScript(prog []byte) bool {
27 insts, err := vm.ParseProgram(prog)
34 if insts[0].Op > vm.OP_16 {
37 return insts[1].Op == vm.OP_DATA_20 && len(insts[1].Data) == consensus.PayToWitnessPubKeyHashDataSize
40 func IsP2WSHScript(prog []byte) bool {
41 insts, err := vm.ParseProgram(prog)
48 if insts[0].Op > vm.OP_16 {
51 return insts[1].Op == vm.OP_DATA_32 && len(insts[1].Data) == consensus.PayToWitnessScriptHashDataSize
54 func ConvertP2PKHSigProgram(prog []byte) ([]byte, error) {
55 insts, err := vm.ParseProgram(prog)
59 if insts[0].Op == vm.OP_0 {
60 return vmutil.P2PKHSigProgram(insts[1].Data)
62 return nil, errors.New("unknow P2PKH version number")
65 func ConvertP2SHProgram(prog []byte) ([]byte, error) {
66 insts, err := vm.ParseProgram(prog)
70 if insts[0].Op == vm.OP_0 {
71 return vmutil.P2SHProgram(insts[1].Data)
73 return nil, errors.New("unknow P2SHP version number")
76 func GetHashFromStandardProg(prog []byte) ([]byte, error) {
77 insts, err := vm.ParseProgram(prog)
82 return insts[1].Data, nil