mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 11:57:28 -03:00
Merge #17319: Tests: remove bignum module
3ed772d221
[tests] remove bignum.py (John Newbery)f950ec2520
[tests] remove bn2bin() (John Newbery)3b9b38579c
[tests] remove bn_bytes() function (John Newbery)a760aa14a9
[tests] remove mpi2vch() function (John Newbery)9a60bef50d
[tests] don't encode the integer size in bignum (John Newbery)1dc68aee66
[tests] add function comments to bignum (John Newbery)f31fc0e92e
[tests] fix flake8 warnings in script.py and bignum.py (John Newbery) Pull request description: Only one function is imported in script.py. Just move that function to script.py and remove the bignum.py module. Remove unused functionality and fix some flake8 warnings along the way. Top commit has no ACKs. Tree-SHA512: 015f543ab545b5d5451896e2751d9c19334d9155b03faacd2023781e89833a2440f7f28741e9a8ac49badd9cdc012cbb6e038cdcdebeefaf9cb9d461c0689157
This commit is contained in:
commit
ad04f0d8a5
3 changed files with 173 additions and 197 deletions
|
@ -134,9 +134,6 @@ Utilities for manipulating transaction scripts (originally from python-bitcoinli
|
|||
#### [key.py](test_framework/key.py)
|
||||
Test-only secp256k1 elliptic curve implementation
|
||||
|
||||
#### [bignum.py](test_framework/bignum.py)
|
||||
Helpers for script.py
|
||||
|
||||
#### [blocktools.py](test_framework/blocktools.py)
|
||||
Helper functions for creating blocks and transactions.
|
||||
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
"""Big number routines.
|
||||
|
||||
This file is copied from python-bitcoinlib.
|
||||
"""
|
||||
|
||||
import struct
|
||||
|
||||
|
||||
# generic big endian MPI format
|
||||
|
||||
def bn_bytes(v, have_ext=False):
|
||||
ext = 0
|
||||
if have_ext:
|
||||
ext = 1
|
||||
return ((v.bit_length()+7)//8) + ext
|
||||
|
||||
def bn2bin(v):
|
||||
s = bytearray()
|
||||
i = bn_bytes(v)
|
||||
while i > 0:
|
||||
s.append((v >> ((i-1) * 8)) & 0xff)
|
||||
i -= 1
|
||||
return s
|
||||
|
||||
def bn2mpi(v):
|
||||
have_ext = False
|
||||
if v.bit_length() > 0:
|
||||
have_ext = (v.bit_length() & 0x07) == 0
|
||||
|
||||
neg = False
|
||||
if v < 0:
|
||||
neg = True
|
||||
v = -v
|
||||
|
||||
s = struct.pack(b">I", bn_bytes(v, have_ext))
|
||||
ext = bytearray()
|
||||
if have_ext:
|
||||
ext.append(0)
|
||||
v_bin = bn2bin(v)
|
||||
if neg:
|
||||
if have_ext:
|
||||
ext[0] |= 0x80
|
||||
else:
|
||||
v_bin[0] |= 0x80
|
||||
return s + ext + v_bin
|
||||
|
||||
# bitcoin-specific little endian format, with implicit size
|
||||
def mpi2vch(s):
|
||||
r = s[4:] # strip size
|
||||
r = r[::-1] # reverse string, converting BE->LE
|
||||
return r
|
||||
|
||||
def bn2vch(v):
|
||||
return bytes(mpi2vch(bn2mpi(v)))
|
|
@ -6,21 +6,59 @@
|
|||
|
||||
This file is modified from python-bitcoinlib.
|
||||
"""
|
||||
|
||||
from .messages import CTransaction, CTxOut, sha256, hash256, uint256_from_str, ser_uint256, ser_string
|
||||
|
||||
import hashlib
|
||||
import struct
|
||||
|
||||
from .bignum import bn2vch
|
||||
from .messages import (
|
||||
CTransaction,
|
||||
CTxOut,
|
||||
hash256,
|
||||
ser_string,
|
||||
ser_uint256,
|
||||
sha256,
|
||||
uint256_from_str,
|
||||
)
|
||||
|
||||
MAX_SCRIPT_ELEMENT_SIZE = 520
|
||||
|
||||
OPCODE_NAMES = {}
|
||||
|
||||
def hash160(s):
|
||||
return hashlib.new('ripemd160', sha256(s)).digest()
|
||||
|
||||
def bn2vch(v):
|
||||
"""Convert number to bitcoin-specific little endian format."""
|
||||
# The top bit is used to indicate the sign of the number. If there
|
||||
# isn't a spare bit in the bit length, add an extension byte.
|
||||
have_ext = False
|
||||
ext = bytearray()
|
||||
if v.bit_length() > 0:
|
||||
have_ext = (v.bit_length() & 0x07) == 0
|
||||
ext.append(0)
|
||||
|
||||
# Is the number negative?
|
||||
neg = False
|
||||
if v < 0:
|
||||
neg = True
|
||||
v = -v
|
||||
|
||||
# Convert the int to bytes
|
||||
v_bin = bytearray()
|
||||
bytes_len = (v.bit_length() + 7) // 8
|
||||
for i in range(bytes_len, 0, -1):
|
||||
v_bin.append((v >> ((i - 1) * 8)) & 0xff)
|
||||
|
||||
# Add the sign bit if necessary
|
||||
if neg:
|
||||
if have_ext:
|
||||
ext[0] |= 0x80
|
||||
else:
|
||||
v_bin[0] |= 0x80
|
||||
|
||||
v_bytes = ext + v_bin
|
||||
# Reverse bytes ordering for LE
|
||||
v_bytes.reverse()
|
||||
|
||||
return bytes(v_bytes)
|
||||
|
||||
_opcode_instances = []
|
||||
class CScriptOp(int):
|
||||
|
@ -31,13 +69,13 @@ class CScriptOp(int):
|
|||
def encode_op_pushdata(d):
|
||||
"""Encode a PUSHDATA op, returning bytes"""
|
||||
if len(d) < 0x4c:
|
||||
return b'' + bytes([len(d)]) + d # OP_PUSHDATA
|
||||
return b'' + bytes([len(d)]) + d # OP_PUSHDATA
|
||||
elif len(d) <= 0xff:
|
||||
return b'\x4c' + bytes([len(d)]) + d # OP_PUSHDATA1
|
||||
return b'\x4c' + bytes([len(d)]) + d # OP_PUSHDATA1
|
||||
elif len(d) <= 0xffff:
|
||||
return b'\x4d' + struct.pack(b'<H', len(d)) + d # OP_PUSHDATA2
|
||||
return b'\x4d' + struct.pack(b'<H', len(d)) + d # OP_PUSHDATA2
|
||||
elif len(d) <= 0xffffffff:
|
||||
return b'\x4e' + struct.pack(b'<I', len(d)) + d # OP_PUSHDATA4
|
||||
return b'\x4e' + struct.pack(b'<I', len(d)) + d # OP_PUSHDATA4
|
||||
else:
|
||||
raise ValueError("Data too long to encode in a PUSHDATA op")
|
||||
|
||||
|
@ -50,7 +88,7 @@ class CScriptOp(int):
|
|||
if n == 0:
|
||||
return OP_0
|
||||
else:
|
||||
return CScriptOp(OP_1 + n-1)
|
||||
return CScriptOp(OP_1 + n - 1)
|
||||
|
||||
def decode_op_n(self):
|
||||
"""Decode a small integer opcode, returning an integer"""
|
||||
|
@ -60,7 +98,7 @@ class CScriptOp(int):
|
|||
if not (self == OP_0 or OP_1 <= self <= OP_16):
|
||||
raise ValueError('op %r is not an OP_N' % self)
|
||||
|
||||
return int(self - OP_1+1)
|
||||
return int(self - OP_1 + 1)
|
||||
|
||||
def is_small_int(self):
|
||||
"""Return true if the op pushes a small integer to the stack"""
|
||||
|
@ -87,7 +125,7 @@ class CScriptOp(int):
|
|||
return _opcode_instances[n]
|
||||
|
||||
# Populate opcode instance table
|
||||
for n in range(0xff+1):
|
||||
for n in range(0xff + 1):
|
||||
CScriptOp(n)
|
||||
|
||||
|
||||
|
@ -100,7 +138,7 @@ OP_PUSHDATA4 = CScriptOp(0x4e)
|
|||
OP_1NEGATE = CScriptOp(0x4f)
|
||||
OP_RESERVED = CScriptOp(0x50)
|
||||
OP_1 = CScriptOp(0x51)
|
||||
OP_TRUE=OP_1
|
||||
OP_TRUE = OP_1
|
||||
OP_2 = CScriptOp(0x52)
|
||||
OP_3 = CScriptOp(0x53)
|
||||
OP_4 = CScriptOp(0x54)
|
||||
|
@ -232,122 +270,122 @@ OP_PUBKEY = CScriptOp(0xfe)
|
|||
OP_INVALIDOPCODE = CScriptOp(0xff)
|
||||
|
||||
OPCODE_NAMES.update({
|
||||
OP_0 : 'OP_0',
|
||||
OP_PUSHDATA1 : 'OP_PUSHDATA1',
|
||||
OP_PUSHDATA2 : 'OP_PUSHDATA2',
|
||||
OP_PUSHDATA4 : 'OP_PUSHDATA4',
|
||||
OP_1NEGATE : 'OP_1NEGATE',
|
||||
OP_RESERVED : 'OP_RESERVED',
|
||||
OP_1 : 'OP_1',
|
||||
OP_2 : 'OP_2',
|
||||
OP_3 : 'OP_3',
|
||||
OP_4 : 'OP_4',
|
||||
OP_5 : 'OP_5',
|
||||
OP_6 : 'OP_6',
|
||||
OP_7 : 'OP_7',
|
||||
OP_8 : 'OP_8',
|
||||
OP_9 : 'OP_9',
|
||||
OP_10 : 'OP_10',
|
||||
OP_11 : 'OP_11',
|
||||
OP_12 : 'OP_12',
|
||||
OP_13 : 'OP_13',
|
||||
OP_14 : 'OP_14',
|
||||
OP_15 : 'OP_15',
|
||||
OP_16 : 'OP_16',
|
||||
OP_NOP : 'OP_NOP',
|
||||
OP_VER : 'OP_VER',
|
||||
OP_IF : 'OP_IF',
|
||||
OP_NOTIF : 'OP_NOTIF',
|
||||
OP_VERIF : 'OP_VERIF',
|
||||
OP_VERNOTIF : 'OP_VERNOTIF',
|
||||
OP_ELSE : 'OP_ELSE',
|
||||
OP_ENDIF : 'OP_ENDIF',
|
||||
OP_VERIFY : 'OP_VERIFY',
|
||||
OP_RETURN : 'OP_RETURN',
|
||||
OP_TOALTSTACK : 'OP_TOALTSTACK',
|
||||
OP_FROMALTSTACK : 'OP_FROMALTSTACK',
|
||||
OP_2DROP : 'OP_2DROP',
|
||||
OP_2DUP : 'OP_2DUP',
|
||||
OP_3DUP : 'OP_3DUP',
|
||||
OP_2OVER : 'OP_2OVER',
|
||||
OP_2ROT : 'OP_2ROT',
|
||||
OP_2SWAP : 'OP_2SWAP',
|
||||
OP_IFDUP : 'OP_IFDUP',
|
||||
OP_DEPTH : 'OP_DEPTH',
|
||||
OP_DROP : 'OP_DROP',
|
||||
OP_DUP : 'OP_DUP',
|
||||
OP_NIP : 'OP_NIP',
|
||||
OP_OVER : 'OP_OVER',
|
||||
OP_PICK : 'OP_PICK',
|
||||
OP_ROLL : 'OP_ROLL',
|
||||
OP_ROT : 'OP_ROT',
|
||||
OP_SWAP : 'OP_SWAP',
|
||||
OP_TUCK : 'OP_TUCK',
|
||||
OP_CAT : 'OP_CAT',
|
||||
OP_SUBSTR : 'OP_SUBSTR',
|
||||
OP_LEFT : 'OP_LEFT',
|
||||
OP_RIGHT : 'OP_RIGHT',
|
||||
OP_SIZE : 'OP_SIZE',
|
||||
OP_INVERT : 'OP_INVERT',
|
||||
OP_AND : 'OP_AND',
|
||||
OP_OR : 'OP_OR',
|
||||
OP_XOR : 'OP_XOR',
|
||||
OP_EQUAL : 'OP_EQUAL',
|
||||
OP_EQUALVERIFY : 'OP_EQUALVERIFY',
|
||||
OP_RESERVED1 : 'OP_RESERVED1',
|
||||
OP_RESERVED2 : 'OP_RESERVED2',
|
||||
OP_1ADD : 'OP_1ADD',
|
||||
OP_1SUB : 'OP_1SUB',
|
||||
OP_2MUL : 'OP_2MUL',
|
||||
OP_2DIV : 'OP_2DIV',
|
||||
OP_NEGATE : 'OP_NEGATE',
|
||||
OP_ABS : 'OP_ABS',
|
||||
OP_NOT : 'OP_NOT',
|
||||
OP_0NOTEQUAL : 'OP_0NOTEQUAL',
|
||||
OP_ADD : 'OP_ADD',
|
||||
OP_SUB : 'OP_SUB',
|
||||
OP_MUL : 'OP_MUL',
|
||||
OP_DIV : 'OP_DIV',
|
||||
OP_MOD : 'OP_MOD',
|
||||
OP_LSHIFT : 'OP_LSHIFT',
|
||||
OP_RSHIFT : 'OP_RSHIFT',
|
||||
OP_BOOLAND : 'OP_BOOLAND',
|
||||
OP_BOOLOR : 'OP_BOOLOR',
|
||||
OP_NUMEQUAL : 'OP_NUMEQUAL',
|
||||
OP_NUMEQUALVERIFY : 'OP_NUMEQUALVERIFY',
|
||||
OP_NUMNOTEQUAL : 'OP_NUMNOTEQUAL',
|
||||
OP_LESSTHAN : 'OP_LESSTHAN',
|
||||
OP_GREATERTHAN : 'OP_GREATERTHAN',
|
||||
OP_LESSTHANOREQUAL : 'OP_LESSTHANOREQUAL',
|
||||
OP_GREATERTHANOREQUAL : 'OP_GREATERTHANOREQUAL',
|
||||
OP_MIN : 'OP_MIN',
|
||||
OP_MAX : 'OP_MAX',
|
||||
OP_WITHIN : 'OP_WITHIN',
|
||||
OP_RIPEMD160 : 'OP_RIPEMD160',
|
||||
OP_SHA1 : 'OP_SHA1',
|
||||
OP_SHA256 : 'OP_SHA256',
|
||||
OP_HASH160 : 'OP_HASH160',
|
||||
OP_HASH256 : 'OP_HASH256',
|
||||
OP_CODESEPARATOR : 'OP_CODESEPARATOR',
|
||||
OP_CHECKSIG : 'OP_CHECKSIG',
|
||||
OP_CHECKSIGVERIFY : 'OP_CHECKSIGVERIFY',
|
||||
OP_CHECKMULTISIG : 'OP_CHECKMULTISIG',
|
||||
OP_CHECKMULTISIGVERIFY : 'OP_CHECKMULTISIGVERIFY',
|
||||
OP_NOP1 : 'OP_NOP1',
|
||||
OP_CHECKLOCKTIMEVERIFY : 'OP_CHECKLOCKTIMEVERIFY',
|
||||
OP_CHECKSEQUENCEVERIFY : 'OP_CHECKSEQUENCEVERIFY',
|
||||
OP_NOP4 : 'OP_NOP4',
|
||||
OP_NOP5 : 'OP_NOP5',
|
||||
OP_NOP6 : 'OP_NOP6',
|
||||
OP_NOP7 : 'OP_NOP7',
|
||||
OP_NOP8 : 'OP_NOP8',
|
||||
OP_NOP9 : 'OP_NOP9',
|
||||
OP_NOP10 : 'OP_NOP10',
|
||||
OP_SMALLINTEGER : 'OP_SMALLINTEGER',
|
||||
OP_PUBKEYS : 'OP_PUBKEYS',
|
||||
OP_PUBKEYHASH : 'OP_PUBKEYHASH',
|
||||
OP_PUBKEY : 'OP_PUBKEY',
|
||||
OP_INVALIDOPCODE : 'OP_INVALIDOPCODE',
|
||||
OP_0: 'OP_0',
|
||||
OP_PUSHDATA1: 'OP_PUSHDATA1',
|
||||
OP_PUSHDATA2: 'OP_PUSHDATA2',
|
||||
OP_PUSHDATA4: 'OP_PUSHDATA4',
|
||||
OP_1NEGATE: 'OP_1NEGATE',
|
||||
OP_RESERVED: 'OP_RESERVED',
|
||||
OP_1: 'OP_1',
|
||||
OP_2: 'OP_2',
|
||||
OP_3: 'OP_3',
|
||||
OP_4: 'OP_4',
|
||||
OP_5: 'OP_5',
|
||||
OP_6: 'OP_6',
|
||||
OP_7: 'OP_7',
|
||||
OP_8: 'OP_8',
|
||||
OP_9: 'OP_9',
|
||||
OP_10: 'OP_10',
|
||||
OP_11: 'OP_11',
|
||||
OP_12: 'OP_12',
|
||||
OP_13: 'OP_13',
|
||||
OP_14: 'OP_14',
|
||||
OP_15: 'OP_15',
|
||||
OP_16: 'OP_16',
|
||||
OP_NOP: 'OP_NOP',
|
||||
OP_VER: 'OP_VER',
|
||||
OP_IF: 'OP_IF',
|
||||
OP_NOTIF: 'OP_NOTIF',
|
||||
OP_VERIF: 'OP_VERIF',
|
||||
OP_VERNOTIF: 'OP_VERNOTIF',
|
||||
OP_ELSE: 'OP_ELSE',
|
||||
OP_ENDIF: 'OP_ENDIF',
|
||||
OP_VERIFY: 'OP_VERIFY',
|
||||
OP_RETURN: 'OP_RETURN',
|
||||
OP_TOALTSTACK: 'OP_TOALTSTACK',
|
||||
OP_FROMALTSTACK: 'OP_FROMALTSTACK',
|
||||
OP_2DROP: 'OP_2DROP',
|
||||
OP_2DUP: 'OP_2DUP',
|
||||
OP_3DUP: 'OP_3DUP',
|
||||
OP_2OVER: 'OP_2OVER',
|
||||
OP_2ROT: 'OP_2ROT',
|
||||
OP_2SWAP: 'OP_2SWAP',
|
||||
OP_IFDUP: 'OP_IFDUP',
|
||||
OP_DEPTH: 'OP_DEPTH',
|
||||
OP_DROP: 'OP_DROP',
|
||||
OP_DUP: 'OP_DUP',
|
||||
OP_NIP: 'OP_NIP',
|
||||
OP_OVER: 'OP_OVER',
|
||||
OP_PICK: 'OP_PICK',
|
||||
OP_ROLL: 'OP_ROLL',
|
||||
OP_ROT: 'OP_ROT',
|
||||
OP_SWAP: 'OP_SWAP',
|
||||
OP_TUCK: 'OP_TUCK',
|
||||
OP_CAT: 'OP_CAT',
|
||||
OP_SUBSTR: 'OP_SUBSTR',
|
||||
OP_LEFT: 'OP_LEFT',
|
||||
OP_RIGHT: 'OP_RIGHT',
|
||||
OP_SIZE: 'OP_SIZE',
|
||||
OP_INVERT: 'OP_INVERT',
|
||||
OP_AND: 'OP_AND',
|
||||
OP_OR: 'OP_OR',
|
||||
OP_XOR: 'OP_XOR',
|
||||
OP_EQUAL: 'OP_EQUAL',
|
||||
OP_EQUALVERIFY: 'OP_EQUALVERIFY',
|
||||
OP_RESERVED1: 'OP_RESERVED1',
|
||||
OP_RESERVED2: 'OP_RESERVED2',
|
||||
OP_1ADD: 'OP_1ADD',
|
||||
OP_1SUB: 'OP_1SUB',
|
||||
OP_2MUL: 'OP_2MUL',
|
||||
OP_2DIV: 'OP_2DIV',
|
||||
OP_NEGATE: 'OP_NEGATE',
|
||||
OP_ABS: 'OP_ABS',
|
||||
OP_NOT: 'OP_NOT',
|
||||
OP_0NOTEQUAL: 'OP_0NOTEQUAL',
|
||||
OP_ADD: 'OP_ADD',
|
||||
OP_SUB: 'OP_SUB',
|
||||
OP_MUL: 'OP_MUL',
|
||||
OP_DIV: 'OP_DIV',
|
||||
OP_MOD: 'OP_MOD',
|
||||
OP_LSHIFT: 'OP_LSHIFT',
|
||||
OP_RSHIFT: 'OP_RSHIFT',
|
||||
OP_BOOLAND: 'OP_BOOLAND',
|
||||
OP_BOOLOR: 'OP_BOOLOR',
|
||||
OP_NUMEQUAL: 'OP_NUMEQUAL',
|
||||
OP_NUMEQUALVERIFY: 'OP_NUMEQUALVERIFY',
|
||||
OP_NUMNOTEQUAL: 'OP_NUMNOTEQUAL',
|
||||
OP_LESSTHAN: 'OP_LESSTHAN',
|
||||
OP_GREATERTHAN: 'OP_GREATERTHAN',
|
||||
OP_LESSTHANOREQUAL: 'OP_LESSTHANOREQUAL',
|
||||
OP_GREATERTHANOREQUAL: 'OP_GREATERTHANOREQUAL',
|
||||
OP_MIN: 'OP_MIN',
|
||||
OP_MAX: 'OP_MAX',
|
||||
OP_WITHIN: 'OP_WITHIN',
|
||||
OP_RIPEMD160: 'OP_RIPEMD160',
|
||||
OP_SHA1: 'OP_SHA1',
|
||||
OP_SHA256: 'OP_SHA256',
|
||||
OP_HASH160: 'OP_HASH160',
|
||||
OP_HASH256: 'OP_HASH256',
|
||||
OP_CODESEPARATOR: 'OP_CODESEPARATOR',
|
||||
OP_CHECKSIG: 'OP_CHECKSIG',
|
||||
OP_CHECKSIGVERIFY: 'OP_CHECKSIGVERIFY',
|
||||
OP_CHECKMULTISIG: 'OP_CHECKMULTISIG',
|
||||
OP_CHECKMULTISIGVERIFY: 'OP_CHECKMULTISIGVERIFY',
|
||||
OP_NOP1: 'OP_NOP1',
|
||||
OP_CHECKLOCKTIMEVERIFY: 'OP_CHECKLOCKTIMEVERIFY',
|
||||
OP_CHECKSEQUENCEVERIFY: 'OP_CHECKSEQUENCEVERIFY',
|
||||
OP_NOP4: 'OP_NOP4',
|
||||
OP_NOP5: 'OP_NOP5',
|
||||
OP_NOP6: 'OP_NOP6',
|
||||
OP_NOP7: 'OP_NOP7',
|
||||
OP_NOP8: 'OP_NOP8',
|
||||
OP_NOP9: 'OP_NOP9',
|
||||
OP_NOP10: 'OP_NOP10',
|
||||
OP_SMALLINTEGER: 'OP_SMALLINTEGER',
|
||||
OP_PUBKEYS: 'OP_PUBKEYS',
|
||||
OP_PUBKEYHASH: 'OP_PUBKEYHASH',
|
||||
OP_PUBKEY: 'OP_PUBKEY',
|
||||
OP_INVALIDOPCODE: 'OP_INVALIDOPCODE',
|
||||
})
|
||||
|
||||
class CScriptInvalidError(Exception):
|
||||
|
@ -392,10 +430,10 @@ class CScriptNum:
|
|||
if len(value) == 0:
|
||||
return result
|
||||
for i, byte in enumerate(value):
|
||||
result |= int(byte) << 8*i
|
||||
result |= int(byte) << 8 * i
|
||||
if value[-1] >= 0x80:
|
||||
# Mask for all but the highest result bit
|
||||
num_mask = (2**(len(value)*8) - 1) >> 1
|
||||
num_mask = (2**(len(value) * 8) - 1) >> 1
|
||||
result &= num_mask
|
||||
result *= -1
|
||||
return result
|
||||
|
@ -493,21 +531,20 @@ class CScript(bytes):
|
|||
pushdata_type = 'PUSHDATA2'
|
||||
if i + 1 >= len(self):
|
||||
raise CScriptInvalidError('PUSHDATA2: missing data length')
|
||||
datasize = self[i] + (self[i+1] << 8)
|
||||
datasize = self[i] + (self[i + 1] << 8)
|
||||
i += 2
|
||||
|
||||
elif opcode == OP_PUSHDATA4:
|
||||
pushdata_type = 'PUSHDATA4'
|
||||
if i + 3 >= len(self):
|
||||
raise CScriptInvalidError('PUSHDATA4: missing data length')
|
||||
datasize = self[i] + (self[i+1] << 8) + (self[i+2] << 16) + (self[i+3] << 24)
|
||||
datasize = self[i] + (self[i + 1] << 8) + (self[i + 2] << 16) + (self[i + 3] << 24)
|
||||
i += 4
|
||||
|
||||
else:
|
||||
assert False # shouldn't happen
|
||||
assert False # shouldn't happen
|
||||
|
||||
|
||||
data = bytes(self[i:i+datasize])
|
||||
data = bytes(self[i:i + datasize])
|
||||
|
||||
# Check for truncation
|
||||
if len(data) < datasize:
|
||||
|
|
Loading…
Reference in a new issue