From dddca3899c4738e512313a85aeb006310e34e31f Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Fri, 10 Sep 2021 17:07:58 +0530 Subject: test: use MiniWallet in mempool_limit.py Co-authored-by: ShubhamPalriwala Co-authored-by: stackman27 Signed-off-by: ShubhamPalriwala --- test/functional/mempool_limit.py | 66 ++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 30 deletions(-) (limited to 'test') diff --git a/test/functional/mempool_limit.py b/test/functional/mempool_limit.py index 1b1ac23024..f67737f756 100755 --- a/test/functional/mempool_limit.py +++ b/test/functional/mempool_limit.py @@ -6,8 +6,11 @@ from decimal import Decimal +from test_framework.blocktools import COINBASE_MATURITY from test_framework.test_framework import BitcoinTestFramework -from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error, create_confirmed_utxos, create_lots_of_big_transactions, gen_return_txouts +from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error, gen_return_txouts +from test_framework.wallet import MiniWallet + class MempoolLimitTest(BitcoinTestFramework): def set_test_params(self): @@ -20,55 +23,58 @@ class MempoolLimitTest(BitcoinTestFramework): ]] self.supports_cli = False - def skip_test_if_missing_module(self): - self.skip_if_no_wallet() + def send_large_txs(self, miniwallet, txouts, fee_rate, tx_batch_size): + for _ in range(tx_batch_size): + tx = miniwallet.create_self_transfer(from_node=self.nodes[0], fee_rate=fee_rate)['tx'] + for txout in txouts: + tx.vout.append(txout) + miniwallet.sendrawtransaction(from_node=self.nodes[0], tx_hex=tx.serialize().hex()) def run_test(self): txouts = gen_return_txouts() + miniwallet = MiniWallet(self.nodes[0]) relayfee = self.nodes[0].getnetworkinfo()['relayfee'] self.log.info('Check that mempoolminfee is minrelytxfee') assert_equal(self.nodes[0].getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) assert_equal(self.nodes[0].getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) - txids = [] - utxos = create_confirmed_utxos(self, relayfee, self.nodes[0], 91) + tx_batch_size = 25 + num_of_batches = 3 + # Generate UTXOs to flood the mempool + # 1 to create a tx initially that will be evicted from the mempool later + # 3 batches of multiple transactions with a fee rate much higher than the previous UTXO + # And 1 more to verify that this tx does not get added to the mempool with a fee rate less than the mempoolminfee + self.generate(miniwallet, 1 + (num_of_batches * tx_batch_size) + 1) + + # Mine 99 blocks so that the UTXOs are allowed to be spent + self.generate(self.nodes[0], COINBASE_MATURITY - 1) self.log.info('Create a mempool tx that will be evicted') - us0 = utxos.pop() - inputs = [{ "txid" : us0["txid"], "vout" : us0["vout"]}] - outputs = {self.nodes[0].getnewaddress() : 0.0001} - tx = self.nodes[0].createrawtransaction(inputs, outputs) - self.nodes[0].settxfee(relayfee) # specifically fund this tx with low fee - txF = self.nodes[0].fundrawtransaction(tx) - self.nodes[0].settxfee(0) # return to automatic fee selection - txFS = self.nodes[0].signrawtransactionwithwallet(txF['hex']) - txid = self.nodes[0].sendrawtransaction(txFS['hex']) + tx_to_be_evicted_id = miniwallet.send_self_transfer(from_node=self.nodes[0], fee_rate=relayfee)["txid"] - relayfee = self.nodes[0].getnetworkinfo()['relayfee'] - base_fee = relayfee*100 - for i in range (3): - txids.append([]) - txids[i] = create_lots_of_big_transactions(self.nodes[0], txouts, utxos[30*i:30*i+30], 30, (i+1)*base_fee) + # Increase the tx fee rate massively to give the subsequent transactions a higher priority in the mempool + base_fee = relayfee * 1000 + + self.log.info("Fill up the mempool with txs with higher fee rate") + for batch_of_txid in range(num_of_batches): + fee_rate=(batch_of_txid + 1) * base_fee + self.send_large_txs(miniwallet, txouts, fee_rate, tx_batch_size) self.log.info('The tx should be evicted by now') - assert txid not in self.nodes[0].getrawmempool() - txdata = self.nodes[0].gettransaction(txid) - assert txdata['confirmations'] == 0 #confirmation should still be 0 + # The number of transactions created should be greater than the ones present in the mempool + assert_greater_than(tx_batch_size * num_of_batches, len(self.nodes[0].getrawmempool())) + # Initial tx created should not be present in the mempool anymore as it had a lower fee rate + assert tx_to_be_evicted_id not in self.nodes[0].getrawmempool() self.log.info('Check that mempoolminfee is larger than minrelytxfee') assert_equal(self.nodes[0].getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) assert_greater_than(self.nodes[0].getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) + # Deliberately try to create a tx with a fee less than the minimum mempool fee to assert that it does not get added to the mempool self.log.info('Create a mempool tx that will not pass mempoolminfee') - us0 = utxos.pop() - inputs = [{ "txid" : us0["txid"], "vout" : us0["vout"]}] - outputs = {self.nodes[0].getnewaddress() : 0.0001} - tx = self.nodes[0].createrawtransaction(inputs, outputs) - # specifically fund this tx with a fee < mempoolminfee, >= than minrelaytxfee - txF = self.nodes[0].fundrawtransaction(tx, {'feeRate': relayfee}) - txFS = self.nodes[0].signrawtransactionwithwallet(txF['hex']) - assert_raises_rpc_error(-26, "mempool min fee not met", self.nodes[0].sendrawtransaction, txFS['hex']) + assert_raises_rpc_error(-26, "mempool min fee not met", miniwallet.send_self_transfer, from_node=self.nodes[0], fee_rate=relayfee, mempool_valid=False) + if __name__ == '__main__': MempoolLimitTest().main() -- cgit v1.2.3 From d447ded6babebe7c7948e585c9e78bf34dbef226 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 14 Sep 2021 00:55:45 +0530 Subject: replace: self.nodes[0] with node --- test/functional/mempool_limit.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'test') diff --git a/test/functional/mempool_limit.py b/test/functional/mempool_limit.py index f67737f756..6d9b79e116 100755 --- a/test/functional/mempool_limit.py +++ b/test/functional/mempool_limit.py @@ -23,21 +23,22 @@ class MempoolLimitTest(BitcoinTestFramework): ]] self.supports_cli = False - def send_large_txs(self, miniwallet, txouts, fee_rate, tx_batch_size): + def send_large_txs(self, node, miniwallet, txouts, fee_rate, tx_batch_size): for _ in range(tx_batch_size): - tx = miniwallet.create_self_transfer(from_node=self.nodes[0], fee_rate=fee_rate)['tx'] + tx = miniwallet.create_self_transfer(from_node=node, fee_rate=fee_rate)['tx'] for txout in txouts: tx.vout.append(txout) - miniwallet.sendrawtransaction(from_node=self.nodes[0], tx_hex=tx.serialize().hex()) + miniwallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex()) def run_test(self): txouts = gen_return_txouts() - miniwallet = MiniWallet(self.nodes[0]) - relayfee = self.nodes[0].getnetworkinfo()['relayfee'] + node=self.nodes[0] + miniwallet = MiniWallet(node) + relayfee = node.getnetworkinfo()['relayfee'] self.log.info('Check that mempoolminfee is minrelytxfee') - assert_equal(self.nodes[0].getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) - assert_equal(self.nodes[0].getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) + assert_equal(node.getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) + assert_equal(node.getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) tx_batch_size = 25 num_of_batches = 3 @@ -48,10 +49,10 @@ class MempoolLimitTest(BitcoinTestFramework): self.generate(miniwallet, 1 + (num_of_batches * tx_batch_size) + 1) # Mine 99 blocks so that the UTXOs are allowed to be spent - self.generate(self.nodes[0], COINBASE_MATURITY - 1) + self.generate(node, COINBASE_MATURITY - 1) self.log.info('Create a mempool tx that will be evicted') - tx_to_be_evicted_id = miniwallet.send_self_transfer(from_node=self.nodes[0], fee_rate=relayfee)["txid"] + tx_to_be_evicted_id = miniwallet.send_self_transfer(from_node=node, fee_rate=relayfee)["txid"] # Increase the tx fee rate massively to give the subsequent transactions a higher priority in the mempool base_fee = relayfee * 1000 @@ -59,21 +60,21 @@ class MempoolLimitTest(BitcoinTestFramework): self.log.info("Fill up the mempool with txs with higher fee rate") for batch_of_txid in range(num_of_batches): fee_rate=(batch_of_txid + 1) * base_fee - self.send_large_txs(miniwallet, txouts, fee_rate, tx_batch_size) + self.send_large_txs(node, miniwallet, txouts, fee_rate, tx_batch_size) self.log.info('The tx should be evicted by now') # The number of transactions created should be greater than the ones present in the mempool - assert_greater_than(tx_batch_size * num_of_batches, len(self.nodes[0].getrawmempool())) + assert_greater_than(tx_batch_size * num_of_batches, len(node.getrawmempool())) # Initial tx created should not be present in the mempool anymore as it had a lower fee rate - assert tx_to_be_evicted_id not in self.nodes[0].getrawmempool() + assert tx_to_be_evicted_id not in node.getrawmempool() self.log.info('Check that mempoolminfee is larger than minrelytxfee') - assert_equal(self.nodes[0].getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) - assert_greater_than(self.nodes[0].getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) + assert_equal(node.getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) + assert_greater_than(node.getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) # Deliberately try to create a tx with a fee less than the minimum mempool fee to assert that it does not get added to the mempool self.log.info('Create a mempool tx that will not pass mempoolminfee') - assert_raises_rpc_error(-26, "mempool min fee not met", miniwallet.send_self_transfer, from_node=self.nodes[0], fee_rate=relayfee, mempool_valid=False) + assert_raises_rpc_error(-26, "mempool min fee not met", miniwallet.send_self_transfer, from_node=node, fee_rate=relayfee, mempool_valid=False) if __name__ == '__main__': -- cgit v1.2.3 From 08634e82c68ea1be79e1395f4f551082f497023f Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 14 Sep 2021 00:58:25 +0530 Subject: fix typos in logging messages --- test/functional/mempool_limit.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/functional/mempool_limit.py b/test/functional/mempool_limit.py index 6d9b79e116..c82dbb3f3d 100755 --- a/test/functional/mempool_limit.py +++ b/test/functional/mempool_limit.py @@ -36,7 +36,7 @@ class MempoolLimitTest(BitcoinTestFramework): miniwallet = MiniWallet(node) relayfee = node.getnetworkinfo()['relayfee'] - self.log.info('Check that mempoolminfee is minrelytxfee') + self.log.info('Check that mempoolminfee is minrelaytxfee') assert_equal(node.getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) assert_equal(node.getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) @@ -68,7 +68,7 @@ class MempoolLimitTest(BitcoinTestFramework): # Initial tx created should not be present in the mempool anymore as it had a lower fee rate assert tx_to_be_evicted_id not in node.getrawmempool() - self.log.info('Check that mempoolminfee is larger than minrelytxfee') + self.log.info('Check that mempoolminfee is larger than minrelaytxfee') assert_equal(node.getmempoolinfo()['minrelaytxfee'], Decimal('0.00001000')) assert_greater_than(node.getmempoolinfo()['mempoolminfee'], Decimal('0.00001000')) -- cgit v1.2.3