OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / btcsuite / btcd / txscript / opcode.go
1 // Copyright (c) 2013-2017 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
4
5 package txscript
6
7 import (
8         "bytes"
9         "crypto/sha1"
10         "crypto/sha256"
11         "encoding/binary"
12         "fmt"
13         "hash"
14
15         "golang.org/x/crypto/ripemd160"
16
17         "github.com/btcsuite/btcd/btcec"
18         "github.com/btcsuite/btcd/chaincfg/chainhash"
19         "github.com/btcsuite/btcd/wire"
20 )
21
22 // An opcode defines the information related to a txscript opcode.  opfunc, if
23 // present, is the function to call to perform the opcode on the script.  The
24 // current script is passed in as a slice with the first member being the opcode
25 // itself.
26 type opcode struct {
27         value  byte
28         name   string
29         length int
30         opfunc func(*parsedOpcode, *Engine) error
31 }
32
33 // These constants are the values of the official opcodes used on the btc wiki,
34 // in bitcoin core and in most if not all other references and software related
35 // to handling BTC scripts.
36 const (
37         OP_0                   = 0x00 // 0
38         OP_FALSE               = 0x00 // 0 - AKA OP_0
39         OP_DATA_1              = 0x01 // 1
40         OP_DATA_2              = 0x02 // 2
41         OP_DATA_3              = 0x03 // 3
42         OP_DATA_4              = 0x04 // 4
43         OP_DATA_5              = 0x05 // 5
44         OP_DATA_6              = 0x06 // 6
45         OP_DATA_7              = 0x07 // 7
46         OP_DATA_8              = 0x08 // 8
47         OP_DATA_9              = 0x09 // 9
48         OP_DATA_10             = 0x0a // 10
49         OP_DATA_11             = 0x0b // 11
50         OP_DATA_12             = 0x0c // 12
51         OP_DATA_13             = 0x0d // 13
52         OP_DATA_14             = 0x0e // 14
53         OP_DATA_15             = 0x0f // 15
54         OP_DATA_16             = 0x10 // 16
55         OP_DATA_17             = 0x11 // 17
56         OP_DATA_18             = 0x12 // 18
57         OP_DATA_19             = 0x13 // 19
58         OP_DATA_20             = 0x14 // 20
59         OP_DATA_21             = 0x15 // 21
60         OP_DATA_22             = 0x16 // 22
61         OP_DATA_23             = 0x17 // 23
62         OP_DATA_24             = 0x18 // 24
63         OP_DATA_25             = 0x19 // 25
64         OP_DATA_26             = 0x1a // 26
65         OP_DATA_27             = 0x1b // 27
66         OP_DATA_28             = 0x1c // 28
67         OP_DATA_29             = 0x1d // 29
68         OP_DATA_30             = 0x1e // 30
69         OP_DATA_31             = 0x1f // 31
70         OP_DATA_32             = 0x20 // 32
71         OP_DATA_33             = 0x21 // 33
72         OP_DATA_34             = 0x22 // 34
73         OP_DATA_35             = 0x23 // 35
74         OP_DATA_36             = 0x24 // 36
75         OP_DATA_37             = 0x25 // 37
76         OP_DATA_38             = 0x26 // 38
77         OP_DATA_39             = 0x27 // 39
78         OP_DATA_40             = 0x28 // 40
79         OP_DATA_41             = 0x29 // 41
80         OP_DATA_42             = 0x2a // 42
81         OP_DATA_43             = 0x2b // 43
82         OP_DATA_44             = 0x2c // 44
83         OP_DATA_45             = 0x2d // 45
84         OP_DATA_46             = 0x2e // 46
85         OP_DATA_47             = 0x2f // 47
86         OP_DATA_48             = 0x30 // 48
87         OP_DATA_49             = 0x31 // 49
88         OP_DATA_50             = 0x32 // 50
89         OP_DATA_51             = 0x33 // 51
90         OP_DATA_52             = 0x34 // 52
91         OP_DATA_53             = 0x35 // 53
92         OP_DATA_54             = 0x36 // 54
93         OP_DATA_55             = 0x37 // 55
94         OP_DATA_56             = 0x38 // 56
95         OP_DATA_57             = 0x39 // 57
96         OP_DATA_58             = 0x3a // 58
97         OP_DATA_59             = 0x3b // 59
98         OP_DATA_60             = 0x3c // 60
99         OP_DATA_61             = 0x3d // 61
100         OP_DATA_62             = 0x3e // 62
101         OP_DATA_63             = 0x3f // 63
102         OP_DATA_64             = 0x40 // 64
103         OP_DATA_65             = 0x41 // 65
104         OP_DATA_66             = 0x42 // 66
105         OP_DATA_67             = 0x43 // 67
106         OP_DATA_68             = 0x44 // 68
107         OP_DATA_69             = 0x45 // 69
108         OP_DATA_70             = 0x46 // 70
109         OP_DATA_71             = 0x47 // 71
110         OP_DATA_72             = 0x48 // 72
111         OP_DATA_73             = 0x49 // 73
112         OP_DATA_74             = 0x4a // 74
113         OP_DATA_75             = 0x4b // 75
114         OP_PUSHDATA1           = 0x4c // 76
115         OP_PUSHDATA2           = 0x4d // 77
116         OP_PUSHDATA4           = 0x4e // 78
117         OP_1NEGATE             = 0x4f // 79
118         OP_RESERVED            = 0x50 // 80
119         OP_1                   = 0x51 // 81 - AKA OP_TRUE
120         OP_TRUE                = 0x51 // 81
121         OP_2                   = 0x52 // 82
122         OP_3                   = 0x53 // 83
123         OP_4                   = 0x54 // 84
124         OP_5                   = 0x55 // 85
125         OP_6                   = 0x56 // 86
126         OP_7                   = 0x57 // 87
127         OP_8                   = 0x58 // 88
128         OP_9                   = 0x59 // 89
129         OP_10                  = 0x5a // 90
130         OP_11                  = 0x5b // 91
131         OP_12                  = 0x5c // 92
132         OP_13                  = 0x5d // 93
133         OP_14                  = 0x5e // 94
134         OP_15                  = 0x5f // 95
135         OP_16                  = 0x60 // 96
136         OP_NOP                 = 0x61 // 97
137         OP_VER                 = 0x62 // 98
138         OP_IF                  = 0x63 // 99
139         OP_NOTIF               = 0x64 // 100
140         OP_VERIF               = 0x65 // 101
141         OP_VERNOTIF            = 0x66 // 102
142         OP_ELSE                = 0x67 // 103
143         OP_ENDIF               = 0x68 // 104
144         OP_VERIFY              = 0x69 // 105
145         OP_RETURN              = 0x6a // 106
146         OP_TOALTSTACK          = 0x6b // 107
147         OP_FROMALTSTACK        = 0x6c // 108
148         OP_2DROP               = 0x6d // 109
149         OP_2DUP                = 0x6e // 110
150         OP_3DUP                = 0x6f // 111
151         OP_2OVER               = 0x70 // 112
152         OP_2ROT                = 0x71 // 113
153         OP_2SWAP               = 0x72 // 114
154         OP_IFDUP               = 0x73 // 115
155         OP_DEPTH               = 0x74 // 116
156         OP_DROP                = 0x75 // 117
157         OP_DUP                 = 0x76 // 118
158         OP_NIP                 = 0x77 // 119
159         OP_OVER                = 0x78 // 120
160         OP_PICK                = 0x79 // 121
161         OP_ROLL                = 0x7a // 122
162         OP_ROT                 = 0x7b // 123
163         OP_SWAP                = 0x7c // 124
164         OP_TUCK                = 0x7d // 125
165         OP_CAT                 = 0x7e // 126
166         OP_SUBSTR              = 0x7f // 127
167         OP_LEFT                = 0x80 // 128
168         OP_RIGHT               = 0x81 // 129
169         OP_SIZE                = 0x82 // 130
170         OP_INVERT              = 0x83 // 131
171         OP_AND                 = 0x84 // 132
172         OP_OR                  = 0x85 // 133
173         OP_XOR                 = 0x86 // 134
174         OP_EQUAL               = 0x87 // 135
175         OP_EQUALVERIFY         = 0x88 // 136
176         OP_RESERVED1           = 0x89 // 137
177         OP_RESERVED2           = 0x8a // 138
178         OP_1ADD                = 0x8b // 139
179         OP_1SUB                = 0x8c // 140
180         OP_2MUL                = 0x8d // 141
181         OP_2DIV                = 0x8e // 142
182         OP_NEGATE              = 0x8f // 143
183         OP_ABS                 = 0x90 // 144
184         OP_NOT                 = 0x91 // 145
185         OP_0NOTEQUAL           = 0x92 // 146
186         OP_ADD                 = 0x93 // 147
187         OP_SUB                 = 0x94 // 148
188         OP_MUL                 = 0x95 // 149
189         OP_DIV                 = 0x96 // 150
190         OP_MOD                 = 0x97 // 151
191         OP_LSHIFT              = 0x98 // 152
192         OP_RSHIFT              = 0x99 // 153
193         OP_BOOLAND             = 0x9a // 154
194         OP_BOOLOR              = 0x9b // 155
195         OP_NUMEQUAL            = 0x9c // 156
196         OP_NUMEQUALVERIFY      = 0x9d // 157
197         OP_NUMNOTEQUAL         = 0x9e // 158
198         OP_LESSTHAN            = 0x9f // 159
199         OP_GREATERTHAN         = 0xa0 // 160
200         OP_LESSTHANOREQUAL     = 0xa1 // 161
201         OP_GREATERTHANOREQUAL  = 0xa2 // 162
202         OP_MIN                 = 0xa3 // 163
203         OP_MAX                 = 0xa4 // 164
204         OP_WITHIN              = 0xa5 // 165
205         OP_RIPEMD160           = 0xa6 // 166
206         OP_SHA1                = 0xa7 // 167
207         OP_SHA256              = 0xa8 // 168
208         OP_HASH160             = 0xa9 // 169
209         OP_HASH256             = 0xaa // 170
210         OP_CODESEPARATOR       = 0xab // 171
211         OP_CHECKSIG            = 0xac // 172
212         OP_CHECKSIGVERIFY      = 0xad // 173
213         OP_CHECKMULTISIG       = 0xae // 174
214         OP_CHECKMULTISIGVERIFY = 0xaf // 175
215         OP_NOP1                = 0xb0 // 176
216         OP_NOP2                = 0xb1 // 177
217         OP_CHECKLOCKTIMEVERIFY = 0xb1 // 177 - AKA OP_NOP2
218         OP_NOP3                = 0xb2 // 178
219         OP_CHECKSEQUENCEVERIFY = 0xb2 // 178 - AKA OP_NOP3
220         OP_NOP4                = 0xb3 // 179
221         OP_NOP5                = 0xb4 // 180
222         OP_NOP6                = 0xb5 // 181
223         OP_NOP7                = 0xb6 // 182
224         OP_NOP8                = 0xb7 // 183
225         OP_NOP9                = 0xb8 // 184
226         OP_NOP10               = 0xb9 // 185
227         OP_UNKNOWN186          = 0xba // 186
228         OP_UNKNOWN187          = 0xbb // 187
229         OP_UNKNOWN188          = 0xbc // 188
230         OP_UNKNOWN189          = 0xbd // 189
231         OP_UNKNOWN190          = 0xbe // 190
232         OP_UNKNOWN191          = 0xbf // 191
233         OP_UNKNOWN192          = 0xc0 // 192
234         OP_UNKNOWN193          = 0xc1 // 193
235         OP_UNKNOWN194          = 0xc2 // 194
236         OP_UNKNOWN195          = 0xc3 // 195
237         OP_UNKNOWN196          = 0xc4 // 196
238         OP_UNKNOWN197          = 0xc5 // 197
239         OP_UNKNOWN198          = 0xc6 // 198
240         OP_UNKNOWN199          = 0xc7 // 199
241         OP_UNKNOWN200          = 0xc8 // 200
242         OP_UNKNOWN201          = 0xc9 // 201
243         OP_UNKNOWN202          = 0xca // 202
244         OP_UNKNOWN203          = 0xcb // 203
245         OP_UNKNOWN204          = 0xcc // 204
246         OP_UNKNOWN205          = 0xcd // 205
247         OP_UNKNOWN206          = 0xce // 206
248         OP_UNKNOWN207          = 0xcf // 207
249         OP_UNKNOWN208          = 0xd0 // 208
250         OP_UNKNOWN209          = 0xd1 // 209
251         OP_UNKNOWN210          = 0xd2 // 210
252         OP_UNKNOWN211          = 0xd3 // 211
253         OP_UNKNOWN212          = 0xd4 // 212
254         OP_UNKNOWN213          = 0xd5 // 213
255         OP_UNKNOWN214          = 0xd6 // 214
256         OP_UNKNOWN215          = 0xd7 // 215
257         OP_UNKNOWN216          = 0xd8 // 216
258         OP_UNKNOWN217          = 0xd9 // 217
259         OP_UNKNOWN218          = 0xda // 218
260         OP_UNKNOWN219          = 0xdb // 219
261         OP_UNKNOWN220          = 0xdc // 220
262         OP_UNKNOWN221          = 0xdd // 221
263         OP_UNKNOWN222          = 0xde // 222
264         OP_UNKNOWN223          = 0xdf // 223
265         OP_UNKNOWN224          = 0xe0 // 224
266         OP_UNKNOWN225          = 0xe1 // 225
267         OP_UNKNOWN226          = 0xe2 // 226
268         OP_UNKNOWN227          = 0xe3 // 227
269         OP_UNKNOWN228          = 0xe4 // 228
270         OP_UNKNOWN229          = 0xe5 // 229
271         OP_UNKNOWN230          = 0xe6 // 230
272         OP_UNKNOWN231          = 0xe7 // 231
273         OP_UNKNOWN232          = 0xe8 // 232
274         OP_UNKNOWN233          = 0xe9 // 233
275         OP_UNKNOWN234          = 0xea // 234
276         OP_UNKNOWN235          = 0xeb // 235
277         OP_UNKNOWN236          = 0xec // 236
278         OP_UNKNOWN237          = 0xed // 237
279         OP_UNKNOWN238          = 0xee // 238
280         OP_UNKNOWN239          = 0xef // 239
281         OP_UNKNOWN240          = 0xf0 // 240
282         OP_UNKNOWN241          = 0xf1 // 241
283         OP_UNKNOWN242          = 0xf2 // 242
284         OP_UNKNOWN243          = 0xf3 // 243
285         OP_UNKNOWN244          = 0xf4 // 244
286         OP_UNKNOWN245          = 0xf5 // 245
287         OP_UNKNOWN246          = 0xf6 // 246
288         OP_UNKNOWN247          = 0xf7 // 247
289         OP_UNKNOWN248          = 0xf8 // 248
290         OP_UNKNOWN249          = 0xf9 // 249
291         OP_SMALLINTEGER        = 0xfa // 250 - bitcoin core internal
292         OP_PUBKEYS             = 0xfb // 251 - bitcoin core internal
293         OP_UNKNOWN252          = 0xfc // 252
294         OP_PUBKEYHASH          = 0xfd // 253 - bitcoin core internal
295         OP_PUBKEY              = 0xfe // 254 - bitcoin core internal
296         OP_INVALIDOPCODE       = 0xff // 255 - bitcoin core internal
297 )
298
299 // Conditional execution constants.
300 const (
301         OpCondFalse = 0
302         OpCondTrue  = 1
303         OpCondSkip  = 2
304 )
305
306 // opcodeArray holds details about all possible opcodes such as how many bytes
307 // the opcode and any associated data should take, its human-readable name, and
308 // the handler function.
309 var opcodeArray = [256]opcode{
310         // Data push opcodes.
311         OP_FALSE:     {OP_FALSE, "OP_0", 1, opcodeFalse},
312         OP_DATA_1:    {OP_DATA_1, "OP_DATA_1", 2, opcodePushData},
313         OP_DATA_2:    {OP_DATA_2, "OP_DATA_2", 3, opcodePushData},
314         OP_DATA_3:    {OP_DATA_3, "OP_DATA_3", 4, opcodePushData},
315         OP_DATA_4:    {OP_DATA_4, "OP_DATA_4", 5, opcodePushData},
316         OP_DATA_5:    {OP_DATA_5, "OP_DATA_5", 6, opcodePushData},
317         OP_DATA_6:    {OP_DATA_6, "OP_DATA_6", 7, opcodePushData},
318         OP_DATA_7:    {OP_DATA_7, "OP_DATA_7", 8, opcodePushData},
319         OP_DATA_8:    {OP_DATA_8, "OP_DATA_8", 9, opcodePushData},
320         OP_DATA_9:    {OP_DATA_9, "OP_DATA_9", 10, opcodePushData},
321         OP_DATA_10:   {OP_DATA_10, "OP_DATA_10", 11, opcodePushData},
322         OP_DATA_11:   {OP_DATA_11, "OP_DATA_11", 12, opcodePushData},
323         OP_DATA_12:   {OP_DATA_12, "OP_DATA_12", 13, opcodePushData},
324         OP_DATA_13:   {OP_DATA_13, "OP_DATA_13", 14, opcodePushData},
325         OP_DATA_14:   {OP_DATA_14, "OP_DATA_14", 15, opcodePushData},
326         OP_DATA_15:   {OP_DATA_15, "OP_DATA_15", 16, opcodePushData},
327         OP_DATA_16:   {OP_DATA_16, "OP_DATA_16", 17, opcodePushData},
328         OP_DATA_17:   {OP_DATA_17, "OP_DATA_17", 18, opcodePushData},
329         OP_DATA_18:   {OP_DATA_18, "OP_DATA_18", 19, opcodePushData},
330         OP_DATA_19:   {OP_DATA_19, "OP_DATA_19", 20, opcodePushData},
331         OP_DATA_20:   {OP_DATA_20, "OP_DATA_20", 21, opcodePushData},
332         OP_DATA_21:   {OP_DATA_21, "OP_DATA_21", 22, opcodePushData},
333         OP_DATA_22:   {OP_DATA_22, "OP_DATA_22", 23, opcodePushData},
334         OP_DATA_23:   {OP_DATA_23, "OP_DATA_23", 24, opcodePushData},
335         OP_DATA_24:   {OP_DATA_24, "OP_DATA_24", 25, opcodePushData},
336         OP_DATA_25:   {OP_DATA_25, "OP_DATA_25", 26, opcodePushData},
337         OP_DATA_26:   {OP_DATA_26, "OP_DATA_26", 27, opcodePushData},
338         OP_DATA_27:   {OP_DATA_27, "OP_DATA_27", 28, opcodePushData},
339         OP_DATA_28:   {OP_DATA_28, "OP_DATA_28", 29, opcodePushData},
340         OP_DATA_29:   {OP_DATA_29, "OP_DATA_29", 30, opcodePushData},
341         OP_DATA_30:   {OP_DATA_30, "OP_DATA_30", 31, opcodePushData},
342         OP_DATA_31:   {OP_DATA_31, "OP_DATA_31", 32, opcodePushData},
343         OP_DATA_32:   {OP_DATA_32, "OP_DATA_32", 33, opcodePushData},
344         OP_DATA_33:   {OP_DATA_33, "OP_DATA_33", 34, opcodePushData},
345         OP_DATA_34:   {OP_DATA_34, "OP_DATA_34", 35, opcodePushData},
346         OP_DATA_35:   {OP_DATA_35, "OP_DATA_35", 36, opcodePushData},
347         OP_DATA_36:   {OP_DATA_36, "OP_DATA_36", 37, opcodePushData},
348         OP_DATA_37:   {OP_DATA_37, "OP_DATA_37", 38, opcodePushData},
349         OP_DATA_38:   {OP_DATA_38, "OP_DATA_38", 39, opcodePushData},
350         OP_DATA_39:   {OP_DATA_39, "OP_DATA_39", 40, opcodePushData},
351         OP_DATA_40:   {OP_DATA_40, "OP_DATA_40", 41, opcodePushData},
352         OP_DATA_41:   {OP_DATA_41, "OP_DATA_41", 42, opcodePushData},
353         OP_DATA_42:   {OP_DATA_42, "OP_DATA_42", 43, opcodePushData},
354         OP_DATA_43:   {OP_DATA_43, "OP_DATA_43", 44, opcodePushData},
355         OP_DATA_44:   {OP_DATA_44, "OP_DATA_44", 45, opcodePushData},
356         OP_DATA_45:   {OP_DATA_45, "OP_DATA_45", 46, opcodePushData},
357         OP_DATA_46:   {OP_DATA_46, "OP_DATA_46", 47, opcodePushData},
358         OP_DATA_47:   {OP_DATA_47, "OP_DATA_47", 48, opcodePushData},
359         OP_DATA_48:   {OP_DATA_48, "OP_DATA_48", 49, opcodePushData},
360         OP_DATA_49:   {OP_DATA_49, "OP_DATA_49", 50, opcodePushData},
361         OP_DATA_50:   {OP_DATA_50, "OP_DATA_50", 51, opcodePushData},
362         OP_DATA_51:   {OP_DATA_51, "OP_DATA_51", 52, opcodePushData},
363         OP_DATA_52:   {OP_DATA_52, "OP_DATA_52", 53, opcodePushData},
364         OP_DATA_53:   {OP_DATA_53, "OP_DATA_53", 54, opcodePushData},
365         OP_DATA_54:   {OP_DATA_54, "OP_DATA_54", 55, opcodePushData},
366         OP_DATA_55:   {OP_DATA_55, "OP_DATA_55", 56, opcodePushData},
367         OP_DATA_56:   {OP_DATA_56, "OP_DATA_56", 57, opcodePushData},
368         OP_DATA_57:   {OP_DATA_57, "OP_DATA_57", 58, opcodePushData},
369         OP_DATA_58:   {OP_DATA_58, "OP_DATA_58", 59, opcodePushData},
370         OP_DATA_59:   {OP_DATA_59, "OP_DATA_59", 60, opcodePushData},
371         OP_DATA_60:   {OP_DATA_60, "OP_DATA_60", 61, opcodePushData},
372         OP_DATA_61:   {OP_DATA_61, "OP_DATA_61", 62, opcodePushData},
373         OP_DATA_62:   {OP_DATA_62, "OP_DATA_62", 63, opcodePushData},
374         OP_DATA_63:   {OP_DATA_63, "OP_DATA_63", 64, opcodePushData},
375         OP_DATA_64:   {OP_DATA_64, "OP_DATA_64", 65, opcodePushData},
376         OP_DATA_65:   {OP_DATA_65, "OP_DATA_65", 66, opcodePushData},
377         OP_DATA_66:   {OP_DATA_66, "OP_DATA_66", 67, opcodePushData},
378         OP_DATA_67:   {OP_DATA_67, "OP_DATA_67", 68, opcodePushData},
379         OP_DATA_68:   {OP_DATA_68, "OP_DATA_68", 69, opcodePushData},
380         OP_DATA_69:   {OP_DATA_69, "OP_DATA_69", 70, opcodePushData},
381         OP_DATA_70:   {OP_DATA_70, "OP_DATA_70", 71, opcodePushData},
382         OP_DATA_71:   {OP_DATA_71, "OP_DATA_71", 72, opcodePushData},
383         OP_DATA_72:   {OP_DATA_72, "OP_DATA_72", 73, opcodePushData},
384         OP_DATA_73:   {OP_DATA_73, "OP_DATA_73", 74, opcodePushData},
385         OP_DATA_74:   {OP_DATA_74, "OP_DATA_74", 75, opcodePushData},
386         OP_DATA_75:   {OP_DATA_75, "OP_DATA_75", 76, opcodePushData},
387         OP_PUSHDATA1: {OP_PUSHDATA1, "OP_PUSHDATA1", -1, opcodePushData},
388         OP_PUSHDATA2: {OP_PUSHDATA2, "OP_PUSHDATA2", -2, opcodePushData},
389         OP_PUSHDATA4: {OP_PUSHDATA4, "OP_PUSHDATA4", -4, opcodePushData},
390         OP_1NEGATE:   {OP_1NEGATE, "OP_1NEGATE", 1, opcode1Negate},
391         OP_RESERVED:  {OP_RESERVED, "OP_RESERVED", 1, opcodeReserved},
392         OP_TRUE:      {OP_TRUE, "OP_1", 1, opcodeN},
393         OP_2:         {OP_2, "OP_2", 1, opcodeN},
394         OP_3:         {OP_3, "OP_3", 1, opcodeN},
395         OP_4:         {OP_4, "OP_4", 1, opcodeN},
396         OP_5:         {OP_5, "OP_5", 1, opcodeN},
397         OP_6:         {OP_6, "OP_6", 1, opcodeN},
398         OP_7:         {OP_7, "OP_7", 1, opcodeN},
399         OP_8:         {OP_8, "OP_8", 1, opcodeN},
400         OP_9:         {OP_9, "OP_9", 1, opcodeN},
401         OP_10:        {OP_10, "OP_10", 1, opcodeN},
402         OP_11:        {OP_11, "OP_11", 1, opcodeN},
403         OP_12:        {OP_12, "OP_12", 1, opcodeN},
404         OP_13:        {OP_13, "OP_13", 1, opcodeN},
405         OP_14:        {OP_14, "OP_14", 1, opcodeN},
406         OP_15:        {OP_15, "OP_15", 1, opcodeN},
407         OP_16:        {OP_16, "OP_16", 1, opcodeN},
408
409         // Control opcodes.
410         OP_NOP:                 {OP_NOP, "OP_NOP", 1, opcodeNop},
411         OP_VER:                 {OP_VER, "OP_VER", 1, opcodeReserved},
412         OP_IF:                  {OP_IF, "OP_IF", 1, opcodeIf},
413         OP_NOTIF:               {OP_NOTIF, "OP_NOTIF", 1, opcodeNotIf},
414         OP_VERIF:               {OP_VERIF, "OP_VERIF", 1, opcodeReserved},
415         OP_VERNOTIF:            {OP_VERNOTIF, "OP_VERNOTIF", 1, opcodeReserved},
416         OP_ELSE:                {OP_ELSE, "OP_ELSE", 1, opcodeElse},
417         OP_ENDIF:               {OP_ENDIF, "OP_ENDIF", 1, opcodeEndif},
418         OP_VERIFY:              {OP_VERIFY, "OP_VERIFY", 1, opcodeVerify},
419         OP_RETURN:              {OP_RETURN, "OP_RETURN", 1, opcodeReturn},
420         OP_CHECKLOCKTIMEVERIFY: {OP_CHECKLOCKTIMEVERIFY, "OP_CHECKLOCKTIMEVERIFY", 1, opcodeCheckLockTimeVerify},
421         OP_CHECKSEQUENCEVERIFY: {OP_CHECKSEQUENCEVERIFY, "OP_CHECKSEQUENCEVERIFY", 1, opcodeCheckSequenceVerify},
422
423         // Stack opcodes.
424         OP_TOALTSTACK:   {OP_TOALTSTACK, "OP_TOALTSTACK", 1, opcodeToAltStack},
425         OP_FROMALTSTACK: {OP_FROMALTSTACK, "OP_FROMALTSTACK", 1, opcodeFromAltStack},
426         OP_2DROP:        {OP_2DROP, "OP_2DROP", 1, opcode2Drop},
427         OP_2DUP:         {OP_2DUP, "OP_2DUP", 1, opcode2Dup},
428         OP_3DUP:         {OP_3DUP, "OP_3DUP", 1, opcode3Dup},
429         OP_2OVER:        {OP_2OVER, "OP_2OVER", 1, opcode2Over},
430         OP_2ROT:         {OP_2ROT, "OP_2ROT", 1, opcode2Rot},
431         OP_2SWAP:        {OP_2SWAP, "OP_2SWAP", 1, opcode2Swap},
432         OP_IFDUP:        {OP_IFDUP, "OP_IFDUP", 1, opcodeIfDup},
433         OP_DEPTH:        {OP_DEPTH, "OP_DEPTH", 1, opcodeDepth},
434         OP_DROP:         {OP_DROP, "OP_DROP", 1, opcodeDrop},
435         OP_DUP:          {OP_DUP, "OP_DUP", 1, opcodeDup},
436         OP_NIP:          {OP_NIP, "OP_NIP", 1, opcodeNip},
437         OP_OVER:         {OP_OVER, "OP_OVER", 1, opcodeOver},
438         OP_PICK:         {OP_PICK, "OP_PICK", 1, opcodePick},
439         OP_ROLL:         {OP_ROLL, "OP_ROLL", 1, opcodeRoll},
440         OP_ROT:          {OP_ROT, "OP_ROT", 1, opcodeRot},
441         OP_SWAP:         {OP_SWAP, "OP_SWAP", 1, opcodeSwap},
442         OP_TUCK:         {OP_TUCK, "OP_TUCK", 1, opcodeTuck},
443
444         // Splice opcodes.
445         OP_CAT:    {OP_CAT, "OP_CAT", 1, opcodeDisabled},
446         OP_SUBSTR: {OP_SUBSTR, "OP_SUBSTR", 1, opcodeDisabled},
447         OP_LEFT:   {OP_LEFT, "OP_LEFT", 1, opcodeDisabled},
448         OP_RIGHT:  {OP_RIGHT, "OP_RIGHT", 1, opcodeDisabled},
449         OP_SIZE:   {OP_SIZE, "OP_SIZE", 1, opcodeSize},
450
451         // Bitwise logic opcodes.
452         OP_INVERT:      {OP_INVERT, "OP_INVERT", 1, opcodeDisabled},
453         OP_AND:         {OP_AND, "OP_AND", 1, opcodeDisabled},
454         OP_OR:          {OP_OR, "OP_OR", 1, opcodeDisabled},
455         OP_XOR:         {OP_XOR, "OP_XOR", 1, opcodeDisabled},
456         OP_EQUAL:       {OP_EQUAL, "OP_EQUAL", 1, opcodeEqual},
457         OP_EQUALVERIFY: {OP_EQUALVERIFY, "OP_EQUALVERIFY", 1, opcodeEqualVerify},
458         OP_RESERVED1:   {OP_RESERVED1, "OP_RESERVED1", 1, opcodeReserved},
459         OP_RESERVED2:   {OP_RESERVED2, "OP_RESERVED2", 1, opcodeReserved},
460
461         // Numeric related opcodes.
462         OP_1ADD:               {OP_1ADD, "OP_1ADD", 1, opcode1Add},
463         OP_1SUB:               {OP_1SUB, "OP_1SUB", 1, opcode1Sub},
464         OP_2MUL:               {OP_2MUL, "OP_2MUL", 1, opcodeDisabled},
465         OP_2DIV:               {OP_2DIV, "OP_2DIV", 1, opcodeDisabled},
466         OP_NEGATE:             {OP_NEGATE, "OP_NEGATE", 1, opcodeNegate},
467         OP_ABS:                {OP_ABS, "OP_ABS", 1, opcodeAbs},
468         OP_NOT:                {OP_NOT, "OP_NOT", 1, opcodeNot},
469         OP_0NOTEQUAL:          {OP_0NOTEQUAL, "OP_0NOTEQUAL", 1, opcode0NotEqual},
470         OP_ADD:                {OP_ADD, "OP_ADD", 1, opcodeAdd},
471         OP_SUB:                {OP_SUB, "OP_SUB", 1, opcodeSub},
472         OP_MUL:                {OP_MUL, "OP_MUL", 1, opcodeDisabled},
473         OP_DIV:                {OP_DIV, "OP_DIV", 1, opcodeDisabled},
474         OP_MOD:                {OP_MOD, "OP_MOD", 1, opcodeDisabled},
475         OP_LSHIFT:             {OP_LSHIFT, "OP_LSHIFT", 1, opcodeDisabled},
476         OP_RSHIFT:             {OP_RSHIFT, "OP_RSHIFT", 1, opcodeDisabled},
477         OP_BOOLAND:            {OP_BOOLAND, "OP_BOOLAND", 1, opcodeBoolAnd},
478         OP_BOOLOR:             {OP_BOOLOR, "OP_BOOLOR", 1, opcodeBoolOr},
479         OP_NUMEQUAL:           {OP_NUMEQUAL, "OP_NUMEQUAL", 1, opcodeNumEqual},
480         OP_NUMEQUALVERIFY:     {OP_NUMEQUALVERIFY, "OP_NUMEQUALVERIFY", 1, opcodeNumEqualVerify},
481         OP_NUMNOTEQUAL:        {OP_NUMNOTEQUAL, "OP_NUMNOTEQUAL", 1, opcodeNumNotEqual},
482         OP_LESSTHAN:           {OP_LESSTHAN, "OP_LESSTHAN", 1, opcodeLessThan},
483         OP_GREATERTHAN:        {OP_GREATERTHAN, "OP_GREATERTHAN", 1, opcodeGreaterThan},
484         OP_LESSTHANOREQUAL:    {OP_LESSTHANOREQUAL, "OP_LESSTHANOREQUAL", 1, opcodeLessThanOrEqual},
485         OP_GREATERTHANOREQUAL: {OP_GREATERTHANOREQUAL, "OP_GREATERTHANOREQUAL", 1, opcodeGreaterThanOrEqual},
486         OP_MIN:                {OP_MIN, "OP_MIN", 1, opcodeMin},
487         OP_MAX:                {OP_MAX, "OP_MAX", 1, opcodeMax},
488         OP_WITHIN:             {OP_WITHIN, "OP_WITHIN", 1, opcodeWithin},
489
490         // Crypto opcodes.
491         OP_RIPEMD160:           {OP_RIPEMD160, "OP_RIPEMD160", 1, opcodeRipemd160},
492         OP_SHA1:                {OP_SHA1, "OP_SHA1", 1, opcodeSha1},
493         OP_SHA256:              {OP_SHA256, "OP_SHA256", 1, opcodeSha256},
494         OP_HASH160:             {OP_HASH160, "OP_HASH160", 1, opcodeHash160},
495         OP_HASH256:             {OP_HASH256, "OP_HASH256", 1, opcodeHash256},
496         OP_CODESEPARATOR:       {OP_CODESEPARATOR, "OP_CODESEPARATOR", 1, opcodeCodeSeparator},
497         OP_CHECKSIG:            {OP_CHECKSIG, "OP_CHECKSIG", 1, opcodeCheckSig},
498         OP_CHECKSIGVERIFY:      {OP_CHECKSIGVERIFY, "OP_CHECKSIGVERIFY", 1, opcodeCheckSigVerify},
499         OP_CHECKMULTISIG:       {OP_CHECKMULTISIG, "OP_CHECKMULTISIG", 1, opcodeCheckMultiSig},
500         OP_CHECKMULTISIGVERIFY: {OP_CHECKMULTISIGVERIFY, "OP_CHECKMULTISIGVERIFY", 1, opcodeCheckMultiSigVerify},
501
502         // Reserved opcodes.
503         OP_NOP1:  {OP_NOP1, "OP_NOP1", 1, opcodeNop},
504         OP_NOP4:  {OP_NOP4, "OP_NOP4", 1, opcodeNop},
505         OP_NOP5:  {OP_NOP5, "OP_NOP5", 1, opcodeNop},
506         OP_NOP6:  {OP_NOP6, "OP_NOP6", 1, opcodeNop},
507         OP_NOP7:  {OP_NOP7, "OP_NOP7", 1, opcodeNop},
508         OP_NOP8:  {OP_NOP8, "OP_NOP8", 1, opcodeNop},
509         OP_NOP9:  {OP_NOP9, "OP_NOP9", 1, opcodeNop},
510         OP_NOP10: {OP_NOP10, "OP_NOP10", 1, opcodeNop},
511
512         // Undefined opcodes.
513         OP_UNKNOWN186: {OP_UNKNOWN186, "OP_UNKNOWN186", 1, opcodeInvalid},
514         OP_UNKNOWN187: {OP_UNKNOWN187, "OP_UNKNOWN187", 1, opcodeInvalid},
515         OP_UNKNOWN188: {OP_UNKNOWN188, "OP_UNKNOWN188", 1, opcodeInvalid},
516         OP_UNKNOWN189: {OP_UNKNOWN189, "OP_UNKNOWN189", 1, opcodeInvalid},
517         OP_UNKNOWN190: {OP_UNKNOWN190, "OP_UNKNOWN190", 1, opcodeInvalid},
518         OP_UNKNOWN191: {OP_UNKNOWN191, "OP_UNKNOWN191", 1, opcodeInvalid},
519         OP_UNKNOWN192: {OP_UNKNOWN192, "OP_UNKNOWN192", 1, opcodeInvalid},
520         OP_UNKNOWN193: {OP_UNKNOWN193, "OP_UNKNOWN193", 1, opcodeInvalid},
521         OP_UNKNOWN194: {OP_UNKNOWN194, "OP_UNKNOWN194", 1, opcodeInvalid},
522         OP_UNKNOWN195: {OP_UNKNOWN195, "OP_UNKNOWN195", 1, opcodeInvalid},
523         OP_UNKNOWN196: {OP_UNKNOWN196, "OP_UNKNOWN196", 1, opcodeInvalid},
524         OP_UNKNOWN197: {OP_UNKNOWN197, "OP_UNKNOWN197", 1, opcodeInvalid},
525         OP_UNKNOWN198: {OP_UNKNOWN198, "OP_UNKNOWN198", 1, opcodeInvalid},
526         OP_UNKNOWN199: {OP_UNKNOWN199, "OP_UNKNOWN199", 1, opcodeInvalid},
527         OP_UNKNOWN200: {OP_UNKNOWN200, "OP_UNKNOWN200", 1, opcodeInvalid},
528         OP_UNKNOWN201: {OP_UNKNOWN201, "OP_UNKNOWN201", 1, opcodeInvalid},
529         OP_UNKNOWN202: {OP_UNKNOWN202, "OP_UNKNOWN202", 1, opcodeInvalid},
530         OP_UNKNOWN203: {OP_UNKNOWN203, "OP_UNKNOWN203", 1, opcodeInvalid},
531         OP_UNKNOWN204: {OP_UNKNOWN204, "OP_UNKNOWN204", 1, opcodeInvalid},
532         OP_UNKNOWN205: {OP_UNKNOWN205, "OP_UNKNOWN205", 1, opcodeInvalid},
533         OP_UNKNOWN206: {OP_UNKNOWN206, "OP_UNKNOWN206", 1, opcodeInvalid},
534         OP_UNKNOWN207: {OP_UNKNOWN207, "OP_UNKNOWN207", 1, opcodeInvalid},
535         OP_UNKNOWN208: {OP_UNKNOWN208, "OP_UNKNOWN208", 1, opcodeInvalid},
536         OP_UNKNOWN209: {OP_UNKNOWN209, "OP_UNKNOWN209", 1, opcodeInvalid},
537         OP_UNKNOWN210: {OP_UNKNOWN210, "OP_UNKNOWN210", 1, opcodeInvalid},
538         OP_UNKNOWN211: {OP_UNKNOWN211, "OP_UNKNOWN211", 1, opcodeInvalid},
539         OP_UNKNOWN212: {OP_UNKNOWN212, "OP_UNKNOWN212", 1, opcodeInvalid},
540         OP_UNKNOWN213: {OP_UNKNOWN213, "OP_UNKNOWN213", 1, opcodeInvalid},
541         OP_UNKNOWN214: {OP_UNKNOWN214, "OP_UNKNOWN214", 1, opcodeInvalid},
542         OP_UNKNOWN215: {OP_UNKNOWN215, "OP_UNKNOWN215", 1, opcodeInvalid},
543         OP_UNKNOWN216: {OP_UNKNOWN216, "OP_UNKNOWN216", 1, opcodeInvalid},
544         OP_UNKNOWN217: {OP_UNKNOWN217, "OP_UNKNOWN217", 1, opcodeInvalid},
545         OP_UNKNOWN218: {OP_UNKNOWN218, "OP_UNKNOWN218", 1, opcodeInvalid},
546         OP_UNKNOWN219: {OP_UNKNOWN219, "OP_UNKNOWN219", 1, opcodeInvalid},
547         OP_UNKNOWN220: {OP_UNKNOWN220, "OP_UNKNOWN220", 1, opcodeInvalid},
548         OP_UNKNOWN221: {OP_UNKNOWN221, "OP_UNKNOWN221", 1, opcodeInvalid},
549         OP_UNKNOWN222: {OP_UNKNOWN222, "OP_UNKNOWN222", 1, opcodeInvalid},
550         OP_UNKNOWN223: {OP_UNKNOWN223, "OP_UNKNOWN223", 1, opcodeInvalid},
551         OP_UNKNOWN224: {OP_UNKNOWN224, "OP_UNKNOWN224", 1, opcodeInvalid},
552         OP_UNKNOWN225: {OP_UNKNOWN225, "OP_UNKNOWN225", 1, opcodeInvalid},
553         OP_UNKNOWN226: {OP_UNKNOWN226, "OP_UNKNOWN226", 1, opcodeInvalid},
554         OP_UNKNOWN227: {OP_UNKNOWN227, "OP_UNKNOWN227", 1, opcodeInvalid},
555         OP_UNKNOWN228: {OP_UNKNOWN228, "OP_UNKNOWN228", 1, opcodeInvalid},
556         OP_UNKNOWN229: {OP_UNKNOWN229, "OP_UNKNOWN229", 1, opcodeInvalid},
557         OP_UNKNOWN230: {OP_UNKNOWN230, "OP_UNKNOWN230", 1, opcodeInvalid},
558         OP_UNKNOWN231: {OP_UNKNOWN231, "OP_UNKNOWN231", 1, opcodeInvalid},
559         OP_UNKNOWN232: {OP_UNKNOWN232, "OP_UNKNOWN232", 1, opcodeInvalid},
560         OP_UNKNOWN233: {OP_UNKNOWN233, "OP_UNKNOWN233", 1, opcodeInvalid},
561         OP_UNKNOWN234: {OP_UNKNOWN234, "OP_UNKNOWN234", 1, opcodeInvalid},
562         OP_UNKNOWN235: {OP_UNKNOWN235, "OP_UNKNOWN235", 1, opcodeInvalid},
563         OP_UNKNOWN236: {OP_UNKNOWN236, "OP_UNKNOWN236", 1, opcodeInvalid},
564         OP_UNKNOWN237: {OP_UNKNOWN237, "OP_UNKNOWN237", 1, opcodeInvalid},
565         OP_UNKNOWN238: {OP_UNKNOWN238, "OP_UNKNOWN238", 1, opcodeInvalid},
566         OP_UNKNOWN239: {OP_UNKNOWN239, "OP_UNKNOWN239", 1, opcodeInvalid},
567         OP_UNKNOWN240: {OP_UNKNOWN240, "OP_UNKNOWN240", 1, opcodeInvalid},
568         OP_UNKNOWN241: {OP_UNKNOWN241, "OP_UNKNOWN241", 1, opcodeInvalid},
569         OP_UNKNOWN242: {OP_UNKNOWN242, "OP_UNKNOWN242", 1, opcodeInvalid},
570         OP_UNKNOWN243: {OP_UNKNOWN243, "OP_UNKNOWN243", 1, opcodeInvalid},
571         OP_UNKNOWN244: {OP_UNKNOWN244, "OP_UNKNOWN244", 1, opcodeInvalid},
572         OP_UNKNOWN245: {OP_UNKNOWN245, "OP_UNKNOWN245", 1, opcodeInvalid},
573         OP_UNKNOWN246: {OP_UNKNOWN246, "OP_UNKNOWN246", 1, opcodeInvalid},
574         OP_UNKNOWN247: {OP_UNKNOWN247, "OP_UNKNOWN247", 1, opcodeInvalid},
575         OP_UNKNOWN248: {OP_UNKNOWN248, "OP_UNKNOWN248", 1, opcodeInvalid},
576         OP_UNKNOWN249: {OP_UNKNOWN249, "OP_UNKNOWN249", 1, opcodeInvalid},
577
578         // Bitcoin Core internal use opcode.  Defined here for completeness.
579         OP_SMALLINTEGER: {OP_SMALLINTEGER, "OP_SMALLINTEGER", 1, opcodeInvalid},
580         OP_PUBKEYS:      {OP_PUBKEYS, "OP_PUBKEYS", 1, opcodeInvalid},
581         OP_UNKNOWN252:   {OP_UNKNOWN252, "OP_UNKNOWN252", 1, opcodeInvalid},
582         OP_PUBKEYHASH:   {OP_PUBKEYHASH, "OP_PUBKEYHASH", 1, opcodeInvalid},
583         OP_PUBKEY:       {OP_PUBKEY, "OP_PUBKEY", 1, opcodeInvalid},
584
585         OP_INVALIDOPCODE: {OP_INVALIDOPCODE, "OP_INVALIDOPCODE", 1, opcodeInvalid},
586 }
587
588 // opcodeOnelineRepls defines opcode names which are replaced when doing a
589 // one-line disassembly.  This is done to match the output of the reference
590 // implementation while not changing the opcode names in the nicer full
591 // disassembly.
592 var opcodeOnelineRepls = map[string]string{
593         "OP_1NEGATE": "-1",
594         "OP_0":       "0",
595         "OP_1":       "1",
596         "OP_2":       "2",
597         "OP_3":       "3",
598         "OP_4":       "4",
599         "OP_5":       "5",
600         "OP_6":       "6",
601         "OP_7":       "7",
602         "OP_8":       "8",
603         "OP_9":       "9",
604         "OP_10":      "10",
605         "OP_11":      "11",
606         "OP_12":      "12",
607         "OP_13":      "13",
608         "OP_14":      "14",
609         "OP_15":      "15",
610         "OP_16":      "16",
611 }
612
613 // parsedOpcode represents an opcode that has been parsed and includes any
614 // potential data associated with it.
615 type parsedOpcode struct {
616         opcode *opcode
617         data   []byte
618 }
619
620 // isDisabled returns whether or not the opcode is disabled and thus is always
621 // bad to see in the instruction stream (even if turned off by a conditional).
622 func (pop *parsedOpcode) isDisabled() bool {
623         switch pop.opcode.value {
624         case OP_CAT:
625                 return true
626         case OP_SUBSTR:
627                 return true
628         case OP_LEFT:
629                 return true
630         case OP_RIGHT:
631                 return true
632         case OP_INVERT:
633                 return true
634         case OP_AND:
635                 return true
636         case OP_OR:
637                 return true
638         case OP_XOR:
639                 return true
640         case OP_2MUL:
641                 return true
642         case OP_2DIV:
643                 return true
644         case OP_MUL:
645                 return true
646         case OP_DIV:
647                 return true
648         case OP_MOD:
649                 return true
650         case OP_LSHIFT:
651                 return true
652         case OP_RSHIFT:
653                 return true
654         default:
655                 return false
656         }
657 }
658
659 // alwaysIllegal returns whether or not the opcode is always illegal when passed
660 // over by the program counter even if in a non-executed branch (it isn't a
661 // coincidence that they are conditionals).
662 func (pop *parsedOpcode) alwaysIllegal() bool {
663         switch pop.opcode.value {
664         case OP_VERIF:
665                 return true
666         case OP_VERNOTIF:
667                 return true
668         default:
669                 return false
670         }
671 }
672
673 // isConditional returns whether or not the opcode is a conditional opcode which
674 // changes the conditional execution stack when executed.
675 func (pop *parsedOpcode) isConditional() bool {
676         switch pop.opcode.value {
677         case OP_IF:
678                 return true
679         case OP_NOTIF:
680                 return true
681         case OP_ELSE:
682                 return true
683         case OP_ENDIF:
684                 return true
685         default:
686                 return false
687         }
688 }
689
690 // checkMinimalDataPush returns whether or not the current data push uses the
691 // smallest possible opcode to represent it.  For example, the value 15 could
692 // be pushed with OP_DATA_1 15 (among other variations); however, OP_15 is a
693 // single opcode that represents the same value and is only a single byte versus
694 // two bytes.
695 func (pop *parsedOpcode) checkMinimalDataPush() error {
696         data := pop.data
697         dataLen := len(data)
698         opcode := pop.opcode.value
699
700         if dataLen == 0 && opcode != OP_0 {
701                 str := fmt.Sprintf("zero length data push is encoded with "+
702                         "opcode %s instead of OP_0", pop.opcode.name)
703                 return scriptError(ErrMinimalData, str)
704         } else if dataLen == 1 && data[0] >= 1 && data[0] <= 16 {
705                 if opcode != OP_1+data[0]-1 {
706                         // Should have used OP_1 .. OP_16
707                         str := fmt.Sprintf("data push of the value %d encoded "+
708                                 "with opcode %s instead of OP_%d", data[0],
709                                 pop.opcode.name, data[0])
710                         return scriptError(ErrMinimalData, str)
711                 }
712         } else if dataLen == 1 && data[0] == 0x81 {
713                 if opcode != OP_1NEGATE {
714                         str := fmt.Sprintf("data push of the value -1 encoded "+
715                                 "with opcode %s instead of OP_1NEGATE",
716                                 pop.opcode.name)
717                         return scriptError(ErrMinimalData, str)
718                 }
719         } else if dataLen <= 75 {
720                 if int(opcode) != dataLen {
721                         // Should have used a direct push
722                         str := fmt.Sprintf("data push of %d bytes encoded "+
723                                 "with opcode %s instead of OP_DATA_%d", dataLen,
724                                 pop.opcode.name, dataLen)
725                         return scriptError(ErrMinimalData, str)
726                 }
727         } else if dataLen <= 255 {
728                 if opcode != OP_PUSHDATA1 {
729                         str := fmt.Sprintf("data push of %d bytes encoded "+
730                                 "with opcode %s instead of OP_PUSHDATA1",
731                                 dataLen, pop.opcode.name)
732                         return scriptError(ErrMinimalData, str)
733                 }
734         } else if dataLen <= 65535 {
735                 if opcode != OP_PUSHDATA2 {
736                         str := fmt.Sprintf("data push of %d bytes encoded "+
737                                 "with opcode %s instead of OP_PUSHDATA2",
738                                 dataLen, pop.opcode.name)
739                         return scriptError(ErrMinimalData, str)
740                 }
741         }
742         return nil
743 }
744
745 // print returns a human-readable string representation of the opcode for use
746 // in script disassembly.
747 func (pop *parsedOpcode) print(oneline bool) string {
748         // The reference implementation one-line disassembly replaces opcodes
749         // which represent values (e.g. OP_0 through OP_16 and OP_1NEGATE)
750         // with the raw value.  However, when not doing a one-line dissassembly,
751         // we prefer to show the actual opcode names.  Thus, only replace the
752         // opcodes in question when the oneline flag is set.
753         opcodeName := pop.opcode.name
754         if oneline {
755                 if replName, ok := opcodeOnelineRepls[opcodeName]; ok {
756                         opcodeName = replName
757                 }
758
759                 // Nothing more to do for non-data push opcodes.
760                 if pop.opcode.length == 1 {
761                         return opcodeName
762                 }
763
764                 return fmt.Sprintf("%x", pop.data)
765         }
766
767         // Nothing more to do for non-data push opcodes.
768         if pop.opcode.length == 1 {
769                 return opcodeName
770         }
771
772         // Add length for the OP_PUSHDATA# opcodes.
773         retString := opcodeName
774         switch pop.opcode.length {
775         case -1:
776                 retString += fmt.Sprintf(" 0x%02x", len(pop.data))
777         case -2:
778                 retString += fmt.Sprintf(" 0x%04x", len(pop.data))
779         case -4:
780                 retString += fmt.Sprintf(" 0x%08x", len(pop.data))
781         }
782
783         return fmt.Sprintf("%s 0x%02x", retString, pop.data)
784 }
785
786 // bytes returns any data associated with the opcode encoded as it would be in
787 // a script.  This is used for unparsing scripts from parsed opcodes.
788 func (pop *parsedOpcode) bytes() ([]byte, error) {
789         var retbytes []byte
790         if pop.opcode.length > 0 {
791                 retbytes = make([]byte, 1, pop.opcode.length)
792         } else {
793                 retbytes = make([]byte, 1, 1+len(pop.data)-
794                         pop.opcode.length)
795         }
796
797         retbytes[0] = pop.opcode.value
798         if pop.opcode.length == 1 {
799                 if len(pop.data) != 0 {
800                         str := fmt.Sprintf("internal consistency error - "+
801                                 "parsed opcode %s has data length %d when %d "+
802                                 "was expected", pop.opcode.name, len(pop.data),
803                                 0)
804                         return nil, scriptError(ErrInternal, str)
805                 }
806                 return retbytes, nil
807         }
808         nbytes := pop.opcode.length
809         if pop.opcode.length < 0 {
810                 l := len(pop.data)
811                 // tempting just to hardcode to avoid the complexity here.
812                 switch pop.opcode.length {
813                 case -1:
814                         retbytes = append(retbytes, byte(l))
815                         nbytes = int(retbytes[1]) + len(retbytes)
816                 case -2:
817                         retbytes = append(retbytes, byte(l&0xff),
818                                 byte(l>>8&0xff))
819                         nbytes = int(binary.LittleEndian.Uint16(retbytes[1:])) +
820                                 len(retbytes)
821                 case -4:
822                         retbytes = append(retbytes, byte(l&0xff),
823                                 byte((l>>8)&0xff), byte((l>>16)&0xff),
824                                 byte((l>>24)&0xff))
825                         nbytes = int(binary.LittleEndian.Uint32(retbytes[1:])) +
826                                 len(retbytes)
827                 }
828         }
829
830         retbytes = append(retbytes, pop.data...)
831
832         if len(retbytes) != nbytes {
833                 str := fmt.Sprintf("internal consistency error - "+
834                         "parsed opcode %s has data length %d when %d was "+
835                         "expected", pop.opcode.name, len(retbytes), nbytes)
836                 return nil, scriptError(ErrInternal, str)
837         }
838
839         return retbytes, nil
840 }
841
842 // *******************************************
843 // Opcode implementation functions start here.
844 // *******************************************
845
846 // opcodeDisabled is a common handler for disabled opcodes.  It returns an
847 // appropriate error indicating the opcode is disabled.  While it would
848 // ordinarily make more sense to detect if the script contains any disabled
849 // opcodes before executing in an initial parse step, the consensus rules
850 // dictate the script doesn't fail until the program counter passes over a
851 // disabled opcode (even when they appear in a branch that is not executed).
852 func opcodeDisabled(op *parsedOpcode, vm *Engine) error {
853         str := fmt.Sprintf("attempt to execute disabled opcode %s",
854                 op.opcode.name)
855         return scriptError(ErrDisabledOpcode, str)
856 }
857
858 // opcodeReserved is a common handler for all reserved opcodes.  It returns an
859 // appropriate error indicating the opcode is reserved.
860 func opcodeReserved(op *parsedOpcode, vm *Engine) error {
861         str := fmt.Sprintf("attempt to execute reserved opcode %s",
862                 op.opcode.name)
863         return scriptError(ErrReservedOpcode, str)
864 }
865
866 // opcodeInvalid is a common handler for all invalid opcodes.  It returns an
867 // appropriate error indicating the opcode is invalid.
868 func opcodeInvalid(op *parsedOpcode, vm *Engine) error {
869         str := fmt.Sprintf("attempt to execute invalid opcode %s",
870                 op.opcode.name)
871         return scriptError(ErrReservedOpcode, str)
872 }
873
874 // opcodeFalse pushes an empty array to the data stack to represent false.  Note
875 // that 0, when encoded as a number according to the numeric encoding consensus
876 // rules, is an empty array.
877 func opcodeFalse(op *parsedOpcode, vm *Engine) error {
878         vm.dstack.PushByteArray(nil)
879         return nil
880 }
881
882 // opcodePushData is a common handler for the vast majority of opcodes that push
883 // raw data (bytes) to the data stack.
884 func opcodePushData(op *parsedOpcode, vm *Engine) error {
885         vm.dstack.PushByteArray(op.data)
886         return nil
887 }
888
889 // opcode1Negate pushes -1, encoded as a number, to the data stack.
890 func opcode1Negate(op *parsedOpcode, vm *Engine) error {
891         vm.dstack.PushInt(scriptNum(-1))
892         return nil
893 }
894
895 // opcodeN is a common handler for the small integer data push opcodes.  It
896 // pushes the numeric value the opcode represents (which will be from 1 to 16)
897 // onto the data stack.
898 func opcodeN(op *parsedOpcode, vm *Engine) error {
899         // The opcodes are all defined consecutively, so the numeric value is
900         // the difference.
901         vm.dstack.PushInt(scriptNum((op.opcode.value - (OP_1 - 1))))
902         return nil
903 }
904
905 // opcodeNop is a common handler for the NOP family of opcodes.  As the name
906 // implies it generally does nothing, however, it will return an error when
907 // the flag to discourage use of NOPs is set for select opcodes.
908 func opcodeNop(op *parsedOpcode, vm *Engine) error {
909         switch op.opcode.value {
910         case OP_NOP1, OP_NOP4, OP_NOP5,
911                 OP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10:
912                 if vm.hasFlag(ScriptDiscourageUpgradableNops) {
913                         str := fmt.Sprintf("OP_NOP%d reserved for soft-fork "+
914                                 "upgrades", op.opcode.value-(OP_NOP1-1))
915                         return scriptError(ErrDiscourageUpgradableNOPs, str)
916                 }
917         }
918         return nil
919 }
920
921 // popIfBool enforces the "minimal if" policy during script execution if the
922 // particular flag is set.  If so, in order to eliminate an additional source
923 // of nuisance malleability, post-segwit for version 0 witness programs, we now
924 // require the following: for OP_IF and OP_NOT_IF, the top stack item MUST
925 // either be an empty byte slice, or [0x01]. Otherwise, the item at the top of
926 // the stack will be popped and interpreted as a boolean.
927 func popIfBool(vm *Engine) (bool, error) {
928         // When not in witness execution mode, not executing a v0 witness
929         // program, or the minimal if flag isn't set pop the top stack item as
930         // a normal bool.
931         if !vm.isWitnessVersionActive(0) || !vm.hasFlag(ScriptVerifyMinimalIf) {
932                 return vm.dstack.PopBool()
933         }
934
935         // At this point, a v0 witness program is being executed and the minimal
936         // if flag is set, so enforce additional constraints on the top stack
937         // item.
938         so, err := vm.dstack.PopByteArray()
939         if err != nil {
940                 return false, err
941         }
942
943         // The top element MUST have a length of at least one.
944         if len(so) > 1 {
945                 str := fmt.Sprintf("minimal if is active, top element MUST "+
946                         "have a length of at least, instead length is %v",
947                         len(so))
948                 return false, scriptError(ErrMinimalIf, str)
949         }
950
951         // Additionally, if the length is one, then the value MUST be 0x01.
952         if len(so) == 1 && so[0] != 0x01 {
953                 str := fmt.Sprintf("minimal if is active, top stack item MUST "+
954                         "be an empty byte array or 0x01, is instead: %v",
955                         so[0])
956                 return false, scriptError(ErrMinimalIf, str)
957         }
958
959         return asBool(so), nil
960 }
961
962 // opcodeIf treats the top item on the data stack as a boolean and removes it.
963 //
964 // An appropriate entry is added to the conditional stack depending on whether
965 // the boolean is true and whether this if is on an executing branch in order
966 // to allow proper execution of further opcodes depending on the conditional
967 // logic.  When the boolean is true, the first branch will be executed (unless
968 // this opcode is nested in a non-executed branch).
969 //
970 // <expression> if [statements] [else [statements]] endif
971 //
972 // Note that, unlike for all non-conditional opcodes, this is executed even when
973 // it is on a non-executing branch so proper nesting is maintained.
974 //
975 // Data stack transformation: [... bool] -> [...]
976 // Conditional stack transformation: [...] -> [... OpCondValue]
977 func opcodeIf(op *parsedOpcode, vm *Engine) error {
978         condVal := OpCondFalse
979         if vm.isBranchExecuting() {
980                 ok, err := popIfBool(vm)
981                 if err != nil {
982                         return err
983                 }
984
985                 if ok {
986                         condVal = OpCondTrue
987                 }
988         } else {
989                 condVal = OpCondSkip
990         }
991         vm.condStack = append(vm.condStack, condVal)
992         return nil
993 }
994
995 // opcodeNotIf treats the top item on the data stack as a boolean and removes
996 // it.
997 //
998 // An appropriate entry is added to the conditional stack depending on whether
999 // the boolean is true and whether this if is on an executing branch in order
1000 // to allow proper execution of further opcodes depending on the conditional
1001 // logic.  When the boolean is false, the first branch will be executed (unless
1002 // this opcode is nested in a non-executed branch).
1003 //
1004 // <expression> notif [statements] [else [statements]] endif
1005 //
1006 // Note that, unlike for all non-conditional opcodes, this is executed even when
1007 // it is on a non-executing branch so proper nesting is maintained.
1008 //
1009 // Data stack transformation: [... bool] -> [...]
1010 // Conditional stack transformation: [...] -> [... OpCondValue]
1011 func opcodeNotIf(op *parsedOpcode, vm *Engine) error {
1012         condVal := OpCondFalse
1013         if vm.isBranchExecuting() {
1014                 ok, err := popIfBool(vm)
1015                 if err != nil {
1016                         return err
1017                 }
1018
1019                 if !ok {
1020                         condVal = OpCondTrue
1021                 }
1022         } else {
1023                 condVal = OpCondSkip
1024         }
1025         vm.condStack = append(vm.condStack, condVal)
1026         return nil
1027 }
1028
1029 // opcodeElse inverts conditional execution for other half of if/else/endif.
1030 //
1031 // An error is returned if there has not already been a matching OP_IF.
1032 //
1033 // Conditional stack transformation: [... OpCondValue] -> [... !OpCondValue]
1034 func opcodeElse(op *parsedOpcode, vm *Engine) error {
1035         if len(vm.condStack) == 0 {
1036                 str := fmt.Sprintf("encountered opcode %s with no matching "+
1037                         "opcode to begin conditional execution", op.opcode.name)
1038                 return scriptError(ErrUnbalancedConditional, str)
1039         }
1040
1041         conditionalIdx := len(vm.condStack) - 1
1042         switch vm.condStack[conditionalIdx] {
1043         case OpCondTrue:
1044                 vm.condStack[conditionalIdx] = OpCondFalse
1045         case OpCondFalse:
1046                 vm.condStack[conditionalIdx] = OpCondTrue
1047         case OpCondSkip:
1048                 // Value doesn't change in skip since it indicates this opcode
1049                 // is nested in a non-executed branch.
1050         }
1051         return nil
1052 }
1053
1054 // opcodeEndif terminates a conditional block, removing the value from the
1055 // conditional execution stack.
1056 //
1057 // An error is returned if there has not already been a matching OP_IF.
1058 //
1059 // Conditional stack transformation: [... OpCondValue] -> [...]
1060 func opcodeEndif(op *parsedOpcode, vm *Engine) error {
1061         if len(vm.condStack) == 0 {
1062                 str := fmt.Sprintf("encountered opcode %s with no matching "+
1063                         "opcode to begin conditional execution", op.opcode.name)
1064                 return scriptError(ErrUnbalancedConditional, str)
1065         }
1066
1067         vm.condStack = vm.condStack[:len(vm.condStack)-1]
1068         return nil
1069 }
1070
1071 // abstractVerify examines the top item on the data stack as a boolean value and
1072 // verifies it evaluates to true.  An error is returned either when there is no
1073 // item on the stack or when that item evaluates to false.  In the latter case
1074 // where the verification fails specifically due to the top item evaluating
1075 // to false, the returned error will use the passed error code.
1076 func abstractVerify(op *parsedOpcode, vm *Engine, c ErrorCode) error {
1077         verified, err := vm.dstack.PopBool()
1078         if err != nil {
1079                 return err
1080         }
1081
1082         if !verified {
1083                 str := fmt.Sprintf("%s failed", op.opcode.name)
1084                 return scriptError(c, str)
1085         }
1086         return nil
1087 }
1088
1089 // opcodeVerify examines the top item on the data stack as a boolean value and
1090 // verifies it evaluates to true.  An error is returned if it does not.
1091 func opcodeVerify(op *parsedOpcode, vm *Engine) error {
1092         return abstractVerify(op, vm, ErrVerify)
1093 }
1094
1095 // opcodeReturn returns an appropriate error since it is always an error to
1096 // return early from a script.
1097 func opcodeReturn(op *parsedOpcode, vm *Engine) error {
1098         return scriptError(ErrEarlyReturn, "script returned early")
1099 }
1100
1101 // verifyLockTime is a helper function used to validate locktimes.
1102 func verifyLockTime(txLockTime, threshold, lockTime int64) error {
1103         // The lockTimes in both the script and transaction must be of the same
1104         // type.
1105         if !((txLockTime < threshold && lockTime < threshold) ||
1106                 (txLockTime >= threshold && lockTime >= threshold)) {
1107                 str := fmt.Sprintf("mismatched locktime types -- tx locktime "+
1108                         "%d, stack locktime %d", txLockTime, lockTime)
1109                 return scriptError(ErrUnsatisfiedLockTime, str)
1110         }
1111
1112         if lockTime > txLockTime {
1113                 str := fmt.Sprintf("locktime requirement not satisfied -- "+
1114                         "locktime is greater than the transaction locktime: "+
1115                         "%d > %d", lockTime, txLockTime)
1116                 return scriptError(ErrUnsatisfiedLockTime, str)
1117         }
1118
1119         return nil
1120 }
1121
1122 // opcodeCheckLockTimeVerify compares the top item on the data stack to the
1123 // LockTime field of the transaction containing the script signature
1124 // validating if the transaction outputs are spendable yet.  If flag
1125 // ScriptVerifyCheckLockTimeVerify is not set, the code continues as if OP_NOP2
1126 // were executed.
1127 func opcodeCheckLockTimeVerify(op *parsedOpcode, vm *Engine) error {
1128         // If the ScriptVerifyCheckLockTimeVerify script flag is not set, treat
1129         // opcode as OP_NOP2 instead.
1130         if !vm.hasFlag(ScriptVerifyCheckLockTimeVerify) {
1131                 if vm.hasFlag(ScriptDiscourageUpgradableNops) {
1132                         return scriptError(ErrDiscourageUpgradableNOPs,
1133                                 "OP_NOP2 reserved for soft-fork upgrades")
1134                 }
1135                 return nil
1136         }
1137
1138         // The current transaction locktime is a uint32 resulting in a maximum
1139         // locktime of 2^32-1 (the year 2106).  However, scriptNums are signed
1140         // and therefore a standard 4-byte scriptNum would only support up to a
1141         // maximum of 2^31-1 (the year 2038).  Thus, a 5-byte scriptNum is used
1142         // here since it will support up to 2^39-1 which allows dates beyond the
1143         // current locktime limit.
1144         //
1145         // PeekByteArray is used here instead of PeekInt because we do not want
1146         // to be limited to a 4-byte integer for reasons specified above.
1147         so, err := vm.dstack.PeekByteArray(0)
1148         if err != nil {
1149                 return err
1150         }
1151         lockTime, err := makeScriptNum(so, vm.dstack.verifyMinimalData, 5)
1152         if err != nil {
1153                 return err
1154         }
1155
1156         // In the rare event that the argument needs to be < 0 due to some
1157         // arithmetic being done first, you can always use
1158         // 0 OP_MAX OP_CHECKLOCKTIMEVERIFY.
1159         if lockTime < 0 {
1160                 str := fmt.Sprintf("negative lock time: %d", lockTime)
1161                 return scriptError(ErrNegativeLockTime, str)
1162         }
1163
1164         // The lock time field of a transaction is either a block height at
1165         // which the transaction is finalized or a timestamp depending on if the
1166         // value is before the txscript.LockTimeThreshold.  When it is under the
1167         // threshold it is a block height.
1168         err = verifyLockTime(int64(vm.tx.LockTime), LockTimeThreshold,
1169                 int64(lockTime))
1170         if err != nil {
1171                 return err
1172         }
1173
1174         // The lock time feature can also be disabled, thereby bypassing
1175         // OP_CHECKLOCKTIMEVERIFY, if every transaction input has been finalized by
1176         // setting its sequence to the maximum value (wire.MaxTxInSequenceNum).  This
1177         // condition would result in the transaction being allowed into the blockchain
1178         // making the opcode ineffective.
1179         //
1180         // This condition is prevented by enforcing that the input being used by
1181         // the opcode is unlocked (its sequence number is less than the max
1182         // value).  This is sufficient to prove correctness without having to
1183         // check every input.
1184         //
1185         // NOTE: This implies that even if the transaction is not finalized due to
1186         // another input being unlocked, the opcode execution will still fail when the
1187         // input being used by the opcode is locked.
1188         if vm.tx.TxIn[vm.txIdx].Sequence == wire.MaxTxInSequenceNum {
1189                 return scriptError(ErrUnsatisfiedLockTime,
1190                         "transaction input is finalized")
1191         }
1192
1193         return nil
1194 }
1195
1196 // opcodeCheckSequenceVerify compares the top item on the data stack to the
1197 // LockTime field of the transaction containing the script signature
1198 // validating if the transaction outputs are spendable yet.  If flag
1199 // ScriptVerifyCheckSequenceVerify is not set, the code continues as if OP_NOP3
1200 // were executed.
1201 func opcodeCheckSequenceVerify(op *parsedOpcode, vm *Engine) error {
1202         // If the ScriptVerifyCheckSequenceVerify script flag is not set, treat
1203         // opcode as OP_NOP3 instead.
1204         if !vm.hasFlag(ScriptVerifyCheckSequenceVerify) {
1205                 if vm.hasFlag(ScriptDiscourageUpgradableNops) {
1206                         return scriptError(ErrDiscourageUpgradableNOPs,
1207                                 "OP_NOP3 reserved for soft-fork upgrades")
1208                 }
1209                 return nil
1210         }
1211
1212         // The current transaction sequence is a uint32 resulting in a maximum
1213         // sequence of 2^32-1.  However, scriptNums are signed and therefore a
1214         // standard 4-byte scriptNum would only support up to a maximum of
1215         // 2^31-1.  Thus, a 5-byte scriptNum is used here since it will support
1216         // up to 2^39-1 which allows sequences beyond the current sequence
1217         // limit.
1218         //
1219         // PeekByteArray is used here instead of PeekInt because we do not want
1220         // to be limited to a 4-byte integer for reasons specified above.
1221         so, err := vm.dstack.PeekByteArray(0)
1222         if err != nil {
1223                 return err
1224         }
1225         stackSequence, err := makeScriptNum(so, vm.dstack.verifyMinimalData, 5)
1226         if err != nil {
1227                 return err
1228         }
1229
1230         // In the rare event that the argument needs to be < 0 due to some
1231         // arithmetic being done first, you can always use
1232         // 0 OP_MAX OP_CHECKSEQUENCEVERIFY.
1233         if stackSequence < 0 {
1234                 str := fmt.Sprintf("negative sequence: %d", stackSequence)
1235                 return scriptError(ErrNegativeLockTime, str)
1236         }
1237
1238         sequence := int64(stackSequence)
1239
1240         // To provide for future soft-fork extensibility, if the
1241         // operand has the disabled lock-time flag set,
1242         // CHECKSEQUENCEVERIFY behaves as a NOP.
1243         if sequence&int64(wire.SequenceLockTimeDisabled) != 0 {
1244                 return nil
1245         }
1246
1247         // Transaction version numbers not high enough to trigger CSV rules must
1248         // fail.
1249         if vm.tx.Version < 2 {
1250                 str := fmt.Sprintf("invalid transaction version: %d",
1251                         vm.tx.Version)
1252                 return scriptError(ErrUnsatisfiedLockTime, str)
1253         }
1254
1255         // Sequence numbers with their most significant bit set are not
1256         // consensus constrained. Testing that the transaction's sequence
1257         // number does not have this bit set prevents using this property
1258         // to get around a CHECKSEQUENCEVERIFY check.
1259         txSequence := int64(vm.tx.TxIn[vm.txIdx].Sequence)
1260         if txSequence&int64(wire.SequenceLockTimeDisabled) != 0 {
1261                 str := fmt.Sprintf("transaction sequence has sequence "+
1262                         "locktime disabled bit set: 0x%x", txSequence)
1263                 return scriptError(ErrUnsatisfiedLockTime, str)
1264         }
1265
1266         // Mask off non-consensus bits before doing comparisons.
1267         lockTimeMask := int64(wire.SequenceLockTimeIsSeconds |
1268                 wire.SequenceLockTimeMask)
1269         return verifyLockTime(txSequence&lockTimeMask,
1270                 wire.SequenceLockTimeIsSeconds, sequence&lockTimeMask)
1271 }
1272
1273 // opcodeToAltStack removes the top item from the main data stack and pushes it
1274 // onto the alternate data stack.
1275 //
1276 // Main data stack transformation: [... x1 x2 x3] -> [... x1 x2]
1277 // Alt data stack transformation:  [... y1 y2 y3] -> [... y1 y2 y3 x3]
1278 func opcodeToAltStack(op *parsedOpcode, vm *Engine) error {
1279         so, err := vm.dstack.PopByteArray()
1280         if err != nil {
1281                 return err
1282         }
1283         vm.astack.PushByteArray(so)
1284
1285         return nil
1286 }
1287
1288 // opcodeFromAltStack removes the top item from the alternate data stack and
1289 // pushes it onto the main data stack.
1290 //
1291 // Main data stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 y3]
1292 // Alt data stack transformation:  [... y1 y2 y3] -> [... y1 y2]
1293 func opcodeFromAltStack(op *parsedOpcode, vm *Engine) error {
1294         so, err := vm.astack.PopByteArray()
1295         if err != nil {
1296                 return err
1297         }
1298         vm.dstack.PushByteArray(so)
1299
1300         return nil
1301 }
1302
1303 // opcode2Drop removes the top 2 items from the data stack.
1304 //
1305 // Stack transformation: [... x1 x2 x3] -> [... x1]
1306 func opcode2Drop(op *parsedOpcode, vm *Engine) error {
1307         return vm.dstack.DropN(2)
1308 }
1309
1310 // opcode2Dup duplicates the top 2 items on the data stack.
1311 //
1312 // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2 x3]
1313 func opcode2Dup(op *parsedOpcode, vm *Engine) error {
1314         return vm.dstack.DupN(2)
1315 }
1316
1317 // opcode3Dup duplicates the top 3 items on the data stack.
1318 //
1319 // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x1 x2 x3]
1320 func opcode3Dup(op *parsedOpcode, vm *Engine) error {
1321         return vm.dstack.DupN(3)
1322 }
1323
1324 // opcode2Over duplicates the 2 items before the top 2 items on the data stack.
1325 //
1326 // Stack transformation: [... x1 x2 x3 x4] -> [... x1 x2 x3 x4 x1 x2]
1327 func opcode2Over(op *parsedOpcode, vm *Engine) error {
1328         return vm.dstack.OverN(2)
1329 }
1330
1331 // opcode2Rot rotates the top 6 items on the data stack to the left twice.
1332 //
1333 // Stack transformation: [... x1 x2 x3 x4 x5 x6] -> [... x3 x4 x5 x6 x1 x2]
1334 func opcode2Rot(op *parsedOpcode, vm *Engine) error {
1335         return vm.dstack.RotN(2)
1336 }
1337
1338 // opcode2Swap swaps the top 2 items on the data stack with the 2 that come
1339 // before them.
1340 //
1341 // Stack transformation: [... x1 x2 x3 x4] -> [... x3 x4 x1 x2]
1342 func opcode2Swap(op *parsedOpcode, vm *Engine) error {
1343         return vm.dstack.SwapN(2)
1344 }
1345
1346 // opcodeIfDup duplicates the top item of the stack if it is not zero.
1347 //
1348 // Stack transformation (x1==0): [... x1] -> [... x1]
1349 // Stack transformation (x1!=0): [... x1] -> [... x1 x1]
1350 func opcodeIfDup(op *parsedOpcode, vm *Engine) error {
1351         so, err := vm.dstack.PeekByteArray(0)
1352         if err != nil {
1353                 return err
1354         }
1355
1356         // Push copy of data iff it isn't zero
1357         if asBool(so) {
1358                 vm.dstack.PushByteArray(so)
1359         }
1360
1361         return nil
1362 }
1363
1364 // opcodeDepth pushes the depth of the data stack prior to executing this
1365 // opcode, encoded as a number, onto the data stack.
1366 //
1367 // Stack transformation: [...] -> [... <num of items on the stack>]
1368 // Example with 2 items: [x1 x2] -> [x1 x2 2]
1369 // Example with 3 items: [x1 x2 x3] -> [x1 x2 x3 3]
1370 func opcodeDepth(op *parsedOpcode, vm *Engine) error {
1371         vm.dstack.PushInt(scriptNum(vm.dstack.Depth()))
1372         return nil
1373 }
1374
1375 // opcodeDrop removes the top item from the data stack.
1376 //
1377 // Stack transformation: [... x1 x2 x3] -> [... x1 x2]
1378 func opcodeDrop(op *parsedOpcode, vm *Engine) error {
1379         return vm.dstack.DropN(1)
1380 }
1381
1382 // opcodeDup duplicates the top item on the data stack.
1383 //
1384 // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x3]
1385 func opcodeDup(op *parsedOpcode, vm *Engine) error {
1386         return vm.dstack.DupN(1)
1387 }
1388
1389 // opcodeNip removes the item before the top item on the data stack.
1390 //
1391 // Stack transformation: [... x1 x2 x3] -> [... x1 x3]
1392 func opcodeNip(op *parsedOpcode, vm *Engine) error {
1393         return vm.dstack.NipN(1)
1394 }
1395
1396 // opcodeOver duplicates the item before the top item on the data stack.
1397 //
1398 // Stack transformation: [... x1 x2 x3] -> [... x1 x2 x3 x2]
1399 func opcodeOver(op *parsedOpcode, vm *Engine) error {
1400         return vm.dstack.OverN(1)
1401 }
1402
1403 // opcodePick treats the top item on the data stack as an integer and duplicates
1404 // the item on the stack that number of items back to the top.
1405 //
1406 // Stack transformation: [xn ... x2 x1 x0 n] -> [xn ... x2 x1 x0 xn]
1407 // Example with n=1: [x2 x1 x0 1] -> [x2 x1 x0 x1]
1408 // Example with n=2: [x2 x1 x0 2] -> [x2 x1 x0 x2]
1409 func opcodePick(op *parsedOpcode, vm *Engine) error {
1410         val, err := vm.dstack.PopInt()
1411         if err != nil {
1412                 return err
1413         }
1414
1415         return vm.dstack.PickN(val.Int32())
1416 }
1417
1418 // opcodeRoll treats the top item on the data stack as an integer and moves
1419 // the item on the stack that number of items back to the top.
1420 //
1421 // Stack transformation: [xn ... x2 x1 x0 n] -> [... x2 x1 x0 xn]
1422 // Example with n=1: [x2 x1 x0 1] -> [x2 x0 x1]
1423 // Example with n=2: [x2 x1 x0 2] -> [x1 x0 x2]
1424 func opcodeRoll(op *parsedOpcode, vm *Engine) error {
1425         val, err := vm.dstack.PopInt()
1426         if err != nil {
1427                 return err
1428         }
1429
1430         return vm.dstack.RollN(val.Int32())
1431 }
1432
1433 // opcodeRot rotates the top 3 items on the data stack to the left.
1434 //
1435 // Stack transformation: [... x1 x2 x3] -> [... x2 x3 x1]
1436 func opcodeRot(op *parsedOpcode, vm *Engine) error {
1437         return vm.dstack.RotN(1)
1438 }
1439
1440 // opcodeSwap swaps the top two items on the stack.
1441 //
1442 // Stack transformation: [... x1 x2] -> [... x2 x1]
1443 func opcodeSwap(op *parsedOpcode, vm *Engine) error {
1444         return vm.dstack.SwapN(1)
1445 }
1446
1447 // opcodeTuck inserts a duplicate of the top item of the data stack before the
1448 // second-to-top item.
1449 //
1450 // Stack transformation: [... x1 x2] -> [... x2 x1 x2]
1451 func opcodeTuck(op *parsedOpcode, vm *Engine) error {
1452         return vm.dstack.Tuck()
1453 }
1454
1455 // opcodeSize pushes the size of the top item of the data stack onto the data
1456 // stack.
1457 //
1458 // Stack transformation: [... x1] -> [... x1 len(x1)]
1459 func opcodeSize(op *parsedOpcode, vm *Engine) error {
1460         so, err := vm.dstack.PeekByteArray(0)
1461         if err != nil {
1462                 return err
1463         }
1464
1465         vm.dstack.PushInt(scriptNum(len(so)))
1466         return nil
1467 }
1468
1469 // opcodeEqual removes the top 2 items of the data stack, compares them as raw
1470 // bytes, and pushes the result, encoded as a boolean, back to the stack.
1471 //
1472 // Stack transformation: [... x1 x2] -> [... bool]
1473 func opcodeEqual(op *parsedOpcode, vm *Engine) error {
1474         a, err := vm.dstack.PopByteArray()
1475         if err != nil {
1476                 return err
1477         }
1478         b, err := vm.dstack.PopByteArray()
1479         if err != nil {
1480                 return err
1481         }
1482
1483         vm.dstack.PushBool(bytes.Equal(a, b))
1484         return nil
1485 }
1486
1487 // opcodeEqualVerify is a combination of opcodeEqual and opcodeVerify.
1488 // Specifically, it removes the top 2 items of the data stack, compares them,
1489 // and pushes the result, encoded as a boolean, back to the stack.  Then, it
1490 // examines the top item on the data stack as a boolean value and verifies it
1491 // evaluates to true.  An error is returned if it does not.
1492 //
1493 // Stack transformation: [... x1 x2] -> [... bool] -> [...]
1494 func opcodeEqualVerify(op *parsedOpcode, vm *Engine) error {
1495         err := opcodeEqual(op, vm)
1496         if err == nil {
1497                 err = abstractVerify(op, vm, ErrEqualVerify)
1498         }
1499         return err
1500 }
1501
1502 // opcode1Add treats the top item on the data stack as an integer and replaces
1503 // it with its incremented value (plus 1).
1504 //
1505 // Stack transformation: [... x1 x2] -> [... x1 x2+1]
1506 func opcode1Add(op *parsedOpcode, vm *Engine) error {
1507         m, err := vm.dstack.PopInt()
1508         if err != nil {
1509                 return err
1510         }
1511
1512         vm.dstack.PushInt(m + 1)
1513         return nil
1514 }
1515
1516 // opcode1Sub treats the top item on the data stack as an integer and replaces
1517 // it with its decremented value (minus 1).
1518 //
1519 // Stack transformation: [... x1 x2] -> [... x1 x2-1]
1520 func opcode1Sub(op *parsedOpcode, vm *Engine) error {
1521         m, err := vm.dstack.PopInt()
1522         if err != nil {
1523                 return err
1524         }
1525         vm.dstack.PushInt(m - 1)
1526
1527         return nil
1528 }
1529
1530 // opcodeNegate treats the top item on the data stack as an integer and replaces
1531 // it with its negation.
1532 //
1533 // Stack transformation: [... x1 x2] -> [... x1 -x2]
1534 func opcodeNegate(op *parsedOpcode, vm *Engine) error {
1535         m, err := vm.dstack.PopInt()
1536         if err != nil {
1537                 return err
1538         }
1539
1540         vm.dstack.PushInt(-m)
1541         return nil
1542 }
1543
1544 // opcodeAbs treats the top item on the data stack as an integer and replaces it
1545 // it with its absolute value.
1546 //
1547 // Stack transformation: [... x1 x2] -> [... x1 abs(x2)]
1548 func opcodeAbs(op *parsedOpcode, vm *Engine) error {
1549         m, err := vm.dstack.PopInt()
1550         if err != nil {
1551                 return err
1552         }
1553
1554         if m < 0 {
1555                 m = -m
1556         }
1557         vm.dstack.PushInt(m)
1558         return nil
1559 }
1560
1561 // opcodeNot treats the top item on the data stack as an integer and replaces
1562 // it with its "inverted" value (0 becomes 1, non-zero becomes 0).
1563 //
1564 // NOTE: While it would probably make more sense to treat the top item as a
1565 // boolean, and push the opposite, which is really what the intention of this
1566 // opcode is, it is extremely important that is not done because integers are
1567 // interpreted differently than booleans and the consensus rules for this opcode
1568 // dictate the item is interpreted as an integer.
1569 //
1570 // Stack transformation (x2==0): [... x1 0] -> [... x1 1]
1571 // Stack transformation (x2!=0): [... x1 1] -> [... x1 0]
1572 // Stack transformation (x2!=0): [... x1 17] -> [... x1 0]
1573 func opcodeNot(op *parsedOpcode, vm *Engine) error {
1574         m, err := vm.dstack.PopInt()
1575         if err != nil {
1576                 return err
1577         }
1578
1579         if m == 0 {
1580                 vm.dstack.PushInt(scriptNum(1))
1581         } else {
1582                 vm.dstack.PushInt(scriptNum(0))
1583         }
1584         return nil
1585 }
1586
1587 // opcode0NotEqual treats the top item on the data stack as an integer and
1588 // replaces it with either a 0 if it is zero, or a 1 if it is not zero.
1589 //
1590 // Stack transformation (x2==0): [... x1 0] -> [... x1 0]
1591 // Stack transformation (x2!=0): [... x1 1] -> [... x1 1]
1592 // Stack transformation (x2!=0): [... x1 17] -> [... x1 1]
1593 func opcode0NotEqual(op *parsedOpcode, vm *Engine) error {
1594         m, err := vm.dstack.PopInt()
1595         if err != nil {
1596                 return err
1597         }
1598
1599         if m != 0 {
1600                 m = 1
1601         }
1602         vm.dstack.PushInt(m)
1603         return nil
1604 }
1605
1606 // opcodeAdd treats the top two items on the data stack as integers and replaces
1607 // them with their sum.
1608 //
1609 // Stack transformation: [... x1 x2] -> [... x1+x2]
1610 func opcodeAdd(op *parsedOpcode, vm *Engine) error {
1611         v0, err := vm.dstack.PopInt()
1612         if err != nil {
1613                 return err
1614         }
1615
1616         v1, err := vm.dstack.PopInt()
1617         if err != nil {
1618                 return err
1619         }
1620
1621         vm.dstack.PushInt(v0 + v1)
1622         return nil
1623 }
1624
1625 // opcodeSub treats the top two items on the data stack as integers and replaces
1626 // them with the result of subtracting the top entry from the second-to-top
1627 // entry.
1628 //
1629 // Stack transformation: [... x1 x2] -> [... x1-x2]
1630 func opcodeSub(op *parsedOpcode, vm *Engine) error {
1631         v0, err := vm.dstack.PopInt()
1632         if err != nil {
1633                 return err
1634         }
1635
1636         v1, err := vm.dstack.PopInt()
1637         if err != nil {
1638                 return err
1639         }
1640
1641         vm.dstack.PushInt(v1 - v0)
1642         return nil
1643 }
1644
1645 // opcodeBoolAnd treats the top two items on the data stack as integers.  When
1646 // both of them are not zero, they are replaced with a 1, otherwise a 0.
1647 //
1648 // Stack transformation (x1==0, x2==0): [... 0 0] -> [... 0]
1649 // Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 0]
1650 // Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 0]
1651 // Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1]
1652 func opcodeBoolAnd(op *parsedOpcode, vm *Engine) error {
1653         v0, err := vm.dstack.PopInt()
1654         if err != nil {
1655                 return err
1656         }
1657
1658         v1, err := vm.dstack.PopInt()
1659         if err != nil {
1660                 return err
1661         }
1662
1663         if v0 != 0 && v1 != 0 {
1664                 vm.dstack.PushInt(scriptNum(1))
1665         } else {
1666                 vm.dstack.PushInt(scriptNum(0))
1667         }
1668
1669         return nil
1670 }
1671
1672 // opcodeBoolOr treats the top two items on the data stack as integers.  When
1673 // either of them are not zero, they are replaced with a 1, otherwise a 0.
1674 //
1675 // Stack transformation (x1==0, x2==0): [... 0 0] -> [... 0]
1676 // Stack transformation (x1!=0, x2==0): [... 5 0] -> [... 1]
1677 // Stack transformation (x1==0, x2!=0): [... 0 7] -> [... 1]
1678 // Stack transformation (x1!=0, x2!=0): [... 4 8] -> [... 1]
1679 func opcodeBoolOr(op *parsedOpcode, vm *Engine) error {
1680         v0, err := vm.dstack.PopInt()
1681         if err != nil {
1682                 return err
1683         }
1684
1685         v1, err := vm.dstack.PopInt()
1686         if err != nil {
1687                 return err
1688         }
1689
1690         if v0 != 0 || v1 != 0 {
1691                 vm.dstack.PushInt(scriptNum(1))
1692         } else {
1693                 vm.dstack.PushInt(scriptNum(0))
1694         }
1695
1696         return nil
1697 }
1698
1699 // opcodeNumEqual treats the top two items on the data stack as integers.  When
1700 // they are equal, they are replaced with a 1, otherwise a 0.
1701 //
1702 // Stack transformation (x1==x2): [... 5 5] -> [... 1]
1703 // Stack transformation (x1!=x2): [... 5 7] -> [... 0]
1704 func opcodeNumEqual(op *parsedOpcode, vm *Engine) error {
1705         v0, err := vm.dstack.PopInt()
1706         if err != nil {
1707                 return err
1708         }
1709
1710         v1, err := vm.dstack.PopInt()
1711         if err != nil {
1712                 return err
1713         }
1714
1715         if v0 == v1 {
1716                 vm.dstack.PushInt(scriptNum(1))
1717         } else {
1718                 vm.dstack.PushInt(scriptNum(0))
1719         }
1720
1721         return nil
1722 }
1723
1724 // opcodeNumEqualVerify is a combination of opcodeNumEqual and opcodeVerify.
1725 //
1726 // Specifically, treats the top two items on the data stack as integers.  When
1727 // they are equal, they are replaced with a 1, otherwise a 0.  Then, it examines
1728 // the top item on the data stack as a boolean value and verifies it evaluates
1729 // to true.  An error is returned if it does not.
1730 //
1731 // Stack transformation: [... x1 x2] -> [... bool] -> [...]
1732 func opcodeNumEqualVerify(op *parsedOpcode, vm *Engine) error {
1733         err := opcodeNumEqual(op, vm)
1734         if err == nil {
1735                 err = abstractVerify(op, vm, ErrNumEqualVerify)
1736         }
1737         return err
1738 }
1739
1740 // opcodeNumNotEqual treats the top two items on the data stack as integers.
1741 // When they are NOT equal, they are replaced with a 1, otherwise a 0.
1742 //
1743 // Stack transformation (x1==x2): [... 5 5] -> [... 0]
1744 // Stack transformation (x1!=x2): [... 5 7] -> [... 1]
1745 func opcodeNumNotEqual(op *parsedOpcode, vm *Engine) error {
1746         v0, err := vm.dstack.PopInt()
1747         if err != nil {
1748                 return err
1749         }
1750
1751         v1, err := vm.dstack.PopInt()
1752         if err != nil {
1753                 return err
1754         }
1755
1756         if v0 != v1 {
1757                 vm.dstack.PushInt(scriptNum(1))
1758         } else {
1759                 vm.dstack.PushInt(scriptNum(0))
1760         }
1761
1762         return nil
1763 }
1764
1765 // opcodeLessThan treats the top two items on the data stack as integers.  When
1766 // the second-to-top item is less than the top item, they are replaced with a 1,
1767 // otherwise a 0.
1768 //
1769 // Stack transformation: [... x1 x2] -> [... bool]
1770 func opcodeLessThan(op *parsedOpcode, vm *Engine) error {
1771         v0, err := vm.dstack.PopInt()
1772         if err != nil {
1773                 return err
1774         }
1775
1776         v1, err := vm.dstack.PopInt()
1777         if err != nil {
1778                 return err
1779         }
1780
1781         if v1 < v0 {
1782                 vm.dstack.PushInt(scriptNum(1))
1783         } else {
1784                 vm.dstack.PushInt(scriptNum(0))
1785         }
1786
1787         return nil
1788 }
1789
1790 // opcodeGreaterThan treats the top two items on the data stack as integers.
1791 // When the second-to-top item is greater than the top item, they are replaced
1792 // with a 1, otherwise a 0.
1793 //
1794 // Stack transformation: [... x1 x2] -> [... bool]
1795 func opcodeGreaterThan(op *parsedOpcode, vm *Engine) error {
1796         v0, err := vm.dstack.PopInt()
1797         if err != nil {
1798                 return err
1799         }
1800
1801         v1, err := vm.dstack.PopInt()
1802         if err != nil {
1803                 return err
1804         }
1805
1806         if v1 > v0 {
1807                 vm.dstack.PushInt(scriptNum(1))
1808         } else {
1809                 vm.dstack.PushInt(scriptNum(0))
1810         }
1811         return nil
1812 }
1813
1814 // opcodeLessThanOrEqual treats the top two items on the data stack as integers.
1815 // When the second-to-top item is less than or equal to the top item, they are
1816 // replaced with a 1, otherwise a 0.
1817 //
1818 // Stack transformation: [... x1 x2] -> [... bool]
1819 func opcodeLessThanOrEqual(op *parsedOpcode, vm *Engine) error {
1820         v0, err := vm.dstack.PopInt()
1821         if err != nil {
1822                 return err
1823         }
1824
1825         v1, err := vm.dstack.PopInt()
1826         if err != nil {
1827                 return err
1828         }
1829
1830         if v1 <= v0 {
1831                 vm.dstack.PushInt(scriptNum(1))
1832         } else {
1833                 vm.dstack.PushInt(scriptNum(0))
1834         }
1835         return nil
1836 }
1837
1838 // opcodeGreaterThanOrEqual treats the top two items on the data stack as
1839 // integers.  When the second-to-top item is greater than or equal to the top
1840 // item, they are replaced with a 1, otherwise a 0.
1841 //
1842 // Stack transformation: [... x1 x2] -> [... bool]
1843 func opcodeGreaterThanOrEqual(op *parsedOpcode, vm *Engine) error {
1844         v0, err := vm.dstack.PopInt()
1845         if err != nil {
1846                 return err
1847         }
1848
1849         v1, err := vm.dstack.PopInt()
1850         if err != nil {
1851                 return err
1852         }
1853
1854         if v1 >= v0 {
1855                 vm.dstack.PushInt(scriptNum(1))
1856         } else {
1857                 vm.dstack.PushInt(scriptNum(0))
1858         }
1859
1860         return nil
1861 }
1862
1863 // opcodeMin treats the top two items on the data stack as integers and replaces
1864 // them with the minimum of the two.
1865 //
1866 // Stack transformation: [... x1 x2] -> [... min(x1, x2)]
1867 func opcodeMin(op *parsedOpcode, vm *Engine) error {
1868         v0, err := vm.dstack.PopInt()
1869         if err != nil {
1870                 return err
1871         }
1872
1873         v1, err := vm.dstack.PopInt()
1874         if err != nil {
1875                 return err
1876         }
1877
1878         if v1 < v0 {
1879                 vm.dstack.PushInt(v1)
1880         } else {
1881                 vm.dstack.PushInt(v0)
1882         }
1883
1884         return nil
1885 }
1886
1887 // opcodeMax treats the top two items on the data stack as integers and replaces
1888 // them with the maximum of the two.
1889 //
1890 // Stack transformation: [... x1 x2] -> [... max(x1, x2)]
1891 func opcodeMax(op *parsedOpcode, vm *Engine) error {
1892         v0, err := vm.dstack.PopInt()
1893         if err != nil {
1894                 return err
1895         }
1896
1897         v1, err := vm.dstack.PopInt()
1898         if err != nil {
1899                 return err
1900         }
1901
1902         if v1 > v0 {
1903                 vm.dstack.PushInt(v1)
1904         } else {
1905                 vm.dstack.PushInt(v0)
1906         }
1907
1908         return nil
1909 }
1910
1911 // opcodeWithin treats the top 3 items on the data stack as integers.  When the
1912 // value to test is within the specified range (left inclusive), they are
1913 // replaced with a 1, otherwise a 0.
1914 //
1915 // The top item is the max value, the second-top-item is the minimum value, and
1916 // the third-to-top item is the value to test.
1917 //
1918 // Stack transformation: [... x1 min max] -> [... bool]
1919 func opcodeWithin(op *parsedOpcode, vm *Engine) error {
1920         maxVal, err := vm.dstack.PopInt()
1921         if err != nil {
1922                 return err
1923         }
1924
1925         minVal, err := vm.dstack.PopInt()
1926         if err != nil {
1927                 return err
1928         }
1929
1930         x, err := vm.dstack.PopInt()
1931         if err != nil {
1932                 return err
1933         }
1934
1935         if x >= minVal && x < maxVal {
1936                 vm.dstack.PushInt(scriptNum(1))
1937         } else {
1938                 vm.dstack.PushInt(scriptNum(0))
1939         }
1940         return nil
1941 }
1942
1943 // calcHash calculates the hash of hasher over buf.
1944 func calcHash(buf []byte, hasher hash.Hash) []byte {
1945         hasher.Write(buf)
1946         return hasher.Sum(nil)
1947 }
1948
1949 // opcodeRipemd160 treats the top item of the data stack as raw bytes and
1950 // replaces it with ripemd160(data).
1951 //
1952 // Stack transformation: [... x1] -> [... ripemd160(x1)]
1953 func opcodeRipemd160(op *parsedOpcode, vm *Engine) error {
1954         buf, err := vm.dstack.PopByteArray()
1955         if err != nil {
1956                 return err
1957         }
1958
1959         vm.dstack.PushByteArray(calcHash(buf, ripemd160.New()))
1960         return nil
1961 }
1962
1963 // opcodeSha1 treats the top item of the data stack as raw bytes and replaces it
1964 // with sha1(data).
1965 //
1966 // Stack transformation: [... x1] -> [... sha1(x1)]
1967 func opcodeSha1(op *parsedOpcode, vm *Engine) error {
1968         buf, err := vm.dstack.PopByteArray()
1969         if err != nil {
1970                 return err
1971         }
1972
1973         hash := sha1.Sum(buf)
1974         vm.dstack.PushByteArray(hash[:])
1975         return nil
1976 }
1977
1978 // opcodeSha256 treats the top item of the data stack as raw bytes and replaces
1979 // it with sha256(data).
1980 //
1981 // Stack transformation: [... x1] -> [... sha256(x1)]
1982 func opcodeSha256(op *parsedOpcode, vm *Engine) error {
1983         buf, err := vm.dstack.PopByteArray()
1984         if err != nil {
1985                 return err
1986         }
1987
1988         hash := sha256.Sum256(buf)
1989         vm.dstack.PushByteArray(hash[:])
1990         return nil
1991 }
1992
1993 // opcodeHash160 treats the top item of the data stack as raw bytes and replaces
1994 // it with ripemd160(sha256(data)).
1995 //
1996 // Stack transformation: [... x1] -> [... ripemd160(sha256(x1))]
1997 func opcodeHash160(op *parsedOpcode, vm *Engine) error {
1998         buf, err := vm.dstack.PopByteArray()
1999         if err != nil {
2000                 return err
2001         }
2002
2003         hash := sha256.Sum256(buf)
2004         vm.dstack.PushByteArray(calcHash(hash[:], ripemd160.New()))
2005         return nil
2006 }
2007
2008 // opcodeHash256 treats the top item of the data stack as raw bytes and replaces
2009 // it with sha256(sha256(data)).
2010 //
2011 // Stack transformation: [... x1] -> [... sha256(sha256(x1))]
2012 func opcodeHash256(op *parsedOpcode, vm *Engine) error {
2013         buf, err := vm.dstack.PopByteArray()
2014         if err != nil {
2015                 return err
2016         }
2017
2018         vm.dstack.PushByteArray(chainhash.DoubleHashB(buf))
2019         return nil
2020 }
2021
2022 // opcodeCodeSeparator stores the current script offset as the most recently
2023 // seen OP_CODESEPARATOR which is used during signature checking.
2024 //
2025 // This opcode does not change the contents of the data stack.
2026 func opcodeCodeSeparator(op *parsedOpcode, vm *Engine) error {
2027         vm.lastCodeSep = vm.scriptOff
2028         return nil
2029 }
2030
2031 // opcodeCheckSig treats the top 2 items on the stack as a public key and a
2032 // signature and replaces them with a bool which indicates if the signature was
2033 // successfully verified.
2034 //
2035 // The process of verifying a signature requires calculating a signature hash in
2036 // the same way the transaction signer did.  It involves hashing portions of the
2037 // transaction based on the hash type byte (which is the final byte of the
2038 // signature) and the portion of the script starting from the most recent
2039 // OP_CODESEPARATOR (or the beginning of the script if there are none) to the
2040 // end of the script (with any other OP_CODESEPARATORs removed).  Once this
2041 // "script hash" is calculated, the signature is checked using standard
2042 // cryptographic methods against the provided public key.
2043 //
2044 // Stack transformation: [... signature pubkey] -> [... bool]
2045 func opcodeCheckSig(op *parsedOpcode, vm *Engine) error {
2046         pkBytes, err := vm.dstack.PopByteArray()
2047         if err != nil {
2048                 return err
2049         }
2050
2051         fullSigBytes, err := vm.dstack.PopByteArray()
2052         if err != nil {
2053                 return err
2054         }
2055
2056         // The signature actually needs needs to be longer than this, but at
2057         // least 1 byte is needed for the hash type below.  The full length is
2058         // checked depending on the script flags and upon parsing the signature.
2059         if len(fullSigBytes) < 1 {
2060                 vm.dstack.PushBool(false)
2061                 return nil
2062         }
2063
2064         // Trim off hashtype from the signature string and check if the
2065         // signature and pubkey conform to the strict encoding requirements
2066         // depending on the flags.
2067         //
2068         // NOTE: When the strict encoding flags are set, any errors in the
2069         // signature or public encoding here result in an immediate script error
2070         // (and thus no result bool is pushed to the data stack).  This differs
2071         // from the logic below where any errors in parsing the signature is
2072         // treated as the signature failure resulting in false being pushed to
2073         // the data stack.  This is required because the more general script
2074         // validation consensus rules do not have the new strict encoding
2075         // requirements enabled by the flags.
2076         hashType := SigHashType(fullSigBytes[len(fullSigBytes)-1])
2077         sigBytes := fullSigBytes[:len(fullSigBytes)-1]
2078         if err := vm.checkHashTypeEncoding(hashType); err != nil {
2079                 return err
2080         }
2081         if err := vm.checkSignatureEncoding(sigBytes); err != nil {
2082                 return err
2083         }
2084         if err := vm.checkPubKeyEncoding(pkBytes); err != nil {
2085                 return err
2086         }
2087
2088         // Get script starting from the most recent OP_CODESEPARATOR.
2089         subScript := vm.subScript()
2090
2091         // Generate the signature hash based on the signature hash type.
2092         var hash []byte
2093         if vm.isWitnessVersionActive(0) {
2094                 var sigHashes *TxSigHashes
2095                 if vm.hashCache != nil {
2096                         sigHashes = vm.hashCache
2097                 } else {
2098                         sigHashes = NewTxSigHashes(&vm.tx)
2099                 }
2100
2101                 hash, err = calcWitnessSignatureHash(subScript, sigHashes, hashType,
2102                         &vm.tx, vm.txIdx, vm.inputAmount)
2103                 if err != nil {
2104                         return err
2105                 }
2106         } else {
2107                 // Remove the signature since there is no way for a signature
2108                 // to sign itself.
2109                 subScript = removeOpcodeByData(subScript, fullSigBytes)
2110
2111                 hash = calcSignatureHash(subScript, hashType, &vm.tx, vm.txIdx)
2112         }
2113
2114         pubKey, err := btcec.ParsePubKey(pkBytes, btcec.S256())
2115         if err != nil {
2116                 vm.dstack.PushBool(false)
2117                 return nil
2118         }
2119
2120         var signature *btcec.Signature
2121         if vm.hasFlag(ScriptVerifyStrictEncoding) ||
2122                 vm.hasFlag(ScriptVerifyDERSignatures) {
2123
2124                 signature, err = btcec.ParseDERSignature(sigBytes, btcec.S256())
2125         } else {
2126                 signature, err = btcec.ParseSignature(sigBytes, btcec.S256())
2127         }
2128         if err != nil {
2129                 vm.dstack.PushBool(false)
2130                 return nil
2131         }
2132
2133         var valid bool
2134         if vm.sigCache != nil {
2135                 var sigHash chainhash.Hash
2136                 copy(sigHash[:], hash)
2137
2138                 valid = vm.sigCache.Exists(sigHash, signature, pubKey)
2139                 if !valid && signature.Verify(hash, pubKey) {
2140                         vm.sigCache.Add(sigHash, signature, pubKey)
2141                         valid = true
2142                 }
2143         } else {
2144                 valid = signature.Verify(hash, pubKey)
2145         }
2146
2147         if !valid && vm.hasFlag(ScriptVerifyNullFail) && len(sigBytes) > 0 {
2148                 str := "signature not empty on failed checksig"
2149                 return scriptError(ErrNullFail, str)
2150         }
2151
2152         vm.dstack.PushBool(valid)
2153         return nil
2154 }
2155
2156 // opcodeCheckSigVerify is a combination of opcodeCheckSig and opcodeVerify.
2157 // The opcodeCheckSig function is invoked followed by opcodeVerify.  See the
2158 // documentation for each of those opcodes for more details.
2159 //
2160 // Stack transformation: signature pubkey] -> [... bool] -> [...]
2161 func opcodeCheckSigVerify(op *parsedOpcode, vm *Engine) error {
2162         err := opcodeCheckSig(op, vm)
2163         if err == nil {
2164                 err = abstractVerify(op, vm, ErrCheckSigVerify)
2165         }
2166         return err
2167 }
2168
2169 // parsedSigInfo houses a raw signature along with its parsed form and a flag
2170 // for whether or not it has already been parsed.  It is used to prevent parsing
2171 // the same signature multiple times when verifying a multisig.
2172 type parsedSigInfo struct {
2173         signature       []byte
2174         parsedSignature *btcec.Signature
2175         parsed          bool
2176 }
2177
2178 // opcodeCheckMultiSig treats the top item on the stack as an integer number of
2179 // public keys, followed by that many entries as raw data representing the public
2180 // keys, followed by the integer number of signatures, followed by that many
2181 // entries as raw data representing the signatures.
2182 //
2183 // Due to a bug in the original Satoshi client implementation, an additional
2184 // dummy argument is also required by the consensus rules, although it is not
2185 // used.  The dummy value SHOULD be an OP_0, although that is not required by
2186 // the consensus rules.  When the ScriptStrictMultiSig flag is set, it must be
2187 // OP_0.
2188 //
2189 // All of the aforementioned stack items are replaced with a bool which
2190 // indicates if the requisite number of signatures were successfully verified.
2191 //
2192 // See the opcodeCheckSigVerify documentation for more details about the process
2193 // for verifying each signature.
2194 //
2195 // Stack transformation:
2196 // [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool]
2197 func opcodeCheckMultiSig(op *parsedOpcode, vm *Engine) error {
2198         numKeys, err := vm.dstack.PopInt()
2199         if err != nil {
2200                 return err
2201         }
2202
2203         numPubKeys := int(numKeys.Int32())
2204         if numPubKeys < 0 {
2205                 str := fmt.Sprintf("number of pubkeys %d is negative",
2206                         numPubKeys)
2207                 return scriptError(ErrInvalidPubKeyCount, str)
2208         }
2209         if numPubKeys > MaxPubKeysPerMultiSig {
2210                 str := fmt.Sprintf("too many pubkeys: %d > %d",
2211                         numPubKeys, MaxPubKeysPerMultiSig)
2212                 return scriptError(ErrInvalidPubKeyCount, str)
2213         }
2214         vm.numOps += numPubKeys
2215         if vm.numOps > MaxOpsPerScript {
2216                 str := fmt.Sprintf("exceeded max operation limit of %d",
2217                         MaxOpsPerScript)
2218                 return scriptError(ErrTooManyOperations, str)
2219         }
2220
2221         pubKeys := make([][]byte, 0, numPubKeys)
2222         for i := 0; i < numPubKeys; i++ {
2223                 pubKey, err := vm.dstack.PopByteArray()
2224                 if err != nil {
2225                         return err
2226                 }
2227                 pubKeys = append(pubKeys, pubKey)
2228         }
2229
2230         numSigs, err := vm.dstack.PopInt()
2231         if err != nil {
2232                 return err
2233         }
2234         numSignatures := int(numSigs.Int32())
2235         if numSignatures < 0 {
2236                 str := fmt.Sprintf("number of signatures %d is negative",
2237                         numSignatures)
2238                 return scriptError(ErrInvalidSignatureCount, str)
2239
2240         }
2241         if numSignatures > numPubKeys {
2242                 str := fmt.Sprintf("more signatures than pubkeys: %d > %d",
2243                         numSignatures, numPubKeys)
2244                 return scriptError(ErrInvalidSignatureCount, str)
2245         }
2246
2247         signatures := make([]*parsedSigInfo, 0, numSignatures)
2248         for i := 0; i < numSignatures; i++ {
2249                 signature, err := vm.dstack.PopByteArray()
2250                 if err != nil {
2251                         return err
2252                 }
2253                 sigInfo := &parsedSigInfo{signature: signature}
2254                 signatures = append(signatures, sigInfo)
2255         }
2256
2257         // A bug in the original Satoshi client implementation means one more
2258         // stack value than should be used must be popped.  Unfortunately, this
2259         // buggy behavior is now part of the consensus and a hard fork would be
2260         // required to fix it.
2261         dummy, err := vm.dstack.PopByteArray()
2262         if err != nil {
2263                 return err
2264         }
2265
2266         // Since the dummy argument is otherwise not checked, it could be any
2267         // value which unfortunately provides a source of malleability.  Thus,
2268         // there is a script flag to force an error when the value is NOT 0.
2269         if vm.hasFlag(ScriptStrictMultiSig) && len(dummy) != 0 {
2270                 str := fmt.Sprintf("multisig dummy argument has length %d "+
2271                         "instead of 0", len(dummy))
2272                 return scriptError(ErrSigNullDummy, str)
2273         }
2274
2275         // Get script starting from the most recent OP_CODESEPARATOR.
2276         script := vm.subScript()
2277
2278         // Remove the signature in pre version 0 segwit scripts since there is
2279         // no way for a signature to sign itself.
2280         if !vm.isWitnessVersionActive(0) {
2281                 for _, sigInfo := range signatures {
2282                         script = removeOpcodeByData(script, sigInfo.signature)
2283                 }
2284         }
2285
2286         success := true
2287         numPubKeys++
2288         pubKeyIdx := -1
2289         signatureIdx := 0
2290         for numSignatures > 0 {
2291                 // When there are more signatures than public keys remaining,
2292                 // there is no way to succeed since too many signatures are
2293                 // invalid, so exit early.
2294                 pubKeyIdx++
2295                 numPubKeys--
2296                 if numSignatures > numPubKeys {
2297                         success = false
2298                         break
2299                 }
2300
2301                 sigInfo := signatures[signatureIdx]
2302                 pubKey := pubKeys[pubKeyIdx]
2303
2304                 // The order of the signature and public key evaluation is
2305                 // important here since it can be distinguished by an
2306                 // OP_CHECKMULTISIG NOT when the strict encoding flag is set.
2307
2308                 rawSig := sigInfo.signature
2309                 if len(rawSig) == 0 {
2310                         // Skip to the next pubkey if signature is empty.
2311                         continue
2312                 }
2313
2314                 // Split the signature into hash type and signature components.
2315                 hashType := SigHashType(rawSig[len(rawSig)-1])
2316                 signature := rawSig[:len(rawSig)-1]
2317
2318                 // Only parse and check the signature encoding once.
2319                 var parsedSig *btcec.Signature
2320                 if !sigInfo.parsed {
2321                         if err := vm.checkHashTypeEncoding(hashType); err != nil {
2322                                 return err
2323                         }
2324                         if err := vm.checkSignatureEncoding(signature); err != nil {
2325                                 return err
2326                         }
2327
2328                         // Parse the signature.
2329                         var err error
2330                         if vm.hasFlag(ScriptVerifyStrictEncoding) ||
2331                                 vm.hasFlag(ScriptVerifyDERSignatures) {
2332
2333                                 parsedSig, err = btcec.ParseDERSignature(signature,
2334                                         btcec.S256())
2335                         } else {
2336                                 parsedSig, err = btcec.ParseSignature(signature,
2337                                         btcec.S256())
2338                         }
2339                         sigInfo.parsed = true
2340                         if err != nil {
2341                                 continue
2342                         }
2343                         sigInfo.parsedSignature = parsedSig
2344                 } else {
2345                         // Skip to the next pubkey if the signature is invalid.
2346                         if sigInfo.parsedSignature == nil {
2347                                 continue
2348                         }
2349
2350                         // Use the already parsed signature.
2351                         parsedSig = sigInfo.parsedSignature
2352                 }
2353
2354                 if err := vm.checkPubKeyEncoding(pubKey); err != nil {
2355                         return err
2356                 }
2357
2358                 // Parse the pubkey.
2359                 parsedPubKey, err := btcec.ParsePubKey(pubKey, btcec.S256())
2360                 if err != nil {
2361                         continue
2362                 }
2363
2364                 // Generate the signature hash based on the signature hash type.
2365                 var hash []byte
2366                 if vm.isWitnessVersionActive(0) {
2367                         var sigHashes *TxSigHashes
2368                         if vm.hashCache != nil {
2369                                 sigHashes = vm.hashCache
2370                         } else {
2371                                 sigHashes = NewTxSigHashes(&vm.tx)
2372                         }
2373
2374                         hash, err = calcWitnessSignatureHash(script, sigHashes, hashType,
2375                                 &vm.tx, vm.txIdx, vm.inputAmount)
2376                         if err != nil {
2377                                 return err
2378                         }
2379                 } else {
2380                         hash = calcSignatureHash(script, hashType, &vm.tx, vm.txIdx)
2381                 }
2382
2383                 var valid bool
2384                 if vm.sigCache != nil {
2385                         var sigHash chainhash.Hash
2386                         copy(sigHash[:], hash)
2387
2388                         valid = vm.sigCache.Exists(sigHash, parsedSig, parsedPubKey)
2389                         if !valid && parsedSig.Verify(hash, parsedPubKey) {
2390                                 vm.sigCache.Add(sigHash, parsedSig, parsedPubKey)
2391                                 valid = true
2392                         }
2393                 } else {
2394                         valid = parsedSig.Verify(hash, parsedPubKey)
2395                 }
2396
2397                 if valid {
2398                         // PubKey verified, move on to the next signature.
2399                         signatureIdx++
2400                         numSignatures--
2401                 }
2402         }
2403
2404         if !success && vm.hasFlag(ScriptVerifyNullFail) {
2405                 for _, sig := range signatures {
2406                         if len(sig.signature) > 0 {
2407                                 str := "not all signatures empty on failed checkmultisig"
2408                                 return scriptError(ErrNullFail, str)
2409                         }
2410                 }
2411         }
2412
2413         vm.dstack.PushBool(success)
2414         return nil
2415 }
2416
2417 // opcodeCheckMultiSigVerify is a combination of opcodeCheckMultiSig and
2418 // opcodeVerify.  The opcodeCheckMultiSig is invoked followed by opcodeVerify.
2419 // See the documentation for each of those opcodes for more details.
2420 //
2421 // Stack transformation:
2422 // [... dummy [sig ...] numsigs [pubkey ...] numpubkeys] -> [... bool] -> [...]
2423 func opcodeCheckMultiSigVerify(op *parsedOpcode, vm *Engine) error {
2424         err := opcodeCheckMultiSig(op, vm)
2425         if err == nil {
2426                 err = abstractVerify(op, vm, ErrCheckMultiSigVerify)
2427         }
2428         return err
2429 }
2430
2431 // OpcodeByName is a map that can be used to lookup an opcode by its
2432 // human-readable name (OP_CHECKMULTISIG, OP_CHECKSIG, etc).
2433 var OpcodeByName = make(map[string]byte)
2434
2435 func init() {
2436         // Initialize the opcode name to value map using the contents of the
2437         // opcode array.  Also add entries for "OP_FALSE", "OP_TRUE", and
2438         // "OP_NOP2" since they are aliases for "OP_0", "OP_1",
2439         // and "OP_CHECKLOCKTIMEVERIFY" respectively.
2440         for _, op := range opcodeArray {
2441                 OpcodeByName[op.name] = op.value
2442         }
2443         OpcodeByName["OP_FALSE"] = OP_FALSE
2444         OpcodeByName["OP_TRUE"] = OP_TRUE
2445         OpcodeByName["OP_NOP2"] = OP_CHECKLOCKTIMEVERIFY
2446         OpcodeByName["OP_NOP3"] = OP_CHECKSEQUENCEVERIFY
2447 }