mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-07 17:00:32 +02:00
Merge bitcoin/bitcoin#28264: test: refactor: support sending funds with outpoint result
50d1ac1207
test: remove unused `find_output` helper (Sebastian Falbesoner)73a339abc3
test: refactor: support sending funds with outpoint result (Sebastian Falbesoner) Pull request description: In wallet-related functional tests we often want to send funds to an address and use the resulting (non-change) UTXO directly after as input for another transaction. Doing that is currently tedious, as it involves finding the index part of the outpoint manually by calling helpers like `find_vout_for_address` or `find_output` first. This results in two different txid/vout variables which then again have to be combined to a single dictionary `{"txid": ..., "vout": ...}` in order to be specified as input for RPCs like `createrawtransaction` or `createpsbt`. For example: ``` txid1 = node1.sendtoaddress(addr1, value1) vout1 = find_vout_for_address(node1, txid1, addr1) txid2 = node2.sendtoaddress(addr2, value2) vout2 = find_vout_for_address(node2, txid2, addr2) node.createrawtransaction([{'txid': txid1, 'vout': vout1}, {'txid': txid2, 'vout': vout2}], .....) ``` This PR introduces a helper `create_outpoints` to immediately return the outpoint as UTXO dictionary in the common format, making the tests more readable and avoiding unnecessary duplication: ``` utxo1 = self.create_outpoints(node1, outputs=[{addr1: value1}])[0] utxo2 = self.create_outpoints(node2, outputs=[{addr2: value2}])[0] node.createrawtransaction([utxo1, utxo2], .....) ``` Tests are switched to work with UTXO-objects rather than two individual txid/vout variables accordingly. The `find_output` helper is removed, as it seems generally a bad idea to search for an outpoint only based on the output value. If that's really ever needed in the future, it makes probably more sense to add it as an additional parameter to `find_vout_of_address`. Note that `find_output` supported specifying a block-hash for where to look for the transaction (being passed on to the `getrawtransaction` RPC). This seems to be unneeded, as txids are always unique and for the only test that used that parameter (rpc_psbt.py) there was no observed difference in run-time, so it was not reintroduced in the new helper. There are still some `find_vout_of_address` calls remaining, used for detecting change outputs or for whenever the sending happens via `sendrawtransaction` instead, so this PR tackles not all, but the most common case. ACKs for top commit: achow101: ACK50d1ac1207
BrandonOdiwuor: ACK50d1ac1207
maflcko: ACK50d1ac1207
🖨 Tree-SHA512: af2bbf13a56cc840fefc1781390cf51625f1e41b3c030f07fc9abb1181b2d414ddbf795e887db029e119cbe45de14f7c987c0cba72ff0b8953080ee218a7915a
This commit is contained in:
@ -30,6 +30,7 @@ from .util import (
|
||||
PortSeed,
|
||||
assert_equal,
|
||||
check_json_precision,
|
||||
find_vout_for_address,
|
||||
get_datadir_path,
|
||||
initialize_datadir,
|
||||
p2p_port,
|
||||
@ -697,6 +698,22 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
||||
sync_fun() if sync_fun else self.sync_all()
|
||||
return blocks
|
||||
|
||||
def create_outpoints(self, node, *, outputs):
|
||||
"""Send funds to a given list of `{address: amount}` targets using the bitcoind
|
||||
wallet and return the corresponding outpoints as a list of dictionaries
|
||||
`[{"txid": txid, "vout": vout1}, {"txid": txid, "vout": vout2}, ...]`.
|
||||
The result can be used to specify inputs for RPCs like `createrawtransaction`,
|
||||
`createpsbt`, `lockunspent` etc."""
|
||||
assert all(len(output.keys()) == 1 for output in outputs)
|
||||
send_res = node.send(outputs)
|
||||
assert send_res["complete"]
|
||||
utxos = []
|
||||
for output in outputs:
|
||||
address = list(output.keys())[0]
|
||||
vout = find_vout_for_address(node, send_res["txid"], address)
|
||||
utxos.append({"txid": send_res["txid"], "vout": vout})
|
||||
return utxos
|
||||
|
||||
def sync_blocks(self, nodes=None, wait=1, timeout=60):
|
||||
"""
|
||||
Wait until everybody has the same tip.
|
||||
|
@ -490,18 +490,6 @@ def check_node_connections(*, node, num_in, num_out):
|
||||
#############################
|
||||
|
||||
|
||||
def find_output(node, txid, amount, *, blockhash=None):
|
||||
"""
|
||||
Return index to output of txid with value amount
|
||||
Raises exception if there is none.
|
||||
"""
|
||||
txdata = node.getrawtransaction(txid, 1, blockhash)
|
||||
for i in range(len(txdata["vout"])):
|
||||
if txdata["vout"][i]["value"] == amount:
|
||||
return i
|
||||
raise RuntimeError("find_output txid %s : %s not found" % (txid, str(amount)))
|
||||
|
||||
|
||||
# Create large OP_RETURN txouts that can be appended to a transaction
|
||||
# to make it large (helper for constructing large transactions). The
|
||||
# total serialized size of the txouts is about 66k vbytes.
|
||||
|
Reference in New Issue
Block a user