Dash Core  0.12.2.1
P2P Digital Currency
script.py
Go to the documentation of this file.
1 #
2 # script.py
3 #
4 # This file is modified from python-bitcoinlib.
5 #
6 # Distributed under the MIT/X11 software license, see the accompanying
7 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
8 #
9 
10 """Scripts
11 
12 Functionality to build scripts, as well as SignatureHash().
13 """
14 
15 from __future__ import absolute_import, division, print_function, unicode_literals
16 
17 from .mininode import CTransaction, CTxOut, hash256
18 from binascii import hexlify
19 
20 import sys
21 bchr = chr
22 bord = ord
23 if sys.version > '3':
24  long = int
25  bchr = lambda x: bytes([x])
26  bord = lambda x: x
27 
28 import struct
29 
30 from .bignum import bn2vch
31 
32 MAX_SCRIPT_SIZE = 10000
33 MAX_SCRIPT_ELEMENT_SIZE = 520
34 MAX_SCRIPT_OPCODES = 201
35 
36 OPCODE_NAMES = {}
37 
38 _opcode_instances = []
39 class CScriptOp(int):
40  """A single script opcode"""
41  __slots__ = []
42 
43  @staticmethod
45  """Encode a PUSHDATA op, returning bytes"""
46  if len(d) < 0x4c:
47  return b'' + bchr(len(d)) + d # OP_PUSHDATA
48  elif len(d) <= 0xff:
49  return b'\x4c' + bchr(len(d)) + d # OP_PUSHDATA1
50  elif len(d) <= 0xffff:
51  return b'\x4d' + struct.pack(b'<H', len(d)) + d # OP_PUSHDATA2
52  elif len(d) <= 0xffffffff:
53  return b'\x4e' + struct.pack(b'<I', len(d)) + d # OP_PUSHDATA4
54  else:
55  raise ValueError("Data too long to encode in a PUSHDATA op")
56 
57  @staticmethod
58  def encode_op_n(n):
59  """Encode a small integer op, returning an opcode"""
60  if not (0 <= n <= 16):
61  raise ValueError('Integer must be in range 0 <= n <= 16, got %d' % n)
62 
63  if n == 0:
64  return OP_0
65  else:
66  return CScriptOp(OP_1 + n-1)
67 
68  def decode_op_n(self):
69  """Decode a small integer opcode, returning an integer"""
70  if self == OP_0:
71  return 0
72 
73  if not (self == OP_0 or OP_1 <= self <= OP_16):
74  raise ValueError('op %r is not an OP_N' % self)
75 
76  return int(self - OP_1+1)
77 
78  def is_small_int(self):
79  """Return true if the op pushes a small integer to the stack"""
80  if 0x51 <= self <= 0x60 or self == 0:
81  return True
82  else:
83  return False
84 
85  def __str__(self):
86  return repr(self)
87 
88  def __repr__(self):
89  if self in OPCODE_NAMES:
90  return OPCODE_NAMES[self]
91  else:
92  return 'CScriptOp(0x%x)' % self
93 
94  def __new__(cls, n):
95  try:
96  return _opcode_instances[n]
97  except IndexError:
98  assert len(_opcode_instances) == n
99  _opcode_instances.append(super(CScriptOp, cls).__new__(cls, n))
100  return _opcode_instances[n]
101 
102 # Populate opcode instance table
103 for n in range(0xff+1):
104  CScriptOp(n)
105 
106 
107 # push value
108 OP_0 = CScriptOp(0x00)
109 OP_FALSE = OP_0
110 OP_PUSHDATA1 = CScriptOp(0x4c)
111 OP_PUSHDATA2 = CScriptOp(0x4d)
112 OP_PUSHDATA4 = CScriptOp(0x4e)
113 OP_1NEGATE = CScriptOp(0x4f)
114 OP_RESERVED = CScriptOp(0x50)
115 OP_1 = CScriptOp(0x51)
116 OP_TRUE=OP_1
117 OP_2 = CScriptOp(0x52)
118 OP_3 = CScriptOp(0x53)
119 OP_4 = CScriptOp(0x54)
120 OP_5 = CScriptOp(0x55)
121 OP_6 = CScriptOp(0x56)
122 OP_7 = CScriptOp(0x57)
123 OP_8 = CScriptOp(0x58)
124 OP_9 = CScriptOp(0x59)
125 OP_10 = CScriptOp(0x5a)
126 OP_11 = CScriptOp(0x5b)
127 OP_12 = CScriptOp(0x5c)
128 OP_13 = CScriptOp(0x5d)
129 OP_14 = CScriptOp(0x5e)
130 OP_15 = CScriptOp(0x5f)
131 OP_16 = CScriptOp(0x60)
132 
133 # control
134 OP_NOP = CScriptOp(0x61)
135 OP_VER = CScriptOp(0x62)
136 OP_IF = CScriptOp(0x63)
137 OP_NOTIF = CScriptOp(0x64)
138 OP_VERIF = CScriptOp(0x65)
139 OP_VERNOTIF = CScriptOp(0x66)
140 OP_ELSE = CScriptOp(0x67)
141 OP_ENDIF = CScriptOp(0x68)
142 OP_VERIFY = CScriptOp(0x69)
143 OP_RETURN = CScriptOp(0x6a)
144 
145 # stack ops
146 OP_TOALTSTACK = CScriptOp(0x6b)
147 OP_FROMALTSTACK = CScriptOp(0x6c)
148 OP_2DROP = CScriptOp(0x6d)
149 OP_2DUP = CScriptOp(0x6e)
150 OP_3DUP = CScriptOp(0x6f)
151 OP_2OVER = CScriptOp(0x70)
152 OP_2ROT = CScriptOp(0x71)
153 OP_2SWAP = CScriptOp(0x72)
154 OP_IFDUP = CScriptOp(0x73)
155 OP_DEPTH = CScriptOp(0x74)
156 OP_DROP = CScriptOp(0x75)
157 OP_DUP = CScriptOp(0x76)
158 OP_NIP = CScriptOp(0x77)
159 OP_OVER = CScriptOp(0x78)
160 OP_PICK = CScriptOp(0x79)
161 OP_ROLL = CScriptOp(0x7a)
162 OP_ROT = CScriptOp(0x7b)
163 OP_SWAP = CScriptOp(0x7c)
164 OP_TUCK = CScriptOp(0x7d)
165 
166 # splice ops
167 OP_CAT = CScriptOp(0x7e)
168 OP_SUBSTR = CScriptOp(0x7f)
169 OP_LEFT = CScriptOp(0x80)
170 OP_RIGHT = CScriptOp(0x81)
171 OP_SIZE = CScriptOp(0x82)
172 
173 # bit logic
174 OP_INVERT = CScriptOp(0x83)
175 OP_AND = CScriptOp(0x84)
176 OP_OR = CScriptOp(0x85)
177 OP_XOR = CScriptOp(0x86)
178 OP_EQUAL = CScriptOp(0x87)
179 OP_EQUALVERIFY = CScriptOp(0x88)
180 OP_RESERVED1 = CScriptOp(0x89)
181 OP_RESERVED2 = CScriptOp(0x8a)
182 
183 # numeric
184 OP_1ADD = CScriptOp(0x8b)
185 OP_1SUB = CScriptOp(0x8c)
186 OP_2MUL = CScriptOp(0x8d)
187 OP_2DIV = CScriptOp(0x8e)
188 OP_NEGATE = CScriptOp(0x8f)
189 OP_ABS = CScriptOp(0x90)
190 OP_NOT = CScriptOp(0x91)
191 OP_0NOTEQUAL = CScriptOp(0x92)
192 
193 OP_ADD = CScriptOp(0x93)
194 OP_SUB = CScriptOp(0x94)
195 OP_MUL = CScriptOp(0x95)
196 OP_DIV = CScriptOp(0x96)
197 OP_MOD = CScriptOp(0x97)
198 OP_LSHIFT = CScriptOp(0x98)
199 OP_RSHIFT = CScriptOp(0x99)
200 
201 OP_BOOLAND = CScriptOp(0x9a)
202 OP_BOOLOR = CScriptOp(0x9b)
203 OP_NUMEQUAL = CScriptOp(0x9c)
204 OP_NUMEQUALVERIFY = CScriptOp(0x9d)
205 OP_NUMNOTEQUAL = CScriptOp(0x9e)
206 OP_LESSTHAN = CScriptOp(0x9f)
207 OP_GREATERTHAN = CScriptOp(0xa0)
208 OP_LESSTHANOREQUAL = CScriptOp(0xa1)
209 OP_GREATERTHANOREQUAL = CScriptOp(0xa2)
210 OP_MIN = CScriptOp(0xa3)
211 OP_MAX = CScriptOp(0xa4)
212 
213 OP_WITHIN = CScriptOp(0xa5)
214 
215 # crypto
216 OP_RIPEMD160 = CScriptOp(0xa6)
217 OP_SHA1 = CScriptOp(0xa7)
218 OP_SHA256 = CScriptOp(0xa8)
219 OP_HASH160 = CScriptOp(0xa9)
220 OP_HASH256 = CScriptOp(0xaa)
221 OP_CODESEPARATOR = CScriptOp(0xab)
222 OP_CHECKSIG = CScriptOp(0xac)
223 OP_CHECKSIGVERIFY = CScriptOp(0xad)
224 OP_CHECKMULTISIG = CScriptOp(0xae)
225 OP_CHECKMULTISIGVERIFY = CScriptOp(0xaf)
226 
227 # expansion
228 OP_NOP1 = CScriptOp(0xb0)
229 OP_CHECKLOCKTIMEVERIFY = CScriptOp(0xb1)
230 OP_CHECKSEQUENCEVERIFY = CScriptOp(0xb2)
231 OP_NOP4 = CScriptOp(0xb3)
232 OP_NOP5 = CScriptOp(0xb4)
233 OP_NOP6 = CScriptOp(0xb5)
234 OP_NOP7 = CScriptOp(0xb6)
235 OP_NOP8 = CScriptOp(0xb7)
236 OP_NOP9 = CScriptOp(0xb8)
237 OP_NOP10 = CScriptOp(0xb9)
238 
239 # template matching params
240 OP_SMALLINTEGER = CScriptOp(0xfa)
241 OP_PUBKEYS = CScriptOp(0xfb)
242 OP_PUBKEYHASH = CScriptOp(0xfd)
243 OP_PUBKEY = CScriptOp(0xfe)
244 
245 OP_INVALIDOPCODE = CScriptOp(0xff)
246 
247 VALID_OPCODES = {
248  OP_1NEGATE,
249  OP_RESERVED,
250  OP_1,
251  OP_2,
252  OP_3,
253  OP_4,
254  OP_5,
255  OP_6,
256  OP_7,
257  OP_8,
258  OP_9,
259  OP_10,
260  OP_11,
261  OP_12,
262  OP_13,
263  OP_14,
264  OP_15,
265  OP_16,
266 
267  OP_NOP,
268  OP_VER,
269  OP_IF,
270  OP_NOTIF,
271  OP_VERIF,
272  OP_VERNOTIF,
273  OP_ELSE,
274  OP_ENDIF,
275  OP_VERIFY,
276  OP_RETURN,
277 
278  OP_TOALTSTACK,
279  OP_FROMALTSTACK,
280  OP_2DROP,
281  OP_2DUP,
282  OP_3DUP,
283  OP_2OVER,
284  OP_2ROT,
285  OP_2SWAP,
286  OP_IFDUP,
287  OP_DEPTH,
288  OP_DROP,
289  OP_DUP,
290  OP_NIP,
291  OP_OVER,
292  OP_PICK,
293  OP_ROLL,
294  OP_ROT,
295  OP_SWAP,
296  OP_TUCK,
297 
298  OP_CAT,
299  OP_SUBSTR,
300  OP_LEFT,
301  OP_RIGHT,
302  OP_SIZE,
303 
304  OP_INVERT,
305  OP_AND,
306  OP_OR,
307  OP_XOR,
308  OP_EQUAL,
309  OP_EQUALVERIFY,
310  OP_RESERVED1,
311  OP_RESERVED2,
312 
313  OP_1ADD,
314  OP_1SUB,
315  OP_2MUL,
316  OP_2DIV,
317  OP_NEGATE,
318  OP_ABS,
319  OP_NOT,
320  OP_0NOTEQUAL,
321 
322  OP_ADD,
323  OP_SUB,
324  OP_MUL,
325  OP_DIV,
326  OP_MOD,
327  OP_LSHIFT,
328  OP_RSHIFT,
329 
330  OP_BOOLAND,
331  OP_BOOLOR,
332  OP_NUMEQUAL,
333  OP_NUMEQUALVERIFY,
334  OP_NUMNOTEQUAL,
335  OP_LESSTHAN,
336  OP_GREATERTHAN,
337  OP_LESSTHANOREQUAL,
338  OP_GREATERTHANOREQUAL,
339  OP_MIN,
340  OP_MAX,
341 
342  OP_WITHIN,
343 
344  OP_RIPEMD160,
345  OP_SHA1,
346  OP_SHA256,
347  OP_HASH160,
348  OP_HASH256,
349  OP_CODESEPARATOR,
350  OP_CHECKSIG,
351  OP_CHECKSIGVERIFY,
352  OP_CHECKMULTISIG,
353  OP_CHECKMULTISIGVERIFY,
354 
355  OP_NOP1,
356  OP_CHECKLOCKTIMEVERIFY,
357  OP_CHECKSEQUENCEVERIFY,
358  OP_NOP4,
359  OP_NOP5,
360  OP_NOP6,
361  OP_NOP7,
362  OP_NOP8,
363  OP_NOP9,
364  OP_NOP10,
365 
366  OP_SMALLINTEGER,
367  OP_PUBKEYS,
368  OP_PUBKEYHASH,
369  OP_PUBKEY,
370 }
371 
372 OPCODE_NAMES.update({
373  OP_0 : 'OP_0',
374  OP_PUSHDATA1 : 'OP_PUSHDATA1',
375  OP_PUSHDATA2 : 'OP_PUSHDATA2',
376  OP_PUSHDATA4 : 'OP_PUSHDATA4',
377  OP_1NEGATE : 'OP_1NEGATE',
378  OP_RESERVED : 'OP_RESERVED',
379  OP_1 : 'OP_1',
380  OP_2 : 'OP_2',
381  OP_3 : 'OP_3',
382  OP_4 : 'OP_4',
383  OP_5 : 'OP_5',
384  OP_6 : 'OP_6',
385  OP_7 : 'OP_7',
386  OP_8 : 'OP_8',
387  OP_9 : 'OP_9',
388  OP_10 : 'OP_10',
389  OP_11 : 'OP_11',
390  OP_12 : 'OP_12',
391  OP_13 : 'OP_13',
392  OP_14 : 'OP_14',
393  OP_15 : 'OP_15',
394  OP_16 : 'OP_16',
395  OP_NOP : 'OP_NOP',
396  OP_VER : 'OP_VER',
397  OP_IF : 'OP_IF',
398  OP_NOTIF : 'OP_NOTIF',
399  OP_VERIF : 'OP_VERIF',
400  OP_VERNOTIF : 'OP_VERNOTIF',
401  OP_ELSE : 'OP_ELSE',
402  OP_ENDIF : 'OP_ENDIF',
403  OP_VERIFY : 'OP_VERIFY',
404  OP_RETURN : 'OP_RETURN',
405  OP_TOALTSTACK : 'OP_TOALTSTACK',
406  OP_FROMALTSTACK : 'OP_FROMALTSTACK',
407  OP_2DROP : 'OP_2DROP',
408  OP_2DUP : 'OP_2DUP',
409  OP_3DUP : 'OP_3DUP',
410  OP_2OVER : 'OP_2OVER',
411  OP_2ROT : 'OP_2ROT',
412  OP_2SWAP : 'OP_2SWAP',
413  OP_IFDUP : 'OP_IFDUP',
414  OP_DEPTH : 'OP_DEPTH',
415  OP_DROP : 'OP_DROP',
416  OP_DUP : 'OP_DUP',
417  OP_NIP : 'OP_NIP',
418  OP_OVER : 'OP_OVER',
419  OP_PICK : 'OP_PICK',
420  OP_ROLL : 'OP_ROLL',
421  OP_ROT : 'OP_ROT',
422  OP_SWAP : 'OP_SWAP',
423  OP_TUCK : 'OP_TUCK',
424  OP_CAT : 'OP_CAT',
425  OP_SUBSTR : 'OP_SUBSTR',
426  OP_LEFT : 'OP_LEFT',
427  OP_RIGHT : 'OP_RIGHT',
428  OP_SIZE : 'OP_SIZE',
429  OP_INVERT : 'OP_INVERT',
430  OP_AND : 'OP_AND',
431  OP_OR : 'OP_OR',
432  OP_XOR : 'OP_XOR',
433  OP_EQUAL : 'OP_EQUAL',
434  OP_EQUALVERIFY : 'OP_EQUALVERIFY',
435  OP_RESERVED1 : 'OP_RESERVED1',
436  OP_RESERVED2 : 'OP_RESERVED2',
437  OP_1ADD : 'OP_1ADD',
438  OP_1SUB : 'OP_1SUB',
439  OP_2MUL : 'OP_2MUL',
440  OP_2DIV : 'OP_2DIV',
441  OP_NEGATE : 'OP_NEGATE',
442  OP_ABS : 'OP_ABS',
443  OP_NOT : 'OP_NOT',
444  OP_0NOTEQUAL : 'OP_0NOTEQUAL',
445  OP_ADD : 'OP_ADD',
446  OP_SUB : 'OP_SUB',
447  OP_MUL : 'OP_MUL',
448  OP_DIV : 'OP_DIV',
449  OP_MOD : 'OP_MOD',
450  OP_LSHIFT : 'OP_LSHIFT',
451  OP_RSHIFT : 'OP_RSHIFT',
452  OP_BOOLAND : 'OP_BOOLAND',
453  OP_BOOLOR : 'OP_BOOLOR',
454  OP_NUMEQUAL : 'OP_NUMEQUAL',
455  OP_NUMEQUALVERIFY : 'OP_NUMEQUALVERIFY',
456  OP_NUMNOTEQUAL : 'OP_NUMNOTEQUAL',
457  OP_LESSTHAN : 'OP_LESSTHAN',
458  OP_GREATERTHAN : 'OP_GREATERTHAN',
459  OP_LESSTHANOREQUAL : 'OP_LESSTHANOREQUAL',
460  OP_GREATERTHANOREQUAL : 'OP_GREATERTHANOREQUAL',
461  OP_MIN : 'OP_MIN',
462  OP_MAX : 'OP_MAX',
463  OP_WITHIN : 'OP_WITHIN',
464  OP_RIPEMD160 : 'OP_RIPEMD160',
465  OP_SHA1 : 'OP_SHA1',
466  OP_SHA256 : 'OP_SHA256',
467  OP_HASH160 : 'OP_HASH160',
468  OP_HASH256 : 'OP_HASH256',
469  OP_CODESEPARATOR : 'OP_CODESEPARATOR',
470  OP_CHECKSIG : 'OP_CHECKSIG',
471  OP_CHECKSIGVERIFY : 'OP_CHECKSIGVERIFY',
472  OP_CHECKMULTISIG : 'OP_CHECKMULTISIG',
473  OP_CHECKMULTISIGVERIFY : 'OP_CHECKMULTISIGVERIFY',
474  OP_NOP1 : 'OP_NOP1',
475  OP_CHECKLOCKTIMEVERIFY : 'OP_CHECKLOCKTIMEVERIFY',
476  OP_CHECKSEQUENCEVERIFY : 'OP_CHECKSEQUENCEVERIFY',
477  OP_NOP4 : 'OP_NOP4',
478  OP_NOP5 : 'OP_NOP5',
479  OP_NOP6 : 'OP_NOP6',
480  OP_NOP7 : 'OP_NOP7',
481  OP_NOP8 : 'OP_NOP8',
482  OP_NOP9 : 'OP_NOP9',
483  OP_NOP10 : 'OP_NOP10',
484  OP_SMALLINTEGER : 'OP_SMALLINTEGER',
485  OP_PUBKEYS : 'OP_PUBKEYS',
486  OP_PUBKEYHASH : 'OP_PUBKEYHASH',
487  OP_PUBKEY : 'OP_PUBKEY',
488  OP_INVALIDOPCODE : 'OP_INVALIDOPCODE',
489 })
490 
491 OPCODES_BY_NAME = {
492  'OP_0' : OP_0,
493  'OP_PUSHDATA1' : OP_PUSHDATA1,
494  'OP_PUSHDATA2' : OP_PUSHDATA2,
495  'OP_PUSHDATA4' : OP_PUSHDATA4,
496  'OP_1NEGATE' : OP_1NEGATE,
497  'OP_RESERVED' : OP_RESERVED,
498  'OP_1' : OP_1,
499  'OP_2' : OP_2,
500  'OP_3' : OP_3,
501  'OP_4' : OP_4,
502  'OP_5' : OP_5,
503  'OP_6' : OP_6,
504  'OP_7' : OP_7,
505  'OP_8' : OP_8,
506  'OP_9' : OP_9,
507  'OP_10' : OP_10,
508  'OP_11' : OP_11,
509  'OP_12' : OP_12,
510  'OP_13' : OP_13,
511  'OP_14' : OP_14,
512  'OP_15' : OP_15,
513  'OP_16' : OP_16,
514  'OP_NOP' : OP_NOP,
515  'OP_VER' : OP_VER,
516  'OP_IF' : OP_IF,
517  'OP_NOTIF' : OP_NOTIF,
518  'OP_VERIF' : OP_VERIF,
519  'OP_VERNOTIF' : OP_VERNOTIF,
520  'OP_ELSE' : OP_ELSE,
521  'OP_ENDIF' : OP_ENDIF,
522  'OP_VERIFY' : OP_VERIFY,
523  'OP_RETURN' : OP_RETURN,
524  'OP_TOALTSTACK' : OP_TOALTSTACK,
525  'OP_FROMALTSTACK' : OP_FROMALTSTACK,
526  'OP_2DROP' : OP_2DROP,
527  'OP_2DUP' : OP_2DUP,
528  'OP_3DUP' : OP_3DUP,
529  'OP_2OVER' : OP_2OVER,
530  'OP_2ROT' : OP_2ROT,
531  'OP_2SWAP' : OP_2SWAP,
532  'OP_IFDUP' : OP_IFDUP,
533  'OP_DEPTH' : OP_DEPTH,
534  'OP_DROP' : OP_DROP,
535  'OP_DUP' : OP_DUP,
536  'OP_NIP' : OP_NIP,
537  'OP_OVER' : OP_OVER,
538  'OP_PICK' : OP_PICK,
539  'OP_ROLL' : OP_ROLL,
540  'OP_ROT' : OP_ROT,
541  'OP_SWAP' : OP_SWAP,
542  'OP_TUCK' : OP_TUCK,
543  'OP_CAT' : OP_CAT,
544  'OP_SUBSTR' : OP_SUBSTR,
545  'OP_LEFT' : OP_LEFT,
546  'OP_RIGHT' : OP_RIGHT,
547  'OP_SIZE' : OP_SIZE,
548  'OP_INVERT' : OP_INVERT,
549  'OP_AND' : OP_AND,
550  'OP_OR' : OP_OR,
551  'OP_XOR' : OP_XOR,
552  'OP_EQUAL' : OP_EQUAL,
553  'OP_EQUALVERIFY' : OP_EQUALVERIFY,
554  'OP_RESERVED1' : OP_RESERVED1,
555  'OP_RESERVED2' : OP_RESERVED2,
556  'OP_1ADD' : OP_1ADD,
557  'OP_1SUB' : OP_1SUB,
558  'OP_2MUL' : OP_2MUL,
559  'OP_2DIV' : OP_2DIV,
560  'OP_NEGATE' : OP_NEGATE,
561  'OP_ABS' : OP_ABS,
562  'OP_NOT' : OP_NOT,
563  'OP_0NOTEQUAL' : OP_0NOTEQUAL,
564  'OP_ADD' : OP_ADD,
565  'OP_SUB' : OP_SUB,
566  'OP_MUL' : OP_MUL,
567  'OP_DIV' : OP_DIV,
568  'OP_MOD' : OP_MOD,
569  'OP_LSHIFT' : OP_LSHIFT,
570  'OP_RSHIFT' : OP_RSHIFT,
571  'OP_BOOLAND' : OP_BOOLAND,
572  'OP_BOOLOR' : OP_BOOLOR,
573  'OP_NUMEQUAL' : OP_NUMEQUAL,
574  'OP_NUMEQUALVERIFY' : OP_NUMEQUALVERIFY,
575  'OP_NUMNOTEQUAL' : OP_NUMNOTEQUAL,
576  'OP_LESSTHAN' : OP_LESSTHAN,
577  'OP_GREATERTHAN' : OP_GREATERTHAN,
578  'OP_LESSTHANOREQUAL' : OP_LESSTHANOREQUAL,
579  'OP_GREATERTHANOREQUAL' : OP_GREATERTHANOREQUAL,
580  'OP_MIN' : OP_MIN,
581  'OP_MAX' : OP_MAX,
582  'OP_WITHIN' : OP_WITHIN,
583  'OP_RIPEMD160' : OP_RIPEMD160,
584  'OP_SHA1' : OP_SHA1,
585  'OP_SHA256' : OP_SHA256,
586  'OP_HASH160' : OP_HASH160,
587  'OP_HASH256' : OP_HASH256,
588  'OP_CODESEPARATOR' : OP_CODESEPARATOR,
589  'OP_CHECKSIG' : OP_CHECKSIG,
590  'OP_CHECKSIGVERIFY' : OP_CHECKSIGVERIFY,
591  'OP_CHECKMULTISIG' : OP_CHECKMULTISIG,
592  'OP_CHECKMULTISIGVERIFY' : OP_CHECKMULTISIGVERIFY,
593  'OP_NOP1' : OP_NOP1,
594  'OP_CHECKLOCKTIMEVERIFY' : OP_CHECKLOCKTIMEVERIFY,
595  'OP_CHECKSEQUENCEVERIFY' : OP_CHECKSEQUENCEVERIFY,
596  'OP_NOP4' : OP_NOP4,
597  'OP_NOP5' : OP_NOP5,
598  'OP_NOP6' : OP_NOP6,
599  'OP_NOP7' : OP_NOP7,
600  'OP_NOP8' : OP_NOP8,
601  'OP_NOP9' : OP_NOP9,
602  'OP_NOP10' : OP_NOP10,
603  'OP_SMALLINTEGER' : OP_SMALLINTEGER,
604  'OP_PUBKEYS' : OP_PUBKEYS,
605  'OP_PUBKEYHASH' : OP_PUBKEYHASH,
606  'OP_PUBKEY' : OP_PUBKEY,
607 }
608 
609 class CScriptInvalidError(Exception):
610  """Base class for CScript exceptions"""
611  pass
612 
613 class CScriptTruncatedPushDataError(CScriptInvalidError):
614  """Invalid pushdata due to truncation"""
615  def __init__(self, msg, data):
616  self.data = data
617  super(CScriptTruncatedPushDataError, self).__init__(msg)
618 
619 # This is used, eg, for blockchain heights in coinbase scripts (bip34)
620 class CScriptNum(object):
621  def __init__(self, d=0):
622  self.value = d
623 
624  @staticmethod
625  def encode(obj):
626  r = bytearray(0)
627  if obj.value == 0:
628  return bytes(r)
629  neg = obj.value < 0
630  absvalue = -obj.value if neg else obj.value
631  while (absvalue):
632  r.append(absvalue & 0xff)
633  absvalue >>= 8
634  if r[-1] & 0x80:
635  r.append(0x80 if neg else 0)
636  elif neg:
637  r[-1] |= 0x80
638  return bytes(bchr(len(r)) + r)
639 
640 
641 class CScript(bytes):
642  """Serialized script
643 
644  A bytes subclass, so you can use this directly whenever bytes are accepted.
645  Note that this means that indexing does *not* work - you'll get an index by
646  byte rather than opcode. This format was chosen for efficiency so that the
647  general case would not require creating a lot of little CScriptOP objects.
648 
649  iter(script) however does iterate by opcode.
650  """
651  @classmethod
652  def __coerce_instance(cls, other):
653  # Coerce other into bytes
654  if isinstance(other, CScriptOp):
655  other = bchr(other)
656  elif isinstance(other, CScriptNum):
657  if (other.value == 0):
658  other = bchr(CScriptOp(OP_0))
659  else:
660  other = CScriptNum.encode(other)
661  elif isinstance(other, (int, long)):
662  if 0 <= other <= 16:
663  other = bytes(bchr(CScriptOp.encode_op_n(other)))
664  elif other == -1:
665  other = bytes(bchr(OP_1NEGATE))
666  else:
667  other = CScriptOp.encode_op_pushdata(bn2vch(other))
668  elif isinstance(other, (bytes, bytearray)):
669  other = CScriptOp.encode_op_pushdata(other)
670  return other
671 
672  def __add__(self, other):
673  # Do the coercion outside of the try block so that errors in it are
674  # noticed.
675  other = self.__coerce_instance(other)
676 
677  try:
678  # bytes.__add__ always returns bytes instances unfortunately
679  return CScript(super(CScript, self).__add__(other))
680  except TypeError:
681  raise TypeError('Can not add a %r instance to a CScript' % other.__class__)
682 
683  def join(self, iterable):
684  # join makes no sense for a CScript()
685  raise NotImplementedError
686 
687  def __new__(cls, value=b''):
688  if isinstance(value, bytes) or isinstance(value, bytearray):
689  return super(CScript, cls).__new__(cls, value)
690  else:
691  def coerce_iterable(iterable):
692  for instance in iterable:
693  yield cls.__coerce_instance(instance)
694  # Annoyingly on both python2 and python3 bytes.join() always
695  # returns a bytes instance even when subclassed.
696  return super(CScript, cls).__new__(cls, b''.join(coerce_iterable(value)))
697 
698  def raw_iter(self):
699  """Raw iteration
700 
701  Yields tuples of (opcode, data, sop_idx) so that the different possible
702  PUSHDATA encodings can be accurately distinguished, as well as
703  determining the exact opcode byte indexes. (sop_idx)
704  """
705  i = 0
706  while i < len(self):
707  sop_idx = i
708  opcode = bord(self[i])
709  i += 1
710 
711  if opcode > OP_PUSHDATA4:
712  yield (opcode, None, sop_idx)
713  else:
714  datasize = None
715  pushdata_type = None
716  if opcode < OP_PUSHDATA1:
717  pushdata_type = 'PUSHDATA(%d)' % opcode
718  datasize = opcode
719 
720  elif opcode == OP_PUSHDATA1:
721  pushdata_type = 'PUSHDATA1'
722  if i >= len(self):
723  raise CScriptInvalidError('PUSHDATA1: missing data length')
724  datasize = bord(self[i])
725  i += 1
726 
727  elif opcode == OP_PUSHDATA2:
728  pushdata_type = 'PUSHDATA2'
729  if i + 1 >= len(self):
730  raise CScriptInvalidError('PUSHDATA2: missing data length')
731  datasize = bord(self[i]) + (bord(self[i+1]) << 8)
732  i += 2
733 
734  elif opcode == OP_PUSHDATA4:
735  pushdata_type = 'PUSHDATA4'
736  if i + 3 >= len(self):
737  raise CScriptInvalidError('PUSHDATA4: missing data length')
738  datasize = bord(self[i]) + (bord(self[i+1]) << 8) + (bord(self[i+2]) << 16) + (bord(self[i+3]) << 24)
739  i += 4
740 
741  else:
742  assert False # shouldn't happen
743 
744 
745  data = bytes(self[i:i+datasize])
746 
747  # Check for truncation
748  if len(data) < datasize:
749  raise CScriptTruncatedPushDataError('%s: truncated data' % pushdata_type, data)
750 
751  i += datasize
752 
753  yield (opcode, data, sop_idx)
754 
755  def __iter__(self):
756  """'Cooked' iteration
757 
758  Returns either a CScriptOP instance, an integer, or bytes, as
759  appropriate.
760 
761  See raw_iter() if you need to distinguish the different possible
762  PUSHDATA encodings.
763  """
764  for (opcode, data, sop_idx) in self.raw_iter():
765  if data is not None:
766  yield data
767  else:
768  opcode = CScriptOp(opcode)
769 
770  if opcode.is_small_int():
771  yield opcode.decode_op_n()
772  else:
773  yield CScriptOp(opcode)
774 
775  def __repr__(self):
776  # For Python3 compatibility add b before strings so testcases don't
777  # need to change
778  def _repr(o):
779  if isinstance(o, bytes):
780  return b"x('%s')" % hexlify(o).decode('ascii')
781  else:
782  return repr(o)
783 
784  ops = []
785  i = iter(self)
786  while True:
787  op = None
788  try:
789  op = _repr(next(i))
790  except CScriptTruncatedPushDataError as err:
791  op = '%s...<ERROR: %s>' % (_repr(err.data), err)
792  break
793  except CScriptInvalidError as err:
794  op = '<ERROR: %s>' % err
795  break
796  except StopIteration:
797  break
798  finally:
799  if op is not None:
800  ops.append(op)
801 
802  return "CScript([%s])" % ', '.join(ops)
803 
804  def GetSigOpCount(self, fAccurate):
805  """Get the SigOp count.
806 
807  fAccurate - Accurately count CHECKMULTISIG, see BIP16 for details.
808 
809  Note that this is consensus-critical.
810  """
811  n = 0
812  lastOpcode = OP_INVALIDOPCODE
813  for (opcode, data, sop_idx) in self.raw_iter():
814  if opcode in (OP_CHECKSIG, OP_CHECKSIGVERIFY):
815  n += 1
816  elif opcode in (OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY):
817  if fAccurate and (OP_1 <= lastOpcode <= OP_16):
818  n += opcode.decode_op_n()
819  else:
820  n += 20
821  lastOpcode = opcode
822  return n
823 
824 
825 SIGHASH_ALL = 1
826 SIGHASH_NONE = 2
827 SIGHASH_SINGLE = 3
828 SIGHASH_ANYONECANPAY = 0x80
829 
830 def FindAndDelete(script, sig):
831  """Consensus critical, see FindAndDelete() in Satoshi codebase"""
832  r = b''
833  last_sop_idx = sop_idx = 0
834  skip = True
835  for (opcode, data, sop_idx) in script.raw_iter():
836  if not skip:
837  r += script[last_sop_idx:sop_idx]
838  last_sop_idx = sop_idx
839  if script[sop_idx:sop_idx + len(sig)] == sig:
840  skip = True
841  else:
842  skip = False
843  if not skip:
844  r += script[last_sop_idx:]
845  return CScript(r)
846 
847 
848 def SignatureHash(script, txTo, inIdx, hashtype):
849  """Consensus-correct SignatureHash
850 
851  Returns (hash, err) to precisely match the consensus-critical behavior of
852  the SIGHASH_SINGLE bug. (inIdx is *not* checked for validity)
853  """
854  HASH_ONE = b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
855 
856  if inIdx >= len(txTo.vin):
857  return (HASH_ONE, "inIdx %d out of range (%d)" % (inIdx, len(txTo.vin)))
858  txtmp = CTransaction(txTo)
859 
860  for txin in txtmp.vin:
861  txin.scriptSig = b''
862  txtmp.vin[inIdx].scriptSig = FindAndDelete(script, CScript([OP_CODESEPARATOR]))
863 
864  if (hashtype & 0x1f) == SIGHASH_NONE:
865  txtmp.vout = []
866 
867  for i in range(len(txtmp.vin)):
868  if i != inIdx:
869  txtmp.vin[i].nSequence = 0
870 
871  elif (hashtype & 0x1f) == SIGHASH_SINGLE:
872  outIdx = inIdx
873  if outIdx >= len(txtmp.vout):
874  return (HASH_ONE, "outIdx %d out of range (%d)" % (outIdx, len(txtmp.vout)))
875 
876  tmp = txtmp.vout[outIdx]
877  txtmp.vout = []
878  for i in range(outIdx):
879  txtmp.vout.append(CTxOut())
880  txtmp.vout.append(tmp)
881 
882  for i in range(len(txtmp.vin)):
883  if i != inIdx:
884  txtmp.vin[i].nSequence = 0
885 
886  if hashtype & SIGHASH_ANYONECANPAY:
887  tmp = txtmp.vin[inIdx]
888  txtmp.vin = []
889  txtmp.vin.append(tmp)
890 
891  s = txtmp.serialize()
892  s += struct.pack(b"<I", hashtype)
893 
894  hash = hash256(s)
895 
896  return (hash, None)
def __add__(self, other)
Definition: script.py:672
def __coerce_instance(cls, other)
Definition: script.py:652
def SignatureHash(script, txTo, inIdx, hashtype)
Definition: script.py:848
def join(self, iterable)
Definition: script.py:683
def FindAndDelete(script, sig)
Definition: script.py:830
def __new__(cls, value=b'')
Definition: script.py:687
def GetSigOpCount(self, fAccurate)
Definition: script.py:804