mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-28 14:22:47 +02:00
test: refactor RPCPackagesTest
to use MiniWallet
This commit is contained in:
@@ -32,7 +32,6 @@ from test_framework.messages import (
|
||||
CTxIn,
|
||||
CTxInWitness,
|
||||
CTxOut,
|
||||
tx_from_hex,
|
||||
)
|
||||
from test_framework.script import (
|
||||
CScript,
|
||||
@@ -338,6 +337,28 @@ class MiniWallet:
|
||||
self.scan_tx(from_node.decoderawtransaction(tx_hex))
|
||||
return txid
|
||||
|
||||
def create_self_transfer_chain(self, *, chain_length):
|
||||
"""
|
||||
Create a "chain" of chain_length transactions. The nth transaction in
|
||||
the chain is a child of the n-1th transaction and parent of the n+1th transaction.
|
||||
|
||||
Returns a dic {"chain_hex": chain_hex, "chain_txns" : chain_txns}
|
||||
|
||||
"chain_hex" is a list representing the chain's transactions in hexadecimal.
|
||||
"chain_txns" is a list representing the chain's transactions in the CTransaction object.
|
||||
"""
|
||||
chaintip_utxo = self.get_utxo()
|
||||
chain_hex = []
|
||||
chain_txns = []
|
||||
|
||||
for _ in range(chain_length):
|
||||
tx = self.create_self_transfer(utxo_to_spend=chaintip_utxo)
|
||||
chaintip_utxo = tx["new_utxo"]
|
||||
chain_hex.append(tx["hex"])
|
||||
chain_txns.append(tx["tx"])
|
||||
|
||||
return {"chain_hex": chain_hex, "chain_txns" : chain_txns}
|
||||
|
||||
def send_self_transfer_chain(self, *, from_node, chain_length, utxo_to_spend=None):
|
||||
"""Create and send a "chain" of chain_length transactions. The nth transaction in
|
||||
the chain is a child of the n-1th transaction and parent of the n+1th transaction.
|
||||
@@ -388,56 +409,3 @@ def address_to_scriptpubkey(address):
|
||||
# TODO: also support other address formats
|
||||
else:
|
||||
assert False
|
||||
|
||||
|
||||
def make_chain(node, address, privkeys, parent_txid, parent_value, n=0, parent_locking_script=None, fee=DEFAULT_FEE):
|
||||
"""Build a transaction that spends parent_txid.vout[n] and produces one output with
|
||||
amount = parent_value with a fee deducted.
|
||||
Return tuple (CTransaction object, raw hex, nValue, scriptPubKey of the output created).
|
||||
"""
|
||||
inputs = [{"txid": parent_txid, "vout": n}]
|
||||
my_value = parent_value - fee
|
||||
outputs = {address : my_value}
|
||||
rawtx = node.createrawtransaction(inputs, outputs)
|
||||
prevtxs = [{
|
||||
"txid": parent_txid,
|
||||
"vout": n,
|
||||
"scriptPubKey": parent_locking_script,
|
||||
"amount": parent_value,
|
||||
}] if parent_locking_script else None
|
||||
signedtx = node.signrawtransactionwithkey(hexstring=rawtx, privkeys=privkeys, prevtxs=prevtxs)
|
||||
assert signedtx["complete"]
|
||||
tx = tx_from_hex(signedtx["hex"])
|
||||
return (tx, signedtx["hex"], my_value, tx.vout[0].scriptPubKey.hex())
|
||||
|
||||
def create_child_with_parents(node, address, privkeys, parents_tx, values, locking_scripts, fee=DEFAULT_FEE):
|
||||
"""Creates a transaction that spends the first output of each parent in parents_tx."""
|
||||
num_parents = len(parents_tx)
|
||||
total_value = sum(values)
|
||||
inputs = [{"txid": tx.rehash(), "vout": 0} for tx in parents_tx]
|
||||
outputs = {address : total_value - fee}
|
||||
rawtx_child = node.createrawtransaction(inputs, outputs)
|
||||
prevtxs = []
|
||||
for i in range(num_parents):
|
||||
prevtxs.append({"txid": parents_tx[i].rehash(), "vout": 0, "scriptPubKey": locking_scripts[i], "amount": values[i]})
|
||||
signedtx_child = node.signrawtransactionwithkey(hexstring=rawtx_child, privkeys=privkeys, prevtxs=prevtxs)
|
||||
assert signedtx_child["complete"]
|
||||
return signedtx_child["hex"]
|
||||
|
||||
def create_raw_chain(node, first_coin, address, privkeys, chain_length=25):
|
||||
"""Helper function: create a "chain" of chain_length transactions. The nth transaction in the
|
||||
chain is a child of the n-1th transaction and parent of the n+1th transaction.
|
||||
"""
|
||||
parent_locking_script = None
|
||||
txid = first_coin["txid"]
|
||||
chain_hex = []
|
||||
chain_txns = []
|
||||
value = first_coin["amount"]
|
||||
|
||||
for _ in range(chain_length):
|
||||
(tx, txhex, value, parent_locking_script) = make_chain(node, address, privkeys, txid, value, 0, parent_locking_script)
|
||||
txid = tx.rehash()
|
||||
chain_hex.append(txhex)
|
||||
chain_txns.append(tx)
|
||||
|
||||
return (chain_hex, chain_txns)
|
||||
|
Reference in New Issue
Block a user