mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-10 03:47:29 -03:00
test: add test for decoding PSBT with per-input preimage types
This commit is contained in:
parent
faf43378e2
commit
71a751f6c3
1 changed files with 46 additions and 0 deletions
|
@ -11,10 +11,23 @@ from itertools import product
|
|||
from test_framework.descriptors import descsum_create
|
||||
from test_framework.key import ECKey, H_POINT
|
||||
from test_framework.messages import (
|
||||
COutPoint,
|
||||
CTransaction,
|
||||
CTxIn,
|
||||
CTxOut,
|
||||
MAX_BIP125_RBF_SEQUENCE,
|
||||
WITNESS_SCALE_FACTOR,
|
||||
ser_compact_size,
|
||||
)
|
||||
from test_framework.psbt import (
|
||||
PSBT,
|
||||
PSBTMap,
|
||||
PSBT_GLOBAL_UNSIGNED_TX,
|
||||
PSBT_IN_RIPEMD160,
|
||||
PSBT_IN_SHA256,
|
||||
PSBT_IN_HASH160,
|
||||
PSBT_IN_HASH256,
|
||||
)
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import (
|
||||
assert_approx,
|
||||
|
@ -23,6 +36,7 @@ from test_framework.util import (
|
|||
assert_raises_rpc_error,
|
||||
find_output,
|
||||
find_vout_for_address,
|
||||
random_bytes,
|
||||
)
|
||||
from test_framework.wallet_util import bytes_to_wif
|
||||
|
||||
|
@ -775,5 +789,37 @@ class PSBTTest(BitcoinTestFramework):
|
|||
self.nodes[0].sendrawtransaction(rawtx)
|
||||
self.generate(self.nodes[0], 1)
|
||||
|
||||
self.log.info("Test decoding PSBT with per-input preimage types")
|
||||
# note that the decodepsbt RPC doesn't check whether preimages and hashes match
|
||||
hash_ripemd160, preimage_ripemd160 = random_bytes(20), random_bytes(50)
|
||||
hash_sha256, preimage_sha256 = random_bytes(32), random_bytes(50)
|
||||
hash_hash160, preimage_hash160 = random_bytes(20), random_bytes(50)
|
||||
hash_hash256, preimage_hash256 = random_bytes(32), random_bytes(50)
|
||||
|
||||
tx = CTransaction()
|
||||
tx.vin = [CTxIn(outpoint=COutPoint(hash=int('aa' * 32, 16), n=0), scriptSig=b""),
|
||||
CTxIn(outpoint=COutPoint(hash=int('bb' * 32, 16), n=0), scriptSig=b""),
|
||||
CTxIn(outpoint=COutPoint(hash=int('cc' * 32, 16), n=0), scriptSig=b""),
|
||||
CTxIn(outpoint=COutPoint(hash=int('dd' * 32, 16), n=0), scriptSig=b"")]
|
||||
tx.vout = [CTxOut(nValue=0, scriptPubKey=b"")]
|
||||
psbt = PSBT()
|
||||
psbt.g = PSBTMap({PSBT_GLOBAL_UNSIGNED_TX: tx.serialize()})
|
||||
psbt.i = [PSBTMap({bytes([PSBT_IN_RIPEMD160]) + hash_ripemd160: preimage_ripemd160}),
|
||||
PSBTMap({bytes([PSBT_IN_SHA256]) + hash_sha256: preimage_sha256}),
|
||||
PSBTMap({bytes([PSBT_IN_HASH160]) + hash_hash160: preimage_hash160}),
|
||||
PSBTMap({bytes([PSBT_IN_HASH256]) + hash_hash256: preimage_hash256})]
|
||||
psbt.o = [PSBTMap()]
|
||||
res_inputs = self.nodes[0].decodepsbt(psbt.to_base64())["inputs"]
|
||||
assert_equal(len(res_inputs), 4)
|
||||
preimage_keys = ["ripemd160_preimages", "sha256_preimages", "hash160_preimages", "hash256_preimages"]
|
||||
expected_hashes = [hash_ripemd160, hash_sha256, hash_hash160, hash_hash256]
|
||||
expected_preimages = [preimage_ripemd160, preimage_sha256, preimage_hash160, preimage_hash256]
|
||||
for res_input, preimage_key, hash, preimage in zip(res_inputs, preimage_keys, expected_hashes, expected_preimages):
|
||||
assert preimage_key in res_input
|
||||
assert_equal(len(res_input[preimage_key]), 1)
|
||||
assert hash.hex() in res_input[preimage_key]
|
||||
assert_equal(res_input[preimage_key][hash.hex()], preimage.hex())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
PSBTTest().main()
|
||||
|
|
Loading…
Reference in a new issue