Skip to content

Commit 506d9b2

Browse files
author
MacroFake
committed
Merge bitcoin/bitcoin#24839: test: use MiniWallet for mining_prioritisetransaction.py
b167e53 test: refactor: use `create_lots_of_big_transactions` to dedup where possible (Sebastian Falbesoner) 8973eeb test: use MiniWallet for mining_prioritisetransaction.py (Sebastian Falbesoner) Pull request description: This PR enables one more of the non-wallet functional tests (mining_prioritisetransaction.py) to be run even with the Bitcoin Code wallet by using the MiniWallet instead, as proposed in #20078. Note that the adapted helper function `create_lots_of_big_transactions` is currently only used in this test, i.e. there was no need to change any others. ACKs for top commit: ayush933: tACK b167e53 danielabrozzoni: tACK b167e53 kouloumos: ACK b167e53 furszy: ACK b167e53 Tree-SHA512: ccae20d7d414a720efdeea9c2ae399aa53a3a0e7db72bff8d0cb75d90621a7ae7c019ba68d24f9d06f7b111f87ff33bb9d8e5aa08b763e606cf10268780e205c
2 parents 3340d46 + b167e53 commit 506d9b2

File tree

3 files changed

+44
-57
lines changed

3 files changed

+44
-57
lines changed

test/functional/mempool_limit.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
from decimal import Decimal
88

99
from test_framework.blocktools import COINBASE_MATURITY
10-
from test_framework.messages import COIN
1110
from test_framework.test_framework import BitcoinTestFramework
1211
from test_framework.util import (
1312
assert_equal,
1413
assert_greater_than,
1514
assert_raises_rpc_error,
15+
create_lots_of_big_transactions,
1616
gen_return_txouts,
1717
)
1818
from test_framework.wallet import MiniWallet
@@ -29,16 +29,6 @@ def set_test_params(self):
2929
]]
3030
self.supports_cli = False
3131

32-
def send_large_txs(self, node, miniwallet, txouts, fee, tx_batch_size):
33-
for _ in range(tx_batch_size):
34-
tx = miniwallet.create_self_transfer(from_node=node, fee_rate=0, mempool_valid=False)['tx']
35-
for txout in txouts:
36-
tx.vout.append(txout)
37-
tx.vout[0].nValue -= int(fee * COIN)
38-
res = node.testmempoolaccept([tx.serialize().hex()])[0]
39-
assert_equal(res['fees']['base'], fee)
40-
miniwallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex())
41-
4232
def run_test(self):
4333
txouts = gen_return_txouts()
4434
node = self.nodes[0]
@@ -71,7 +61,7 @@ def run_test(self):
7161
self.log.info("Fill up the mempool with txs with higher fee rate")
7262
for batch_of_txid in range(num_of_batches):
7363
fee = (batch_of_txid + 1) * base_fee
74-
self.send_large_txs(node, miniwallet, txouts, fee, tx_batch_size)
64+
create_lots_of_big_transactions(miniwallet, node, fee, tx_batch_size, txouts)
7565

7666
self.log.info('The tx should be evicted by now')
7767
# The number of transactions created should be greater than the ones present in the mempool

test/functional/mining_prioritisetransaction.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,31 @@
77
from decimal import Decimal
88
import time
99

10-
from test_framework.blocktools import COINBASE_MATURITY
11-
from test_framework.messages import COIN, MAX_BLOCK_WEIGHT
10+
from test_framework.messages import (
11+
COIN,
12+
MAX_BLOCK_WEIGHT,
13+
)
1214
from test_framework.test_framework import BitcoinTestFramework
13-
from test_framework.util import assert_equal, assert_raises_rpc_error, create_confirmed_utxos, create_lots_of_big_transactions, gen_return_txouts
15+
from test_framework.util import (
16+
assert_equal,
17+
assert_raises_rpc_error,
18+
create_lots_of_big_transactions,
19+
gen_return_txouts,
20+
)
1421
from test_framework.wallet import MiniWallet
1522

1623

1724
class PrioritiseTransactionTest(BitcoinTestFramework):
1825
def set_test_params(self):
19-
self.setup_clean_chain = True
2026
self.num_nodes = 1
2127
self.extra_args = [[
2228
"-printpriority=1",
2329
"-acceptnonstdtxn=1",
2430
]] * self.num_nodes
2531
self.supports_cli = False
2632

27-
def skip_test_if_missing_module(self):
28-
self.skip_if_no_wallet()
29-
3033
def test_diamond(self):
3134
self.log.info("Test diamond-shape package with priority")
32-
self.generate(self.wallet, COINBASE_MATURITY + 1)
3335
mock_time = int(time.time())
3436
self.nodes[0].setmocktime(mock_time)
3537

@@ -104,6 +106,7 @@ def test_diamond(self):
104106

105107
def run_test(self):
106108
self.wallet = MiniWallet(self.nodes[0])
109+
self.wallet.rescan_utxos()
107110

108111
# Test `prioritisetransaction` required parameters
109112
assert_raises_rpc_error(-1, "prioritisetransaction", self.nodes[0].prioritisetransaction)
@@ -131,7 +134,10 @@ def run_test(self):
131134
self.relayfee = self.nodes[0].getnetworkinfo()['relayfee']
132135

133136
utxo_count = 90
134-
utxos = create_confirmed_utxos(self, self.relayfee, self.nodes[0], utxo_count)
137+
utxos = self.wallet.send_self_transfer_multi(from_node=self.nodes[0], num_outputs=utxo_count)['new_utxos']
138+
self.generate(self.wallet, 1)
139+
assert_equal(len(self.nodes[0].getrawmempool()), 0)
140+
135141
base_fee = self.relayfee*100 # our transactions are smaller than 100kb
136142
txids = []
137143

@@ -141,7 +147,13 @@ def run_test(self):
141147
txids.append([])
142148
start_range = i * range_size
143149
end_range = start_range + range_size
144-
txids[i] = create_lots_of_big_transactions(self.nodes[0], self.txouts, utxos[start_range:end_range], end_range - start_range, (i+1)*base_fee)
150+
txids[i] = create_lots_of_big_transactions(
151+
self.wallet,
152+
self.nodes[0],
153+
(i+1) * base_fee,
154+
end_range - start_range,
155+
self.txouts,
156+
utxos[start_range:end_range])
145157

146158
# Make sure that the size of each group of transactions exceeds
147159
# MAX_BLOCK_WEIGHT // 4 -- otherwise the test needs to be revised to
@@ -200,17 +212,9 @@ def run_test(self):
200212
assert x not in mempool
201213

202214
# Create a free transaction. Should be rejected.
203-
utxo_list = self.nodes[0].listunspent()
204-
assert len(utxo_list) > 0
205-
utxo = utxo_list[0]
206-
207-
inputs = []
208-
outputs = {}
209-
inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]})
210-
outputs[self.nodes[0].getnewaddress()] = utxo["amount"]
211-
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
212-
tx_hex = self.nodes[0].signrawtransactionwithwallet(raw_tx)["hex"]
213-
tx_id = self.nodes[0].decoderawtransaction(tx_hex)["txid"]
215+
tx_res = self.wallet.create_self_transfer(from_node=self.nodes[0], fee_rate=0, mempool_valid=False)
216+
tx_hex = tx_res['hex']
217+
tx_id = tx_res['txid']
214218

215219
# This will raise an exception due to min relay fee not being met
216220
assert_raises_rpc_error(-26, "min relay fee not met", self.nodes[0].sendrawtransaction, tx_hex)

test/functional/test_framework/util.py

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -553,38 +553,31 @@ def gen_return_txouts():
553553

554554
# Create a spend of each passed-in utxo, splicing in "txouts" to each raw
555555
# transaction to make it large. See gen_return_txouts() above.
556-
def create_lots_of_big_transactions(node, txouts, utxos, num, fee):
557-
addr = node.getnewaddress()
556+
def create_lots_of_big_transactions(mini_wallet, node, fee, tx_batch_size, txouts, utxos=None):
557+
from .messages import COIN
558+
fee_sats = int(fee * COIN)
558559
txids = []
559-
from .messages import tx_from_hex
560-
for _ in range(num):
561-
t = utxos.pop()
562-
inputs = [{"txid": t["txid"], "vout": t["vout"]}]
563-
outputs = {}
564-
change = t['amount'] - fee
565-
outputs[addr] = satoshi_round(change)
566-
rawtx = node.createrawtransaction(inputs, outputs)
567-
tx = tx_from_hex(rawtx)
568-
for txout in txouts:
569-
tx.vout.append(txout)
570-
newtx = tx.serialize().hex()
571-
signresult = node.signrawtransactionwithwallet(newtx, None, "NONE")
572-
txid = node.sendrawtransaction(signresult["hex"], 0)
573-
txids.append(txid)
560+
use_internal_utxos = utxos is None
561+
for _ in range(tx_batch_size):
562+
tx = mini_wallet.create_self_transfer(
563+
from_node=node,
564+
utxo_to_spend=None if use_internal_utxos else utxos.pop(),
565+
fee_rate=0,
566+
mempool_valid=False)['tx']
567+
tx.vout[0].nValue -= fee_sats
568+
tx.vout.extend(txouts)
569+
res = node.testmempoolaccept([tx.serialize().hex()])[0]
570+
assert_equal(res['fees']['base'], fee)
571+
txids.append(node.sendrawtransaction(tx.serialize().hex()))
574572
return txids
575573

576574

577575
def mine_large_block(test_framework, mini_wallet, node):
578576
# generate a 66k transaction,
579577
# and 14 of them is close to the 1MB block limit
580578
txouts = gen_return_txouts()
581-
from .messages import COIN
582-
fee = 100 * int(node.getnetworkinfo()["relayfee"] * COIN)
583-
for _ in range(14):
584-
tx = mini_wallet.create_self_transfer(from_node=node, fee_rate=0, mempool_valid=False)['tx']
585-
tx.vout[0].nValue -= fee
586-
tx.vout.extend(txouts)
587-
mini_wallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex())
579+
fee = 100 * node.getnetworkinfo()["relayfee"]
580+
create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts)
588581
test_framework.generate(node, 1)
589582

590583

0 commit comments

Comments
 (0)