v31.1-roots.1 · Commit 4: [PATCH 04/17] feat(mining): preserve Roots priority and template policies
test/functional/mining_roots_template.py
Before: /dev/null · After: test/functional/mining_roots_template.py
File metadata
new file mode 100644 index 0000000000000000000000000000000000000000..add23b266847dd6f56af8350c46d589fbe1c3822
Download original patch · Release notes
Diff rows 1–56 of 56. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. The two line-number columns refer to before and after.
test/functional/mining_roots_template.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Copyright (c) 2026 The Bitcoin Core developers
|
|
3
|
+
# Distributed under the MIT software license, see the accompanying
|
|
4
|
+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
5
|
+
"""Roots local template resource boundaries and coin-age priority selection."""
|
|
6
|
+
from decimal import Decimal
|
|
7
|
+
|
|
8
|
+
from test_framework.test_framework import BitcoinTestFramework
|
|
9
|
+
from test_framework.util import assert_equal
|
|
10
|
+
from test_framework.wallet import MiniWallet
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class RootsTemplateTest(BitcoinTestFramework):
|
|
14
|
+
def set_test_params(self):
|
|
15
|
+
self.num_nodes = 1
|
|
16
|
+
self.extra_args = [["-blockprioritysize=0", "-blockmintxfee=0.00002"]]
|
|
17
|
+
|
|
18
|
+
def run_test(self):
|
|
19
|
+
node = self.nodes[0]
|
|
20
|
+
wallet = MiniWallet(node)
|
|
21
|
+
self.generate(wallet, 101)
|
|
22
|
+
tx = wallet.send_self_transfer(from_node=node, fee_rate=Decimal("0.00001"))
|
|
23
|
+
txid = tx["txid"]
|
|
24
|
+
size = len(bytes.fromhex(tx["hex"]))
|
|
25
|
+
weight = tx["tx"].get_weight()
|
|
26
|
+
|
|
27
|
+
def check_template(args, included):
|
|
28
|
+
self.restart_node(0, extra_args=args)
|
|
29
|
+
entries = node.getblocktemplate({"rules": ["segwit"]})["transactions"]
|
|
30
|
+
assert_equal([entry["txid"] for entry in entries], [txid] if included else [])
|
|
31
|
+
if included:
|
|
32
|
+
assert_equal(entries[0]["fee"], int(tx["fee"] * 100_000_000))
|
|
33
|
+
|
|
34
|
+
# Default/disabled priority cannot bypass the explicitly higher fee floor.
|
|
35
|
+
check_template(["-blockprioritysize=0", "-blockmintxfee=0.00002"], False)
|
|
36
|
+
check_template(["-blockprioritysize=100000", "-blockmintxfee=0.00002"], True)
|
|
37
|
+
# Equality is excluded; one byte/weight unit above it includes the tx.
|
|
38
|
+
common = ["-blockprioritysize=0", "-blockmintxfee=0"]
|
|
39
|
+
for delta, included in [(0, False), (1, True)]:
|
|
40
|
+
check_template(common + [f"-blockmaxsize={1000 + size + delta}"], included)
|
|
41
|
+
check_template(common + [f"-blockmaxweight={8000 + weight + delta}"], included)
|
|
42
|
+
# Both caps apply together; an unconstraining one cannot override the other.
|
|
43
|
+
check_template(common + [f"-blockmaxsize={1000 + size}", "-blockmaxweight=4000000"], False)
|
|
44
|
+
check_template(common + ["-blockmaxsize=4000000", f"-blockmaxweight={8000 + weight}"], False)
|
|
45
|
+
# A reserve exceeding the weight limit normalizes to an empty template.
|
|
46
|
+
check_template(common + ["-blockmaxweight=8000", "-blockreservedweight=9000"], False)
|
|
47
|
+
check_template(common + ["-blockmaxsize=0", "-blockprioritysize=9223372036854775807"], False)
|
|
48
|
+
# The local size cap never changes block-connection consensus validity.
|
|
49
|
+
before = node.getblockcount()
|
|
50
|
+
block = self.generateblock(node, output=wallet.get_address(), transactions=[tx["hex"]])
|
|
51
|
+
assert_equal(node.getblockcount(), before + 1)
|
|
52
|
+
assert txid in node.getblock(block["hash"])["tx"]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == '__main__':
|
|
56
|
+
RootsTemplateTest(__file__).main()
|