OSDN Git Service

edit contract
[bytom/bytom.git] / consensus / bcrp / bcrp_test.go
1 package bcrp
2
3 import (
4         "encoding/hex"
5         "testing"
6 )
7
8 func TestIsBCRPScript(t *testing.T) {
9         tests := []struct {
10                 program  string
11                 expected bool
12         }{
13                 {
14                         program:  "",
15                         expected: false,
16                 },
17                 {
18                         program:  "ae20ac20f5cdb9ada2ae9836bcfff32126d6b885aa3f73ee111a95d1bf37f3904aca5151ad",
19                         expected: false,
20                 },
21                 {
22                         // not OP_FAIL
23                         program:  "69046263727001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
24                         expected: false,
25                 },
26                 {
27                         // not bcrp
28                         program:  "6a044243525001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
29                         expected: false,
30                 },
31                 {
32                         // not version 1
33                         program:  "6a046263727001022820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
34                         expected: false,
35                 },
36                 {
37                         // p2wpkh script
38                         program:  "001437e1aec83a4e6587ca9609e4e5aa728db7007449",
39                         expected: false,
40                 },
41                 {
42                         // p2wsh script
43                         program:  "00200824e931fb806bd77fdcd291aad3bd0a4493443a4120062bd659e64a3e0bac66",
44                         expected: false,
45                 },
46                 {
47                         // len(contract) == 0
48                         program:  "6a046263727001016a",
49                         expected: false,
50                 },
51                 {
52                         // len(contract) == 1
53                         program:  "6a04626372700101016a",
54                         expected: true,
55                 },
56                 {
57                         // 1 < len(contract) < 75
58                         program:  "6a046263727001012820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
59                         expected: true,
60                 },
61                 {
62                         // len(contract) == 75
63                         program:  "6a046263727001014b20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
64                         expected: true,
65                 },
66                 {
67                         // 75 < len(contract) < 256
68                         program:  "6a046263727001014c9620e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
69                         expected: true,
70                 },
71                 {
72                         // len(contract) == 256
73                         program:  "6a046263727001014d000120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e",
74                         expected: true,
75                 },
76                 {
77                         // len(contract) > 256
78                         program:  "6a046263727001014d2c0120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
79                         expected: true,
80                 },
81         }
82
83         for i, test := range tests {
84                 program, err := hex.DecodeString(test.program)
85                 if err != nil {
86                         t.Fatal(err)
87                 }
88
89                 expected := IsBCRPScript(program)
90                 if expected != test.expected {
91                         t.Errorf("TestIsTemplateRegister #%d failed: got %v want %v", i, expected, test.expected)
92                 }
93         }
94 }
95
96 func TestIsCallContractScript(t *testing.T) {
97         tests := []struct {
98                 program  string
99                 expected bool
100         }{
101                 {
102                         program:  "",
103                         expected: false,
104                 },
105                 {
106                         program:  "6a4c04626372704c01014c2820e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c0",
107                         expected: false,
108                 },
109                 {
110                         program:  "00204e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
111                         expected: false,
112                 },
113                 {
114                         program:  "51204e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
115                         expected: false,
116                 },
117                 {
118                         // p2wpkh script
119                         program:  "001437e1aec83a4e6587ca9609e4e5aa728db7007449",
120                         expected: false,
121                 },
122                 {
123                         // p2wsh script
124                         program:  "00200824e931fb806bd77fdcd291aad3bd0a4493443a4120062bd659e64a3e0bac66",
125                         expected: false,
126                 },
127                 {
128                         program:  "0462637270204e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
129                         expected: true,
130                 },
131         }
132
133         for i, test := range tests {
134                 program, err := hex.DecodeString(test.program)
135                 if err != nil {
136                         t.Fatal(err)
137                 }
138
139                 expected := IsCallContractScript(program)
140                 if expected != test.expected {
141                         t.Errorf("TestIsCallContractScript #%d failed: got %v want %v", i, expected, test.expected)
142                 }
143         }
144 }
145
146 func TestParseContract(t *testing.T) {
147         tests := []struct {
148                 program  string
149                 expected string
150         }{
151                 {
152                         // BCRP script format: OP_FAIL + OP_DATA_4 + "bcrp" + OP_DATA_1 + "1" + {{dynamic_op}} + contract
153                         program:  "6a04626372700101100164740a52797b937b788791698700c0",
154                         expected: "0164740a52797b937b788791698700c0",
155                 },
156                 {
157                         // BCRP script format: OP_FAIL + OP_DATA_4 + "bcrp" + OP_DATA_1 + "1" + {{dynamic_op}} + contract
158                         program:  "6a046263727001014d2c0120e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
159                         expected: "20e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e78740320e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403ae7cac00c020e9108d3ca8049800727f6a3505b3a2710dc579405dde03c250f16d9a7e1e6e787403",
160                 },
161         }
162
163         for i, test := range tests {
164                 program, err := hex.DecodeString(test.program)
165                 if err != nil {
166                         t.Fatal(err)
167                 }
168
169                 contract, err := ParseContract(program)
170                 if err != nil {
171                         t.Fatal(err)
172                 }
173
174                 expected := hex.EncodeToString(contract[:])
175                 if expected != test.expected {
176                         t.Errorf("TestParseContract #%d failed: got %v want %v", i, expected, test.expected)
177                 }
178         }
179 }
180
181 func TestParseContractHash(t *testing.T) {
182         tests := []struct {
183                 program  string
184                 expected string
185         }{
186                 {
187                         // call contract script format: OP_DATA_4 + "bcrp"+ OP_DATA_32 + SHA3-256(contract)
188                         program:  "0462637270204e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
189                         expected: "4e4f02d43bf50171f7f25d046b7f016002da410fc00d2e8902e7b170c98cf946",
190                 },
191         }
192
193         for i, test := range tests {
194                 program, err := hex.DecodeString(test.program)
195                 if err != nil {
196                         t.Fatal(err)
197                 }
198
199                 hash, err := ParseContractHash(program)
200                 if err != nil {
201                         t.Fatal(err)
202                 }
203
204                 expected := hex.EncodeToString(hash[:])
205                 if expected != test.expected {
206                         t.Errorf("TestParseContractHash #%d failed: got %v want %v", i, expected, test.expected)
207                 }
208         }
209 }