mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-02 03:31:35 +02:00
Merge bitcoin/bitcoin#22707: test: refactor use of getrawmempool in functional tests for efficiency
47c48b5f35
test: only use verbose for getrawmempool when necessary in functional tests (Michael Dietz)77349713b1
test: use getmempoolentry instead of getrawmempool in functional tests when appropriate (Michael Dietz)86dbd54ae8
test: improve mempool_updatefrom efficiency by using getmempoolentry for specific txns (Michael Dietz) Pull request description: I don't think this changes the intention of the test. But it does shave ~30 seconds off the time it takes to run. From what I've seen our CI `macOS 11 native [gui] [no depends]` runs `mempool_updatefrom.py` in ~135 seconds. After this PR it should run in ~105 seconds I noticed this improvement should probably be made when testing performance/runtimes of https://github.com/bitcoin/bitcoin/pull/22698. But I wanted to separate this out from that PR so the affects of each is decoupled Edit: The major change in this PR is improving mempool_updatefrom.py's runtime as this is a very long running test. Then made the same efficiency improvements across all the functional tests as it made since to do that here ACKs for top commit: theStack: Tested ACK47c48b5f35
Tree-SHA512: 40f553715f3d4649dc18c2738554eafaca9ea800c4b028c099217896cc1c466ff457ae814d59cf8564c782a8964d8fac3eda60c1b6ffb08bbee1439b2d34434b
This commit is contained in:
@ -90,7 +90,7 @@ class MempoolWtxidTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
self.log.info("Submit child_one to the mempool")
|
self.log.info("Submit child_one to the mempool")
|
||||||
txid_submitted = node.sendrawtransaction(child_one.serialize().hex())
|
txid_submitted = node.sendrawtransaction(child_one.serialize().hex())
|
||||||
assert_equal(node.getrawmempool(True)[txid_submitted]['wtxid'], child_one_wtxid)
|
assert_equal(node.getmempoolentry(txid_submitted)['wtxid'], child_one_wtxid)
|
||||||
|
|
||||||
peer_wtxid_relay.wait_for_broadcast([child_one_wtxid])
|
peer_wtxid_relay.wait_for_broadcast([child_one_wtxid])
|
||||||
assert_equal(node.getmempoolinfo()["unbroadcastcount"], 0)
|
assert_equal(node.getmempoolinfo()["unbroadcastcount"], 0)
|
||||||
|
@ -65,8 +65,7 @@ class MempoolCompatibilityTest(BitcoinTestFramework):
|
|||||||
self.log.info("Add unbroadcasted tx to mempool on new node and shutdown")
|
self.log.info("Add unbroadcasted tx to mempool on new node and shutdown")
|
||||||
unbroadcasted_tx_hash = new_wallet.send_self_transfer(from_node=new_node)['txid']
|
unbroadcasted_tx_hash = new_wallet.send_self_transfer(from_node=new_node)['txid']
|
||||||
assert unbroadcasted_tx_hash in new_node.getrawmempool()
|
assert unbroadcasted_tx_hash in new_node.getrawmempool()
|
||||||
mempool = new_node.getrawmempool(True)
|
assert new_node.getmempoolentry(unbroadcasted_tx_hash)['unbroadcast']
|
||||||
assert mempool[unbroadcasted_tx_hash]['unbroadcast']
|
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
|
|
||||||
self.log.info("Move mempool.dat from new to old node")
|
self.log.info("Move mempool.dat from new to old node")
|
||||||
|
@ -74,7 +74,7 @@ class MempoolPackageLimitsTest(BitcoinTestFramework):
|
|||||||
txid = tx.rehash()
|
txid = tx.rehash()
|
||||||
if i < mempool_count:
|
if i < mempool_count:
|
||||||
node.sendrawtransaction(txhex)
|
node.sendrawtransaction(txhex)
|
||||||
assert_equal(node.getrawmempool(verbose=True)[txid]["ancestorcount"], i + 1)
|
assert_equal(node.getmempoolentry(txid)["ancestorcount"], i + 1)
|
||||||
else:
|
else:
|
||||||
chain_hex.append(txhex)
|
chain_hex.append(txhex)
|
||||||
chain_txns.append(tx)
|
chain_txns.append(tx)
|
||||||
|
@ -51,7 +51,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
(second_chain, second_chain_value) = chain_transaction(self.nodes[0], [utxo[1]['txid']], [utxo[1]['vout']], utxo[1]['amount'], fee, 1)
|
(second_chain, second_chain_value) = chain_transaction(self.nodes[0], [utxo[1]['txid']], [utxo[1]['vout']], utxo[1]['amount'], fee, 1)
|
||||||
|
|
||||||
# Check mempool has MAX_ANCESTORS + 1 transactions in it
|
# Check mempool has MAX_ANCESTORS + 1 transactions in it
|
||||||
assert_equal(len(self.nodes[0].getrawmempool(True)), MAX_ANCESTORS + 1)
|
assert_equal(len(self.nodes[0].getrawmempool()), MAX_ANCESTORS + 1)
|
||||||
|
|
||||||
# Adding one more transaction on to the chain should fail.
|
# Adding one more transaction on to the chain should fail.
|
||||||
assert_raises_rpc_error(-26, "too-long-mempool-chain, too many unconfirmed ancestors [limit: 25]", chain_transaction, self.nodes[0], [txid], [0], value, fee, 1)
|
assert_raises_rpc_error(-26, "too-long-mempool-chain, too many unconfirmed ancestors [limit: 25]", chain_transaction, self.nodes[0], [txid], [0], value, fee, 1)
|
||||||
@ -74,7 +74,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
self.nodes[0].sendrawtransaction(signed_second_tx['hex'])
|
self.nodes[0].sendrawtransaction(signed_second_tx['hex'])
|
||||||
|
|
||||||
# Finally, check that we added two transactions
|
# Finally, check that we added two transactions
|
||||||
assert_equal(len(self.nodes[0].getrawmempool(True)), MAX_ANCESTORS + 3)
|
assert_equal(len(self.nodes[0].getrawmempool()), MAX_ANCESTORS + 3)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
MempoolPackagesTest().main()
|
MempoolPackagesTest().main()
|
||||||
|
@ -89,28 +89,28 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
assert_equal(entry, mempool[x])
|
assert_equal(entry, mempool[x])
|
||||||
|
|
||||||
# Check that the descendant calculations are correct
|
# Check that the descendant calculations are correct
|
||||||
assert_equal(mempool[x]['descendantcount'], descendant_count)
|
assert_equal(entry['descendantcount'], descendant_count)
|
||||||
descendant_fees += mempool[x]['fee']
|
descendant_fees += entry['fee']
|
||||||
assert_equal(mempool[x]['modifiedfee'], mempool[x]['fee'])
|
assert_equal(entry['modifiedfee'], entry['fee'])
|
||||||
assert_equal(mempool[x]['fees']['base'], mempool[x]['fee'])
|
assert_equal(entry['fees']['base'], entry['fee'])
|
||||||
assert_equal(mempool[x]['fees']['modified'], mempool[x]['modifiedfee'])
|
assert_equal(entry['fees']['modified'], entry['modifiedfee'])
|
||||||
assert_equal(mempool[x]['descendantfees'], descendant_fees * COIN)
|
assert_equal(entry['descendantfees'], descendant_fees * COIN)
|
||||||
assert_equal(mempool[x]['fees']['descendant'], descendant_fees)
|
assert_equal(entry['fees']['descendant'], descendant_fees)
|
||||||
descendant_vsize += mempool[x]['vsize']
|
descendant_vsize += entry['vsize']
|
||||||
assert_equal(mempool[x]['descendantsize'], descendant_vsize)
|
assert_equal(entry['descendantsize'], descendant_vsize)
|
||||||
descendant_count += 1
|
descendant_count += 1
|
||||||
|
|
||||||
# Check that ancestor calculations are correct
|
# Check that ancestor calculations are correct
|
||||||
assert_equal(mempool[x]['ancestorcount'], ancestor_count)
|
assert_equal(entry['ancestorcount'], ancestor_count)
|
||||||
assert_equal(mempool[x]['ancestorfees'], ancestor_fees * COIN)
|
assert_equal(entry['ancestorfees'], ancestor_fees * COIN)
|
||||||
assert_equal(mempool[x]['ancestorsize'], ancestor_vsize)
|
assert_equal(entry['ancestorsize'], ancestor_vsize)
|
||||||
ancestor_vsize -= mempool[x]['vsize']
|
ancestor_vsize -= entry['vsize']
|
||||||
ancestor_fees -= mempool[x]['fee']
|
ancestor_fees -= entry['fee']
|
||||||
ancestor_count -= 1
|
ancestor_count -= 1
|
||||||
|
|
||||||
# Check that parent/child list is correct
|
# Check that parent/child list is correct
|
||||||
assert_equal(mempool[x]['spentby'], descendants[-1:])
|
assert_equal(entry['spentby'], descendants[-1:])
|
||||||
assert_equal(mempool[x]['depends'], ancestors[-2:-1])
|
assert_equal(entry['depends'], ancestors[-2:-1])
|
||||||
|
|
||||||
# Check that getmempooldescendants is correct
|
# Check that getmempooldescendants is correct
|
||||||
assert_equal(sorted(descendants), sorted(self.nodes[0].getmempooldescendants(x)))
|
assert_equal(sorted(descendants), sorted(self.nodes[0].getmempooldescendants(x)))
|
||||||
@ -153,12 +153,12 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
# Check that ancestor modified fees includes fee deltas from
|
# Check that ancestor modified fees includes fee deltas from
|
||||||
# prioritisetransaction
|
# prioritisetransaction
|
||||||
self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=1000)
|
self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=1000)
|
||||||
mempool = self.nodes[0].getrawmempool(True)
|
|
||||||
ancestor_fees = 0
|
ancestor_fees = 0
|
||||||
for x in chain:
|
for x in chain:
|
||||||
ancestor_fees += mempool[x]['fee']
|
entry = self.nodes[0].getmempoolentry(x)
|
||||||
assert_equal(mempool[x]['fees']['ancestor'], ancestor_fees + Decimal('0.00001'))
|
ancestor_fees += entry['fee']
|
||||||
assert_equal(mempool[x]['ancestorfees'], ancestor_fees * COIN + 1000)
|
assert_equal(entry['fees']['ancestor'], ancestor_fees + Decimal('0.00001'))
|
||||||
|
assert_equal(entry['ancestorfees'], ancestor_fees * COIN + 1000)
|
||||||
|
|
||||||
# Undo the prioritisetransaction for later tests
|
# Undo the prioritisetransaction for later tests
|
||||||
self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=-1000)
|
self.nodes[0].prioritisetransaction(txid=chain[0], fee_delta=-1000)
|
||||||
@ -166,13 +166,13 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
# Check that descendant modified fees includes fee deltas from
|
# Check that descendant modified fees includes fee deltas from
|
||||||
# prioritisetransaction
|
# prioritisetransaction
|
||||||
self.nodes[0].prioritisetransaction(txid=chain[-1], fee_delta=1000)
|
self.nodes[0].prioritisetransaction(txid=chain[-1], fee_delta=1000)
|
||||||
mempool = self.nodes[0].getrawmempool(True)
|
|
||||||
|
|
||||||
descendant_fees = 0
|
descendant_fees = 0
|
||||||
for x in reversed(chain):
|
for x in reversed(chain):
|
||||||
descendant_fees += mempool[x]['fee']
|
entry = self.nodes[0].getmempoolentry(x)
|
||||||
assert_equal(mempool[x]['fees']['descendant'], descendant_fees + Decimal('0.00001'))
|
descendant_fees += entry['fee']
|
||||||
assert_equal(mempool[x]['descendantfees'], descendant_fees * COIN + 1000)
|
assert_equal(entry['fees']['descendant'], descendant_fees + Decimal('0.00001'))
|
||||||
|
assert_equal(entry['descendantfees'], descendant_fees * COIN + 1000)
|
||||||
|
|
||||||
# Adding one more transaction on to the chain should fail.
|
# Adding one more transaction on to the chain should fail.
|
||||||
assert_raises_rpc_error(-26, "too-long-mempool-chain", chain_transaction, self.nodes[0], [txid], [vout], value, fee, 1)
|
assert_raises_rpc_error(-26, "too-long-mempool-chain", chain_transaction, self.nodes[0], [txid], [vout], value, fee, 1)
|
||||||
@ -190,16 +190,15 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
|
self.nodes[1].invalidateblock(self.nodes[1].getbestblockhash())
|
||||||
|
|
||||||
# Now check that the transaction is in the mempool, with the right modified fee
|
# Now check that the transaction is in the mempool, with the right modified fee
|
||||||
mempool = self.nodes[0].getrawmempool(True)
|
|
||||||
|
|
||||||
descendant_fees = 0
|
descendant_fees = 0
|
||||||
for x in reversed(chain):
|
for x in reversed(chain):
|
||||||
descendant_fees += mempool[x]['fee']
|
entry = self.nodes[0].getmempoolentry(x)
|
||||||
|
descendant_fees += entry['fee']
|
||||||
if (x == chain[-1]):
|
if (x == chain[-1]):
|
||||||
assert_equal(mempool[x]['modifiedfee'], mempool[x]['fee']+satoshi_round(0.00002))
|
assert_equal(entry['modifiedfee'], entry['fee']+satoshi_round(0.00002))
|
||||||
assert_equal(mempool[x]['fees']['modified'], mempool[x]['fee']+satoshi_round(0.00002))
|
assert_equal(entry['fees']['modified'], entry['fee']+satoshi_round(0.00002))
|
||||||
assert_equal(mempool[x]['descendantfees'], descendant_fees * COIN + 2000)
|
assert_equal(entry['descendantfees'], descendant_fees * COIN + 2000)
|
||||||
assert_equal(mempool[x]['fees']['descendant'], descendant_fees+satoshi_round(0.00002))
|
assert_equal(entry['fees']['descendant'], descendant_fees+satoshi_round(0.00002))
|
||||||
|
|
||||||
# Check that node1's mempool is as expected (-> custom ancestor limit)
|
# Check that node1's mempool is as expected (-> custom ancestor limit)
|
||||||
mempool0 = self.nodes[0].getrawmempool(False)
|
mempool0 = self.nodes[0].getrawmempool(False)
|
||||||
@ -255,7 +254,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||||||
# - txs from previous ancestor test (-> custom ancestor limit)
|
# - txs from previous ancestor test (-> custom ancestor limit)
|
||||||
# - parent tx for descendant test
|
# - parent tx for descendant test
|
||||||
# - txs chained off parent tx (-> custom descendant limit)
|
# - txs chained off parent tx (-> custom descendant limit)
|
||||||
self.wait_until(lambda: len(self.nodes[1].getrawmempool(False)) ==
|
self.wait_until(lambda: len(self.nodes[1].getrawmempool()) ==
|
||||||
MAX_ANCESTORS_CUSTOM + 1 + MAX_DESCENDANTS_CUSTOM, timeout=10)
|
MAX_ANCESTORS_CUSTOM + 1 + MAX_DESCENDANTS_CUSTOM, timeout=10)
|
||||||
mempool0 = self.nodes[0].getrawmempool(False)
|
mempool0 = self.nodes[0].getrawmempool(False)
|
||||||
mempool1 = self.nodes[1].getrawmempool(False)
|
mempool1 = self.nodes[1].getrawmempool(False)
|
||||||
|
@ -94,9 +94,7 @@ class MempoolUnbroadcastTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
self.log.info("Rebroadcast transaction and ensure it is not added to unbroadcast set when already in mempool")
|
self.log.info("Rebroadcast transaction and ensure it is not added to unbroadcast set when already in mempool")
|
||||||
rpc_tx_hsh = node.sendrawtransaction(txFS["hex"])
|
rpc_tx_hsh = node.sendrawtransaction(txFS["hex"])
|
||||||
mempool = node.getrawmempool(True)
|
assert not node.getmempoolentry(rpc_tx_hsh)['unbroadcast']
|
||||||
assert rpc_tx_hsh in mempool
|
|
||||||
assert not mempool[rpc_tx_hsh]['unbroadcast']
|
|
||||||
|
|
||||||
def test_txn_removal(self):
|
def test_txn_removal(self):
|
||||||
self.log.info("Test that transactions removed from mempool are removed from unbroadcast set")
|
self.log.info("Test that transactions removed from mempool are removed from unbroadcast set")
|
||||||
|
@ -86,7 +86,7 @@ class MempoolUpdateFromBlockTest(BitcoinTestFramework):
|
|||||||
unsigned_raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
unsigned_raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
|
||||||
signed_raw_tx = self.nodes[0].signrawtransactionwithwallet(unsigned_raw_tx)
|
signed_raw_tx = self.nodes[0].signrawtransactionwithwallet(unsigned_raw_tx)
|
||||||
tx_id.append(self.nodes[0].sendrawtransaction(signed_raw_tx['hex']))
|
tx_id.append(self.nodes[0].sendrawtransaction(signed_raw_tx['hex']))
|
||||||
tx_size.append(self.nodes[0].getrawmempool(True)[tx_id[-1]]['vsize'])
|
tx_size.append(self.nodes[0].getmempoolentry(tx_id[-1])['vsize'])
|
||||||
|
|
||||||
if tx_count in n_tx_to_mine:
|
if tx_count in n_tx_to_mine:
|
||||||
# The created transactions are mined into blocks by batches.
|
# The created transactions are mined into blocks by batches.
|
||||||
@ -109,10 +109,11 @@ class MempoolUpdateFromBlockTest(BitcoinTestFramework):
|
|||||||
self.log.info('Checking descendants/ancestors properties of all of the in-mempool transactions...')
|
self.log.info('Checking descendants/ancestors properties of all of the in-mempool transactions...')
|
||||||
for k, tx in enumerate(tx_id):
|
for k, tx in enumerate(tx_id):
|
||||||
self.log.debug('Check transaction #{}.'.format(k))
|
self.log.debug('Check transaction #{}.'.format(k))
|
||||||
assert_equal(self.nodes[0].getrawmempool(True)[tx]['descendantcount'], size - k)
|
entry = self.nodes[0].getmempoolentry(tx)
|
||||||
assert_equal(self.nodes[0].getrawmempool(True)[tx]['descendantsize'], sum(tx_size[k:size]))
|
assert_equal(entry['descendantcount'], size - k)
|
||||||
assert_equal(self.nodes[0].getrawmempool(True)[tx]['ancestorcount'], k + 1)
|
assert_equal(entry['descendantsize'], sum(tx_size[k:size]))
|
||||||
assert_equal(self.nodes[0].getrawmempool(True)[tx]['ancestorsize'], sum(tx_size[0:(k + 1)]))
|
assert_equal(entry['ancestorcount'], k + 1)
|
||||||
|
assert_equal(entry['ancestorsize'], sum(tx_size[0:(k + 1)]))
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
# Use batch size limited by DEFAULT_ANCESTOR_LIMIT = 25 to not fire "too many unconfirmed parents" error.
|
# Use batch size limited by DEFAULT_ANCESTOR_LIMIT = 25 to not fire "too many unconfirmed parents" error.
|
||||||
|
@ -380,7 +380,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Create same transaction over sendtoaddress.
|
# Create same transaction over sendtoaddress.
|
||||||
txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1.1)
|
txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1.1)
|
||||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
signedFee = self.nodes[0].getmempoolentry(txId)['fee']
|
||||||
|
|
||||||
# Compare fee.
|
# Compare fee.
|
||||||
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
||||||
@ -403,7 +403,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Create same transaction over sendtoaddress.
|
# Create same transaction over sendtoaddress.
|
||||||
txId = self.nodes[0].sendmany("", outputs)
|
txId = self.nodes[0].sendmany("", outputs)
|
||||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
signedFee = self.nodes[0].getmempoolentry(txId)['fee']
|
||||||
|
|
||||||
# Compare fee.
|
# Compare fee.
|
||||||
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
||||||
@ -427,7 +427,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Create same transaction over sendtoaddress.
|
# Create same transaction over sendtoaddress.
|
||||||
txId = self.nodes[0].sendtoaddress(mSigObj, 1.1)
|
txId = self.nodes[0].sendtoaddress(mSigObj, 1.1)
|
||||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
signedFee = self.nodes[0].getmempoolentry(txId)['fee']
|
||||||
|
|
||||||
# Compare fee.
|
# Compare fee.
|
||||||
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
||||||
@ -468,7 +468,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Create same transaction over sendtoaddress.
|
# Create same transaction over sendtoaddress.
|
||||||
txId = self.nodes[0].sendtoaddress(mSigObj, 1.1)
|
txId = self.nodes[0].sendtoaddress(mSigObj, 1.1)
|
||||||
signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
|
signedFee = self.nodes[0].getmempoolentry(txId)['fee']
|
||||||
|
|
||||||
# Compare fee.
|
# Compare fee.
|
||||||
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
||||||
@ -600,7 +600,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
# Create same transaction over sendtoaddress.
|
# Create same transaction over sendtoaddress.
|
||||||
txId = self.nodes[1].sendmany("", outputs)
|
txId = self.nodes[1].sendmany("", outputs)
|
||||||
signedFee = self.nodes[1].getrawmempool(True)[txId]['fee']
|
signedFee = self.nodes[1].getmempoolentry(txId)['fee']
|
||||||
|
|
||||||
# Compare fee.
|
# Compare fee.
|
||||||
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee)
|
||||||
|
Reference in New Issue
Block a user