Skip to content

Commit 6add1c4

Browse files
committed
merge bitcoin#24839: use MiniWallet for mining_prioritisetransaction.py
includes changes to util.py, mining_prioritisetransaction.py from bitcoin#25435 (fa8421b) and changes to util.py from bitcoin#25356 (fa779de) due to OOO backport needed for correctness
1 parent 69abcec commit 6add1c4

File tree

3 files changed

+44
-60
lines changed

3 files changed

+44
-60
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(fee_rate=0)['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: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,31 @@
66

77
from decimal import Decimal
88

9-
from test_framework.blocktools import COINBASE_MATURITY
10-
from test_framework.messages import COIN, MAX_BLOCK_SIZE
9+
from test_framework.messages import (
10+
COIN,
11+
MAX_BLOCK_SIZE,
12+
)
1113
from test_framework.test_framework import BitcoinTestFramework
12-
from test_framework.util import assert_equal, assert_raises_rpc_error, create_confirmed_utxos, create_lots_of_big_transactions, gen_return_txouts
14+
from test_framework.util import (
15+
assert_equal,
16+
assert_raises_rpc_error,
17+
create_lots_of_big_transactions,
18+
gen_return_txouts,
19+
)
1320
from test_framework.wallet import MiniWallet
1421

1522

1623
class PrioritiseTransactionTest(BitcoinTestFramework):
1724
def set_test_params(self):
18-
self.setup_clean_chain = True
19-
self.num_nodes = 2
25+
self.num_nodes = 1
2026
self.extra_args = [[
2127
"-printpriority=1",
2228
"-datacarriersize=100000",
2329
]] * self.num_nodes
2430
self.supports_cli = False
2531

26-
def skip_test_if_missing_module(self):
27-
self.skip_if_no_wallet()
28-
2932
def test_diamond(self):
3033
self.log.info("Test diamond-shape package with priority")
31-
self.generate(self.wallet, COINBASE_MATURITY + 1)
3234
self.nodes[0].setmocktime(self.mocktime)
3335

3436
# tx_a
@@ -83,7 +85,6 @@ def test_diamond(self):
8385

8486
self.log.info("Test priority while txs are not in mempool")
8587
self.restart_node(0, extra_args=["-nopersistmempool"])
86-
self.connect_nodes(0, 1)
8788
self.nodes[0].setmocktime(self.mocktime)
8889
assert_equal(self.nodes[0].getmempoolinfo()["size"], 0)
8990
self.nodes[0].prioritisetransaction(txid=txid_b, fee_delta=int(fee_delta_b * COIN))
@@ -100,10 +101,10 @@ def test_diamond(self):
100101

101102
# Use default extra_args
102103
self.restart_node(0)
103-
self.connect_nodes(0, 1)
104104

105105
def run_test(self):
106106
self.wallet = MiniWallet(self.nodes[0])
107+
self.wallet.rescan_utxos()
107108

108109
# Test `prioritisetransaction` required parameters
109110
assert_raises_rpc_error(-1, "prioritisetransaction", self.nodes[0].prioritisetransaction)
@@ -127,7 +128,10 @@ def run_test(self):
127128
self.relayfee = self.nodes[0].getnetworkinfo()['relayfee']
128129

129130
utxo_count = 90
130-
utxos = create_confirmed_utxos(self, self.relayfee, self.nodes[0], utxo_count)
131+
utxos = self.wallet.send_self_transfer_multi(from_node=self.nodes[0], num_outputs=utxo_count)['new_utxos']
132+
self.generate(self.wallet, 1)
133+
assert_equal(len(self.nodes[0].getrawmempool()), 0)
134+
131135
base_fee = self.relayfee*100 # our transactions are smaller than 100kb
132136
txids = []
133137

@@ -137,7 +141,13 @@ def run_test(self):
137141
txids.append([])
138142
start_range = i * range_size
139143
end_range = start_range + range_size
140-
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)
144+
txids[i] = create_lots_of_big_transactions(
145+
self.wallet,
146+
self.nodes[0],
147+
(i+1) * base_fee,
148+
end_range - start_range,
149+
self.txouts,
150+
utxos[start_range:end_range])
141151

142152
# Make sure that the size of each group of transactions exceeds
143153
# MAX_BLOCK_SIZE -- otherwise the test needs to be revised to
@@ -196,17 +206,9 @@ def run_test(self):
196206
assert x not in mempool
197207

198208
# Create a free transaction. Should be rejected.
199-
utxo_list = self.nodes[0].listunspent()
200-
assert len(utxo_list) > 0
201-
utxo = utxo_list[0]
202-
203-
inputs = []
204-
outputs = {}
205-
inputs.append({"txid" : utxo["txid"], "vout" : utxo["vout"]})
206-
outputs[self.nodes[0].getnewaddress()] = utxo["amount"]
207-
raw_tx = self.nodes[0].createrawtransaction(inputs, outputs)
208-
tx_hex = self.nodes[0].signrawtransactionwithwallet(raw_tx)["hex"]
209-
tx_id = self.nodes[0].decoderawtransaction(tx_hex)["txid"]
209+
tx_res = self.wallet.create_self_transfer(fee_rate=0)
210+
tx_hex = tx_res['hex']
211+
tx_id = tx_res['txid']
210212

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

test/functional/test_framework/util.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -614,38 +614,30 @@ def gen_return_txouts():
614614

615615
# Create a spend of each passed-in utxo, splicing in "txouts" to each raw
616616
# transaction to make it large. See gen_return_txouts() above.
617-
def create_lots_of_big_transactions(node, txouts, utxos, num, fee):
618-
addr = node.getnewaddress()
617+
def create_lots_of_big_transactions(mini_wallet, node, fee, tx_batch_size, txouts, utxos=None):
618+
from .messages import COIN
619+
fee_sats = int(fee * COIN)
619620
txids = []
620-
from .messages import tx_from_hex
621-
for _ in range(num):
622-
t = utxos.pop()
623-
inputs = [{"txid": t["txid"], "vout": t["vout"]}]
624-
outputs = {}
625-
change = t['amount'] - fee
626-
outputs[addr] = satoshi_round(change)
627-
rawtx = node.createrawtransaction(inputs, outputs)
628-
tx = tx_from_hex(rawtx)
629-
for txout in txouts:
630-
tx.vout.append(txout)
631-
newtx = tx.serialize().hex()
632-
signresult = node.signrawtransactionwithwallet(newtx, None, "NONE")
633-
txid = node.sendrawtransaction(signresult["hex"], 0)
634-
txids.append(txid)
621+
use_internal_utxos = utxos is None
622+
for _ in range(tx_batch_size):
623+
tx = mini_wallet.create_self_transfer(
624+
utxo_to_spend=None if use_internal_utxos else utxos.pop(),
625+
fee_rate=0,
626+
)['tx']
627+
tx.vout[0].nValue -= fee_sats
628+
tx.vout.extend(txouts)
629+
res = node.testmempoolaccept([tx.serialize().hex()])[0]
630+
assert_equal(res['fees']['base'], fee)
631+
txids.append(node.sendrawtransaction(tx.serialize().hex()))
635632
return txids
636633

637634

638635
def mine_large_block(test_framework, mini_wallet, node):
639636
# generate a 66k transaction,
640637
# and 14 of them is close to the 1MB block limit
641638
txouts = gen_return_txouts()
642-
from .messages import COIN
643-
fee = 100 * int(node.getnetworkinfo()["relayfee"] * COIN)
644-
for _ in range(14):
645-
tx = mini_wallet.create_self_transfer(fee_rate=0)['tx']
646-
tx.vout[0].nValue -= fee
647-
tx.vout.extend(txouts)
648-
mini_wallet.sendrawtransaction(from_node=node, tx_hex=tx.serialize().hex())
639+
fee = 100 * node.getnetworkinfo()["relayfee"]
640+
create_lots_of_big_transactions(mini_wallet, node, fee, 14, txouts)
649641
test_framework.generate(node, 1)
650642

651643

0 commit comments

Comments
 (0)