mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
merge bitcoin#17319: remove bignum module
This commit is contained in:
parent
87ab86c459
commit
11bcc750f7
@ -118,9 +118,6 @@ Utilities for manipulating transaction scripts (originally from python-bitcoinli
|
||||
#### [test_framework/key.py](test_framework/key.py)
|
||||
Test-only secp256k1 elliptic curve implementation
|
||||
|
||||
#### [test_framework/bignum.py](test_framework/bignum.py)
|
||||
Helpers for script.py
|
||||
|
||||
#### [test_framework/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,20 +6,56 @@
|
||||
|
||||
This file is modified from python-bitcoinlib.
|
||||
"""
|
||||
|
||||
import hashlib
|
||||
import struct
|
||||
|
||||
from .bignum import bn2vch
|
||||
from .messages import CTransaction, CTxOut, sha256, hash256
|
||||
from .messages import (
|
||||
CTransaction,
|
||||
CTxOut,
|
||||
hash256,
|
||||
sha256,
|
||||
)
|
||||
|
||||
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):
|
||||
@ -30,13 +66,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")
|
||||
|
||||
@ -49,7 +85,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"""
|
||||
@ -59,7 +95,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"""
|
||||
@ -86,7 +122,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)
|
||||
|
||||
|
||||
@ -99,7 +135,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)
|
||||
@ -233,122 +269,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_SPLIT : 'OP_SPLIT',
|
||||
OP_NUM2BIN : 'OP_NUM2BIN',
|
||||
OP_BIN2NUM : 'OP_BIN2NUM',
|
||||
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_SPLIT: 'OP_SPLIT',
|
||||
OP_NUM2BIN: 'OP_NUM2BIN',
|
||||
OP_BIN2NUM: 'OP_BIN2NUM',
|
||||
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):
|
||||
@ -393,10 +429,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
|
||||
@ -494,21 +530,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 New Issue
Block a user