bitcoin.py/transaction.py: API changes: rm most hex usage
Instead of some functions operating with hex strings, and others using bytes, this consolidates most things to use bytes. This mainly focuses on bitcoin.py and transaction.py, and then adapts the API usages in other files. Notably, - scripts, - pubkeys, - signatures should be bytes in almost all places now.
This commit is contained in:
@@ -8,7 +8,7 @@ from electrum.bitcoin import (public_key_to_p2pkh, address_from_private_key,
|
||||
deserialize_privkey, serialize_privkey, is_segwit_address,
|
||||
is_b58_address, address_to_scripthash, is_minikey,
|
||||
is_compressed_privkey, EncodeBase58Check, DecodeBase58Check,
|
||||
script_num_to_hex, push_script, add_number_to_script, int_to_hex,
|
||||
script_num_to_bytes, push_script, add_number_to_script,
|
||||
opcodes, base_encode, base_decode, BitcoinException)
|
||||
from electrum import bip32
|
||||
from electrum import segwit_addr
|
||||
@@ -423,83 +423,63 @@ class Test_bitcoin(ElectrumTestCase):
|
||||
self.assertEqual(b'\x95MZI\xfdp\xd9\xb8\xbc\xdb5\xd2R&x)\x95\x7f~\xf7\xfalt\xf8\x84\x19\xbd\xc5\xe8"\t\xf4',
|
||||
sha256d(u"test"))
|
||||
|
||||
def test_int_to_hex(self):
|
||||
self.assertEqual('00', int_to_hex(0, 1))
|
||||
self.assertEqual('ff', int_to_hex(-1, 1))
|
||||
self.assertEqual('00000000', int_to_hex(0, 4))
|
||||
self.assertEqual('01000000', int_to_hex(1, 4))
|
||||
self.assertEqual('7f', int_to_hex(127, 1))
|
||||
self.assertEqual('7f00', int_to_hex(127, 2))
|
||||
self.assertEqual('80', int_to_hex(128, 1))
|
||||
self.assertEqual('80', int_to_hex(-128, 1))
|
||||
self.assertEqual('8000', int_to_hex(128, 2))
|
||||
self.assertEqual('ff', int_to_hex(255, 1))
|
||||
self.assertEqual('ff7f', int_to_hex(32767, 2))
|
||||
self.assertEqual('0080', int_to_hex(-32768, 2))
|
||||
self.assertEqual('ffff', int_to_hex(65535, 2))
|
||||
with self.assertRaises(OverflowError): int_to_hex(256, 1)
|
||||
with self.assertRaises(OverflowError): int_to_hex(-129, 1)
|
||||
with self.assertRaises(OverflowError): int_to_hex(-257, 1)
|
||||
with self.assertRaises(OverflowError): int_to_hex(65536, 2)
|
||||
with self.assertRaises(OverflowError): int_to_hex(-32769, 2)
|
||||
|
||||
def test_var_int(self):
|
||||
for i in range(0xfd):
|
||||
self.assertEqual(var_int(i), "{:02x}".format(i))
|
||||
self.assertEqual(var_int(i), bfh("{:02x}".format(i)))
|
||||
|
||||
self.assertEqual(var_int(0xfd), "fdfd00")
|
||||
self.assertEqual(var_int(0xfe), "fdfe00")
|
||||
self.assertEqual(var_int(0xff), "fdff00")
|
||||
self.assertEqual(var_int(0x1234), "fd3412")
|
||||
self.assertEqual(var_int(0xffff), "fdffff")
|
||||
self.assertEqual(var_int(0x10000), "fe00000100")
|
||||
self.assertEqual(var_int(0x12345678), "fe78563412")
|
||||
self.assertEqual(var_int(0xffffffff), "feffffffff")
|
||||
self.assertEqual(var_int(0x100000000), "ff0000000001000000")
|
||||
self.assertEqual(var_int(0x0123456789abcdef), "ffefcdab8967452301")
|
||||
self.assertEqual(var_int(0xfd), bfh("fdfd00"))
|
||||
self.assertEqual(var_int(0xfe), bfh("fdfe00"))
|
||||
self.assertEqual(var_int(0xff), bfh("fdff00"))
|
||||
self.assertEqual(var_int(0x1234), bfh("fd3412"))
|
||||
self.assertEqual(var_int(0xffff), bfh("fdffff"))
|
||||
self.assertEqual(var_int(0x10000), bfh("fe00000100"))
|
||||
self.assertEqual(var_int(0x12345678), bfh("fe78563412"))
|
||||
self.assertEqual(var_int(0xffffffff), bfh("feffffffff"))
|
||||
self.assertEqual(var_int(0x100000000), bfh("ff0000000001000000"))
|
||||
self.assertEqual(var_int(0x0123456789abcdef), bfh("ffefcdab8967452301"))
|
||||
|
||||
def test_op_push(self):
|
||||
self.assertEqual(_op_push(0x00), '00')
|
||||
self.assertEqual(_op_push(0x12), '12')
|
||||
self.assertEqual(_op_push(0x4b), '4b')
|
||||
self.assertEqual(_op_push(0x4c), '4c4c')
|
||||
self.assertEqual(_op_push(0xfe), '4cfe')
|
||||
self.assertEqual(_op_push(0xff), '4cff')
|
||||
self.assertEqual(_op_push(0x100), '4d0001')
|
||||
self.assertEqual(_op_push(0x1234), '4d3412')
|
||||
self.assertEqual(_op_push(0xfffe), '4dfeff')
|
||||
self.assertEqual(_op_push(0xffff), '4dffff')
|
||||
self.assertEqual(_op_push(0x10000), '4e00000100')
|
||||
self.assertEqual(_op_push(0x12345678), '4e78563412')
|
||||
self.assertEqual(_op_push(0x00), bfh('00'))
|
||||
self.assertEqual(_op_push(0x12), bfh('12'))
|
||||
self.assertEqual(_op_push(0x4b), bfh('4b'))
|
||||
self.assertEqual(_op_push(0x4c), bfh('4c4c'))
|
||||
self.assertEqual(_op_push(0xfe), bfh('4cfe'))
|
||||
self.assertEqual(_op_push(0xff), bfh('4cff'))
|
||||
self.assertEqual(_op_push(0x100), bfh('4d0001'))
|
||||
self.assertEqual(_op_push(0x1234), bfh('4d3412'))
|
||||
self.assertEqual(_op_push(0xfffe), bfh('4dfeff'))
|
||||
self.assertEqual(_op_push(0xffff), bfh('4dffff'))
|
||||
self.assertEqual(_op_push(0x10000), bfh('4e00000100'))
|
||||
self.assertEqual(_op_push(0x12345678), bfh('4e78563412'))
|
||||
|
||||
def test_script_num_to_hex(self):
|
||||
# test vectors from https://github.com/btcsuite/btcd/blob/fdc2bc867bda6b351191b5872d2da8270df00d13/txscript/scriptnum.go#L77
|
||||
self.assertEqual(script_num_to_hex(127), '7f')
|
||||
self.assertEqual(script_num_to_hex(-127), 'ff')
|
||||
self.assertEqual(script_num_to_hex(128), '8000')
|
||||
self.assertEqual(script_num_to_hex(-128), '8080')
|
||||
self.assertEqual(script_num_to_hex(129), '8100')
|
||||
self.assertEqual(script_num_to_hex(-129), '8180')
|
||||
self.assertEqual(script_num_to_hex(256), '0001')
|
||||
self.assertEqual(script_num_to_hex(-256), '0081')
|
||||
self.assertEqual(script_num_to_hex(32767), 'ff7f')
|
||||
self.assertEqual(script_num_to_hex(-32767), 'ffff')
|
||||
self.assertEqual(script_num_to_hex(32768), '008000')
|
||||
self.assertEqual(script_num_to_hex(-32768), '008080')
|
||||
self.assertEqual(script_num_to_bytes(127), bfh('7f'))
|
||||
self.assertEqual(script_num_to_bytes(-127), bfh('ff'))
|
||||
self.assertEqual(script_num_to_bytes(128), bfh('8000'))
|
||||
self.assertEqual(script_num_to_bytes(-128), bfh('8080'))
|
||||
self.assertEqual(script_num_to_bytes(129), bfh('8100'))
|
||||
self.assertEqual(script_num_to_bytes(-129), bfh('8180'))
|
||||
self.assertEqual(script_num_to_bytes(256), bfh('0001'))
|
||||
self.assertEqual(script_num_to_bytes(-256), bfh('0081'))
|
||||
self.assertEqual(script_num_to_bytes(32767), bfh('ff7f'))
|
||||
self.assertEqual(script_num_to_bytes(-32767), bfh('ffff'))
|
||||
self.assertEqual(script_num_to_bytes(32768), bfh('008000'))
|
||||
self.assertEqual(script_num_to_bytes(-32768), bfh('008080'))
|
||||
|
||||
def test_push_script(self):
|
||||
# https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#push-operators
|
||||
self.assertEqual(push_script(''), bytes([opcodes.OP_0]).hex())
|
||||
self.assertEqual(push_script('07'), bytes([opcodes.OP_7]).hex())
|
||||
self.assertEqual(push_script('10'), bytes([opcodes.OP_16]).hex())
|
||||
self.assertEqual(push_script('81'), bytes([opcodes.OP_1NEGATE]).hex())
|
||||
self.assertEqual(push_script('11'), '0111')
|
||||
self.assertEqual(push_script(75 * '42'), '4b' + 75 * '42')
|
||||
self.assertEqual(push_script(76 * '42'), (bytes([opcodes.OP_PUSHDATA1]) + bfh('4c' + 76 * '42')).hex())
|
||||
self.assertEqual(push_script(100 * '42'), (bytes([opcodes.OP_PUSHDATA1]) + bfh('64' + 100 * '42')).hex())
|
||||
self.assertEqual(push_script(255 * '42'), (bytes([opcodes.OP_PUSHDATA1]) + bfh('ff' + 255 * '42')).hex())
|
||||
self.assertEqual(push_script(256 * '42'), (bytes([opcodes.OP_PUSHDATA2]) + bfh('0001' + 256 * '42')).hex())
|
||||
self.assertEqual(push_script(520 * '42'), (bytes([opcodes.OP_PUSHDATA2]) + bfh('0802' + 520 * '42')).hex())
|
||||
self.assertEqual(push_script(b""), bytes([opcodes.OP_0]))
|
||||
self.assertEqual(push_script(b'\x07'), bytes([opcodes.OP_7]))
|
||||
self.assertEqual(push_script(b'\x10'), bytes([opcodes.OP_16]))
|
||||
self.assertEqual(push_script(b'\x81'), bytes([opcodes.OP_1NEGATE]))
|
||||
self.assertEqual(push_script(b'\x11'), bfh('0111'))
|
||||
self.assertEqual(push_script(75 * b'\x42'), bfh('4b' + 75 * '42'))
|
||||
self.assertEqual(push_script(76 * b'\x42'), bytes([opcodes.OP_PUSHDATA1]) + bfh('4c' + 76 * '42'))
|
||||
self.assertEqual(push_script(100 * b'\x42'), bytes([opcodes.OP_PUSHDATA1]) + bfh('64' + 100 * '42'))
|
||||
self.assertEqual(push_script(255 * b'\x42'), bytes([opcodes.OP_PUSHDATA1]) + bfh('ff' + 255 * '42'))
|
||||
self.assertEqual(push_script(256 * b'\x42'), bytes([opcodes.OP_PUSHDATA2]) + bfh('0001' + 256 * '42'))
|
||||
self.assertEqual(push_script(520 * b'\x42'), bytes([opcodes.OP_PUSHDATA2]) + bfh('0802' + 520 * '42'))
|
||||
|
||||
def test_add_number_to_script(self):
|
||||
# https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#numbers
|
||||
@@ -528,17 +508,17 @@ class Test_bitcoin(ElectrumTestCase):
|
||||
# bech32/bech32m native segwit
|
||||
# test vectors from BIP-0173
|
||||
# note: the ones that are commented out have been invalidated by BIP-0350
|
||||
self.assertEqual(address_to_script('BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4'), '0014751e76e8199196d454941c45d1b3a323f1433bd6')
|
||||
self.assertEqual(address_to_script('BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4').hex(), '0014751e76e8199196d454941c45d1b3a323f1433bd6')
|
||||
# self.assertEqual(address_to_script('bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx'), '5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6')
|
||||
# self.assertEqual(address_to_script('BC1SW50QA3JX3S'), '6002751e')
|
||||
# self.assertEqual(address_to_script('bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj'), '5210751e76e8199196d454941c45d1b3a323')
|
||||
|
||||
# bech32/bech32m native segwit
|
||||
# test vectors from BIP-0350
|
||||
self.assertEqual(address_to_script('bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y'), '5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6')
|
||||
self.assertEqual(address_to_script('BC1SW50QGDZ25J'), '6002751e')
|
||||
self.assertEqual(address_to_script('bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs'), '5210751e76e8199196d454941c45d1b3a323')
|
||||
self.assertEqual(address_to_script('bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0'), '512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')
|
||||
self.assertEqual(address_to_script('bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y').hex(), '5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6')
|
||||
self.assertEqual(address_to_script('BC1SW50QGDZ25J').hex(), '6002751e')
|
||||
self.assertEqual(address_to_script('bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs').hex(), '5210751e76e8199196d454941c45d1b3a323')
|
||||
self.assertEqual(address_to_script('bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0').hex(), '512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798')
|
||||
|
||||
# invalid addresses (from BIP-0173)
|
||||
self.assertFalse(is_address('tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty'))
|
||||
@@ -570,12 +550,12 @@ class Test_bitcoin(ElectrumTestCase):
|
||||
self.assertFalse(is_address('bc1gmk9yu'))
|
||||
|
||||
# base58 P2PKH
|
||||
self.assertEqual(address_to_script('14gcRovpkCoGkCNBivQBvw7eso7eiNAbxG'), '76a91428662c67561b95c79d2257d2a93d9d151c977e9188ac')
|
||||
self.assertEqual(address_to_script('1BEqfzh4Y3zzLosfGhw1AsqbEKVW6e1qHv'), '76a914704f4b81cadb7bf7e68c08cd3657220f680f863c88ac')
|
||||
self.assertEqual(address_to_script('14gcRovpkCoGkCNBivQBvw7eso7eiNAbxG').hex(), '76a91428662c67561b95c79d2257d2a93d9d151c977e9188ac')
|
||||
self.assertEqual(address_to_script('1BEqfzh4Y3zzLosfGhw1AsqbEKVW6e1qHv').hex(), '76a914704f4b81cadb7bf7e68c08cd3657220f680f863c88ac')
|
||||
|
||||
# base58 P2SH
|
||||
self.assertEqual(address_to_script('35ZqQJcBQMZ1rsv8aSuJ2wkC7ohUCQMJbT'), 'a9142a84cf00d47f699ee7bbc1dea5ec1bdecb4ac15487')
|
||||
self.assertEqual(address_to_script('3PyjzJ3im7f7bcV724GR57edKDqoZvH7Ji'), 'a914f47c8954e421031ad04ecd8e7752c9479206b9d387')
|
||||
self.assertEqual(address_to_script('35ZqQJcBQMZ1rsv8aSuJ2wkC7ohUCQMJbT').hex(), 'a9142a84cf00d47f699ee7bbc1dea5ec1bdecb4ac15487')
|
||||
self.assertEqual(address_to_script('3PyjzJ3im7f7bcV724GR57edKDqoZvH7Ji').hex(), 'a914f47c8954e421031ad04ecd8e7752c9479206b9d387')
|
||||
|
||||
def test_address_to_payload(self):
|
||||
# bech32 P2WPKH
|
||||
@@ -698,14 +678,14 @@ class Test_bitcoin_testnet(ElectrumTestCase):
|
||||
def test_address_to_script(self):
|
||||
# bech32/bech32m native segwit
|
||||
# test vectors from BIP-0173
|
||||
self.assertEqual(address_to_script('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7'), '00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262')
|
||||
self.assertEqual(address_to_script('tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy'), '0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
self.assertEqual(address_to_script('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7').hex(), '00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262')
|
||||
self.assertEqual(address_to_script('tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy').hex(), '0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
|
||||
# bech32/bech32m native segwit
|
||||
# test vectors from BIP-0350
|
||||
self.assertEqual(address_to_script('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7'), '00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262')
|
||||
self.assertEqual(address_to_script('tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy'), '0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
self.assertEqual(address_to_script('tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c'), '5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
self.assertEqual(address_to_script('tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7').hex(), '00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262')
|
||||
self.assertEqual(address_to_script('tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy').hex(), '0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
self.assertEqual(address_to_script('tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c').hex(), '5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433')
|
||||
|
||||
# invalid addresses (from BIP-0173)
|
||||
self.assertFalse(is_address('tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty'))
|
||||
@@ -737,12 +717,12 @@ class Test_bitcoin_testnet(ElectrumTestCase):
|
||||
self.assertFalse(is_address('bc1gmk9yu'))
|
||||
|
||||
# base58 P2PKH
|
||||
self.assertEqual(address_to_script('mutXcGt1CJdkRvXuN2xoz2quAAQYQ59bRX'), '76a9149da64e300c5e4eb4aaffc9c2fd465348d5618ad488ac')
|
||||
self.assertEqual(address_to_script('miqtaRTkU3U8rzwKbEHx3g8FSz8GJtPS3K'), '76a914247d2d5b6334bdfa2038e85b20fc15264f8e5d2788ac')
|
||||
self.assertEqual(address_to_script('mutXcGt1CJdkRvXuN2xoz2quAAQYQ59bRX').hex(), '76a9149da64e300c5e4eb4aaffc9c2fd465348d5618ad488ac')
|
||||
self.assertEqual(address_to_script('miqtaRTkU3U8rzwKbEHx3g8FSz8GJtPS3K').hex(), '76a914247d2d5b6334bdfa2038e85b20fc15264f8e5d2788ac')
|
||||
|
||||
# base58 P2SH
|
||||
self.assertEqual(address_to_script('2N3LSvr3hv5EVdfcrxg2Yzecf3SRvqyBE4p'), 'a9146eae23d8c4a941316017946fc761a7a6c85561fb87')
|
||||
self.assertEqual(address_to_script('2NE4ZdmxFmUgwu5wtfoN2gVniyMgRDYq1kk'), 'a914e4567743d378957cd2ee7072da74b1203c1a7a0b87')
|
||||
self.assertEqual(address_to_script('2N3LSvr3hv5EVdfcrxg2Yzecf3SRvqyBE4p').hex(), 'a9146eae23d8c4a941316017946fc761a7a6c85561fb87')
|
||||
self.assertEqual(address_to_script('2NE4ZdmxFmUgwu5wtfoN2gVniyMgRDYq1kk').hex(), 'a914e4567743d378957cd2ee7072da74b1203c1a7a0b87')
|
||||
|
||||
|
||||
class Test_xprv_xpub(ElectrumTestCase):
|
||||
|
||||
@@ -1208,7 +1208,7 @@ class TestPeerDirect(TestPeer):
|
||||
# shutdown script
|
||||
bob_uss_pub = lnutil.privkey_to_pubkey(os.urandom(32))
|
||||
bob_uss_addr = bitcoin.pubkey_to_address('p2wpkh', bob_uss_pub.hex())
|
||||
bob_uss = bfh(bitcoin.address_to_script(bob_uss_addr))
|
||||
bob_uss = bitcoin.address_to_script(bob_uss_addr)
|
||||
|
||||
# bob commits to close to bob_uss
|
||||
alice_channel.config[HTLCOwner.REMOTE].upfront_shutdown_script = bob_uss
|
||||
|
||||
@@ -508,7 +508,7 @@ class TestLNUtil(ElectrumTestCase):
|
||||
htlc_payment_preimage[4] = b"\x04" * 32
|
||||
htlc[4] = make_received_htlc(**htlc_pubkeys, payment_hash=bitcoin.sha256(htlc_payment_preimage[4]), cltv_abs=htlc_cltv_timeout[4])
|
||||
|
||||
remote_signature = "304402204fd4928835db1ccdfc40f5c78ce9bd65249b16348df81f0c44328dcdefc97d630220194d3869c38bc732dd87d13d2958015e2fc16829e74cd4377f84d215c0b70606"
|
||||
remote_signature = bfh("304402204fd4928835db1ccdfc40f5c78ce9bd65249b16348df81f0c44328dcdefc97d630220194d3869c38bc732dd87d13d2958015e2fc16829e74cd4377f84d215c0b70606")
|
||||
output_commit_tx = "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a488489000000000038b02b8007e80300000000000022002052bfef0479d7b293c27e0f1eb294bea154c63a3294ef092c19af51409bce0e2ad007000000000000220020403d394747cae42e98ff01734ad5c08f82ba123d3d9a620abda88989651e2ab5d007000000000000220020748eba944fedc8827f6b06bc44678f93c0f9e6078b35c6331ed31e75f8ce0c2db80b000000000000220020c20b5d1f8584fd90443e7b7b720136174fa4b9333c261d04dbbd012635c0f419a00f0000000000002200208c48d15160397c9731df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4c0c62d0000000000160014ccf1af2f2aabee14bb40fa3851ab2301de843110e0a06a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e04004730440220275b0c325a5e9355650dc30c0eccfbc7efb23987c24b556b9dfdd40effca18d202206caceb2c067836c51f296740c7ae807ffcbfbf1dd3a0d56b6de9a5b247985f060147304402204fd4928835db1ccdfc40f5c78ce9bd65249b16348df81f0c44328dcdefc97d630220194d3869c38bc732dd87d13d2958015e2fc16829e74cd4377f84d215c0b7060601475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220"
|
||||
|
||||
htlc_obj = {}
|
||||
@@ -594,7 +594,7 @@ class TestLNUtil(ElectrumTestCase):
|
||||
|
||||
our_htlc_tx_witness = make_htlc_tx_witness(
|
||||
remotehtlcsig=bfh(remote_htlc_sig) + b"\x01", # 0x01 is SIGHASH_ALL
|
||||
localhtlcsig=bfh(local_sig),
|
||||
localhtlcsig=local_sig,
|
||||
payment_preimage=htlc_payment_preimage if success else b'', # will put 00 on witness if timeout
|
||||
witness_script=htlc)
|
||||
our_htlc_tx._inputs[0].witness = our_htlc_tx_witness
|
||||
@@ -604,7 +604,7 @@ class TestLNUtil(ElectrumTestCase):
|
||||
to_local_msat= 6988000000
|
||||
to_remote_msat= 3000000000
|
||||
local_feerate_per_kw= 9651181
|
||||
remote_signature = "3044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e"
|
||||
remote_signature = bfh("3044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e")
|
||||
output_commit_tx= "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a488489000000000038b02b8001c0c62d0000000000160014ccf1af2f2aabee14bb40fa3851ab2301de8431100400473044022031a82b51bd014915fe68928d1abf4b9885353fb896cac10c3fdd88d7f9c7f2e00220716bda819641d2c63e65d3549b6120112e1aeaf1742eed94a471488e79e206b101473044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e01475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220"
|
||||
|
||||
our_commit_tx = make_commitment(
|
||||
@@ -633,7 +633,7 @@ class TestLNUtil(ElectrumTestCase):
|
||||
to_local_msat= 6988000000
|
||||
to_remote_msat= 3000000000
|
||||
local_feerate_per_kw= 9651936
|
||||
remote_signature = "3044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e"
|
||||
remote_signature = bfh("3044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e")
|
||||
output_commit_tx= "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b820b584a488489000000000038b02b8001c0c62d0000000000160014ccf1af2f2aabee14bb40fa3851ab2301de8431100400473044022031a82b51bd014915fe68928d1abf4b9885353fb896cac10c3fdd88d7f9c7f2e00220716bda819641d2c63e65d3549b6120112e1aeaf1742eed94a471488e79e206b101473044022064901950be922e62cbe3f2ab93de2b99f37cff9fc473e73e394b27f88ef0731d02206d1dfa227527b4df44a07599289e207d6fd9cca60c0365682dcd3deaf739567e01475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220"
|
||||
|
||||
our_commit_tx = make_commitment(
|
||||
@@ -701,7 +701,7 @@ class TestLNUtil(ElectrumTestCase):
|
||||
# actual commitment transaction fee = 10860
|
||||
# to_local amount 6989140 wscript 63210212a140cd0c6539d07cd08dfe09984dec3251ea808b892efeac3ede9402bf2b1967029000b2752103fd5960528dc152014952efdb702a88f71e3c1653b2314431701ec77e57fde83c68ac
|
||||
# to_remote amount 3000000 P2WPKH(0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b)
|
||||
remote_signature = "3045022100f51d2e566a70ba740fc5d8c0f07b9b93d2ed741c3c0860c613173de7d39e7968022041376d520e9c0e1ad52248ddf4b22e12be8763007df977253ef45a4ca3bdb7c0"
|
||||
remote_signature = bfh("3045022100f51d2e566a70ba740fc5d8c0f07b9b93d2ed741c3c0860c613173de7d39e7968022041376d520e9c0e1ad52248ddf4b22e12be8763007df977253ef45a4ca3bdb7c0")
|
||||
# local_signature = 3044022051b75c73198c6deee1a875871c3961832909acd297c6b908d59e3319e5185a46022055c419379c5051a78d00dbbce11b5b664a0c22815fbcc6fcef6b1937c3836939
|
||||
our_commit_tx = make_commitment(
|
||||
ctn=commitment_number,
|
||||
@@ -728,14 +728,14 @@ class TestLNUtil(ElectrumTestCase):
|
||||
def sign_and_insert_remote_sig(self, tx: PartialTransaction, remote_pubkey, remote_signature, pubkey, privkey):
|
||||
assert type(remote_pubkey) is bytes
|
||||
assert len(remote_pubkey) == 33
|
||||
assert type(remote_signature) is str
|
||||
assert type(remote_signature) is bytes
|
||||
assert type(pubkey) is bytes
|
||||
assert type(privkey) is bytes
|
||||
assert len(pubkey) == 33
|
||||
assert len(privkey) == 33
|
||||
tx.sign({pubkey.hex(): (privkey[:-1], True)})
|
||||
sighash = Sighash.to_sigbytes(Sighash.ALL).hex()
|
||||
tx.add_signature_to_txin(txin_idx=0, signing_pubkey=remote_pubkey.hex(), sig=remote_signature + sighash)
|
||||
sighash = Sighash.to_sigbytes(Sighash.ALL)
|
||||
tx.add_signature_to_txin(txin_idx=0, signing_pubkey=remote_pubkey, sig=remote_signature + sighash)
|
||||
|
||||
def test_get_compressed_pubkey_from_bech32(self):
|
||||
self.assertEqual(b'\x03\x84\xef\x87\xd9d\xa2\xaaa7=\xff\xb8\xfe=t8[}>;\n\x13\xa8e\x8eo:\xf5Mi\xb5H',
|
||||
|
||||
@@ -18,7 +18,7 @@ signed_blob = '01000000012a5c9a94fcde98f5581cd00162c60a13936ceb75389ea65bf38633b
|
||||
v2_blob = "0200000001191601a44a81e061502b7bfbc6eaa1cef6d1e6af5308ef96c9342f71dbf4b9b5000000006b483045022100a6d44d0a651790a477e75334adfb8aae94d6612d01187b2c02526e340a7fd6c8022028bdf7a64a54906b13b145cd5dab21a26bd4b85d6044e9b97bceab5be44c2a9201210253e8e0254b0c95776786e40984c1aa32a7d03efa6bdacdea5f421b774917d346feffffff026b20fa04000000001976a914024db2e87dd7cfd0e5f266c5f212e21a31d805a588aca0860100000000001976a91421919b94ae5cefcdf0271191459157cdb41c4cbf88aca6240700"
|
||||
signed_segwit_blob = "01000000000101b66d722484f2db63e827ebf41d02684fed0c6550e85015a6c9d41ef216a8a6f00000000000fdffffff0280c3c90100000000160014b65ce60857f7e7892b983851c2a8e3526d09e4ab64bac30400000000160014c478ebbc0ab2097706a98e10db7cf101839931c4024730440220789c7d47f876638c58d98733c30ae9821c8fa82b470285dcdf6db5994210bf9f02204163418bbc44af701212ad42d884cc613f3d3d831d2d0cc886f767cca6e0235e012103083a6dc250816d771faa60737bfe78b23ad619f6b458e0a1f1688e3a0605e79c00000000"
|
||||
|
||||
signed_blob_signatures = ['3046022100a82bbc57a0136751e5433f41cf000b3f1a99c6744775e76ec764fb78c54ee100022100f9e80b7de89de861dc6fb0c1429d5da72c2b6b2ee2406bc9bfb1beedd729d98501',]
|
||||
signed_blob_signatures = [bfh('3046022100a82bbc57a0136751e5433f41cf000b3f1a99c6744775e76ec764fb78c54ee100022100f9e80b7de89de861dc6fb0c1429d5da72c2b6b2ee2406bc9bfb1beedd729d98501'),]
|
||||
|
||||
class TestBCDataStream(ElectrumTestCase):
|
||||
|
||||
@@ -81,11 +81,11 @@ class TestBCDataStream(ElectrumTestCase):
|
||||
|
||||
class TestTransaction(ElectrumTestCase):
|
||||
def test_match_against_script_template(self):
|
||||
script = bfh(construct_script([opcodes.OP_5, bytes(29)]))
|
||||
script = construct_script([opcodes.OP_5, bytes(29)])
|
||||
self.assertTrue(match_script_against_template(script, SCRIPTPUBKEY_TEMPLATE_ANYSEGWIT))
|
||||
script = bfh(construct_script([opcodes.OP_NOP, bytes(30)]))
|
||||
script = construct_script([opcodes.OP_NOP, bytes(30)])
|
||||
self.assertFalse(match_script_against_template(script, SCRIPTPUBKEY_TEMPLATE_ANYSEGWIT))
|
||||
script = bfh(construct_script([opcodes.OP_0, bytes(50)]))
|
||||
script = construct_script([opcodes.OP_0, bytes(50)])
|
||||
self.assertFalse(match_script_against_template(script, SCRIPTPUBKEY_TEMPLATE_ANYSEGWIT))
|
||||
|
||||
def test_tx_update_signatures(self):
|
||||
@@ -875,9 +875,9 @@ class TestTransactionTestnet(ElectrumTestCase):
|
||||
prevout = TxOutpoint(txid=bfh('6d500966f9e494b38a04545f0cea35fc7b3944e341a64b804fed71cdee11d434'), out_idx=1)
|
||||
txin = PartialTxInput(prevout=prevout)
|
||||
txin.nsequence = 2 ** 32 - 3
|
||||
redeem_script = bfh(construct_script([
|
||||
redeem_script = construct_script([
|
||||
locktime, opcodes.OP_CHECKLOCKTIMEVERIFY, opcodes.OP_DROP, pubkey, opcodes.OP_CHECKSIG,
|
||||
]))
|
||||
])
|
||||
txin.redeem_script = redeem_script
|
||||
|
||||
# Build the Transaction Output
|
||||
@@ -887,7 +887,7 @@ class TestTransactionTestnet(ElectrumTestCase):
|
||||
# Build and sign the transaction
|
||||
tx = PartialTransaction.from_io([txin], [txout], locktime=locktime, version=1)
|
||||
sig = tx.sign_txin(0, privkey)
|
||||
txin.script_sig = bfh(construct_script([sig, redeem_script]))
|
||||
txin.script_sig = construct_script([sig, redeem_script])
|
||||
|
||||
# note: in testnet3 chain, signature differs (no low-R grinding),
|
||||
# so txid there is: a8110bbdd40d65351f615897d98c33cbe33e4ebedb4ba2fc9e8c644423dadc93
|
||||
@@ -903,10 +903,10 @@ class TestTransactionTestnet(ElectrumTestCase):
|
||||
# Build the Transaction Input
|
||||
_, privkey, compressed = deserialize_privkey(wif)
|
||||
pubkey = ECPrivkey(privkey).get_public_key_hex(compressed=compressed)
|
||||
witness_script = bfh(construct_script([
|
||||
witness_script = construct_script([
|
||||
locktime, opcodes.OP_CHECKLOCKTIMEVERIFY, opcodes.OP_DROP, pubkey, opcodes.OP_CHECKSIG,
|
||||
]))
|
||||
from_addr = bitcoin.script_to_p2wsh(witness_script.hex())
|
||||
])
|
||||
from_addr = bitcoin.script_to_p2wsh(witness_script)
|
||||
self.assertEqual("tb1q9dn6qke9924xe3zmptmhrdge0s043pjxpjndypgnu2t9fvsd4crs2qjuer", from_addr)
|
||||
prevout = TxOutpoint(txid=bfh('8680971efd5203025cffe746f8598d0a704fae81f236ffe009c2609ec673d59a'), out_idx=0)
|
||||
txin = PartialTxInput(prevout=prevout)
|
||||
@@ -922,7 +922,7 @@ class TestTransactionTestnet(ElectrumTestCase):
|
||||
# Build and sign the transaction
|
||||
tx = PartialTransaction.from_io([txin], [txout], locktime=locktime, version=2)
|
||||
sig = tx.sign_txin(0, privkey)
|
||||
txin.witness = bfh(construct_witness([sig, witness_script]))
|
||||
txin.witness = construct_witness([sig, witness_script])
|
||||
|
||||
self.assertEqual('1cdb274755b144090c7134b6459e8d4cb6b4552fe620102836d751e8389b2694',
|
||||
tx.txid())
|
||||
@@ -949,7 +949,7 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('304402206ac44d672dac41f9b00e28f4df20c52eeb087207e8d758d76d92c6fab3b73e2b0220367750dbbe19290069cba53d096f44530e4f98acaa594810388cf7409a1870ce01',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
def test_check_sighash_types_sighash_none(self):
|
||||
self.txin.sighash=Sighash.NONE
|
||||
@@ -957,7 +957,7 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('3044022068c7946a43232757cbdf9176f009a928e1cd9a1a8c212f15c1e11ac9f2925d9002205b75f937ff2f9f3c1246e547e54f62e027f64eefa2695578cc6432cdabce271502',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
def test_check_sighash_types_sighash_single(self):
|
||||
self.txin.sighash=Sighash.SINGLE
|
||||
@@ -965,7 +965,7 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('3044022059ebf56d98010a932cf8ecfec54c48e6139ed6adb0728c09cbe1e4fa0915302e022007cd986c8fa870ff5d2b3a89139c9fe7e499259875357e20fcbb15571c76795403',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
@disable_ecdsa_r_value_grinding
|
||||
def test_check_sighash_types_sighash_all_anyonecanpay(self):
|
||||
@@ -974,7 +974,7 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('3045022100fbefd94bd0a488d50b79102b5dad4ab6ced30c4069f1eaa69a4b5a763414067e02203156c6a5c9cf88f91265f5a942e96213afae16d83321c8b31bb342142a14d16381',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
@disable_ecdsa_r_value_grinding
|
||||
def test_check_sighash_types_sighash_none_anyonecanpay(self):
|
||||
@@ -983,7 +983,7 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('3045022100a5263ea0553ba89221984bd7f0b13613db16e7a70c549a86de0cc0444141a407022005c360ef0ae5a5d4f9f2f87a56c1546cc8268cab08c73501d6b3be2e1e1a8a0882',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
def test_check_sighash_types_sighash_single_anyonecanpay(self):
|
||||
self.txin.sighash=Sighash.SINGLE|Sighash.ANYONECANPAY
|
||||
@@ -991,4 +991,4 @@ class TestSighashTypes(ElectrumTestCase):
|
||||
tx = PartialTransaction.from_io(inputs=[self.txin], outputs=[self.txout1,self.txout2], locktime=self.locktime, version=1, BIP69_sort=False)
|
||||
sig = tx.sign_txin(0,privkey)
|
||||
self.assertEqual('30440220525406a1482936d5a21888260dc165497a90a15669636d8edca6b9fe490d309c022032af0c646a34a44d1f4576bf6a4a74b67940f8faa84c7df9abe12a01a11e2b4783',
|
||||
sig)
|
||||
sig.hex())
|
||||
|
||||
Reference in New Issue
Block a user