6
6
7
7
from test_framework .messages import (
8
8
MAX_BIP125_RBF_SEQUENCE ,
9
- WITNESS_SCALE_FACTOR ,
10
9
)
11
10
from test_framework .test_framework import BitcoinTestFramework
12
11
from test_framework .util import (
23
22
24
23
MAX_REPLACEMENT_CANDIDATES = 100
25
24
TRUC_MAX_VSIZE = 10000
25
+ TRUC_CHILD_MAX_VSIZE = 1000
26
26
27
27
def cleanup (extra_args = None ):
28
28
def decorator (func ):
@@ -55,14 +55,14 @@ def check_mempool(self, txids):
55
55
def test_truc_max_vsize (self ):
56
56
node = self .nodes [0 ]
57
57
self .log .info ("Test TRUC-specific maximum transaction vsize" )
58
- tx_v3_heavy = self .wallet .create_self_transfer (target_weight = ( TRUC_MAX_VSIZE + 1 ) * WITNESS_SCALE_FACTOR , version = 3 )
58
+ tx_v3_heavy = self .wallet .create_self_transfer (target_vsize = TRUC_MAX_VSIZE + 1 , version = 3 )
59
59
assert_greater_than_or_equal (tx_v3_heavy ["tx" ].get_vsize (), TRUC_MAX_VSIZE )
60
60
expected_error_heavy = f"TRUC-violation, version=3 tx { tx_v3_heavy ['txid' ]} (wtxid={ tx_v3_heavy ['wtxid' ]} ) is too big"
61
61
assert_raises_rpc_error (- 26 , expected_error_heavy , node .sendrawtransaction , tx_v3_heavy ["hex" ])
62
62
self .check_mempool ([])
63
63
64
64
# Ensure we are hitting the TRUC-specific limit and not something else
65
- tx_v2_heavy = self .wallet .send_self_transfer (from_node = node , target_weight = ( TRUC_MAX_VSIZE + 1 ) * WITNESS_SCALE_FACTOR , version = 2 )
65
+ tx_v2_heavy = self .wallet .send_self_transfer (from_node = node , target_vsize = TRUC_MAX_VSIZE + 1 , version = 2 )
66
66
self .check_mempool ([tx_v2_heavy ["txid" ]])
67
67
68
68
@cleanup (extra_args = ["-datacarriersize=1000" ])
@@ -73,10 +73,10 @@ def test_truc_acceptance(self):
73
73
self .check_mempool ([tx_v3_parent_normal ["txid" ]])
74
74
tx_v3_child_heavy = self .wallet .create_self_transfer (
75
75
utxo_to_spend = tx_v3_parent_normal ["new_utxo" ],
76
- target_weight = 4004 ,
76
+ target_vsize = TRUC_CHILD_MAX_VSIZE + 1 ,
77
77
version = 3
78
78
)
79
- assert_greater_than_or_equal (tx_v3_child_heavy ["tx" ].get_vsize (), 1000 )
79
+ assert_greater_than_or_equal (tx_v3_child_heavy ["tx" ].get_vsize (), TRUC_CHILD_MAX_VSIZE )
80
80
expected_error_child_heavy = f"TRUC-violation, version=3 child tx { tx_v3_child_heavy ['txid' ]} (wtxid={ tx_v3_child_heavy ['wtxid' ]} ) is too big"
81
81
assert_raises_rpc_error (- 26 , expected_error_child_heavy , node .sendrawtransaction , tx_v3_child_heavy ["hex" ])
82
82
self .check_mempool ([tx_v3_parent_normal ["txid" ]])
@@ -88,20 +88,21 @@ def test_truc_acceptance(self):
88
88
from_node = node ,
89
89
fee_rate = DEFAULT_FEE ,
90
90
utxo_to_spend = tx_v3_parent_normal ["new_utxo" ],
91
- target_weight = 3987 ,
91
+ target_vsize = TRUC_CHILD_MAX_VSIZE - 3 ,
92
92
version = 3
93
93
)
94
- assert_greater_than_or_equal (1000 , tx_v3_child_almost_heavy ["tx" ].get_vsize ())
94
+ assert_greater_than_or_equal (TRUC_CHILD_MAX_VSIZE , tx_v3_child_almost_heavy ["tx" ].get_vsize ())
95
95
self .check_mempool ([tx_v3_parent_normal ["txid" ], tx_v3_child_almost_heavy ["txid" ]])
96
96
assert_equal (node .getmempoolentry (tx_v3_parent_normal ["txid" ])["descendantcount" ], 2 )
97
97
tx_v3_child_almost_heavy_rbf = self .wallet .send_self_transfer (
98
98
from_node = node ,
99
99
fee_rate = DEFAULT_FEE * 2 ,
100
100
utxo_to_spend = tx_v3_parent_normal ["new_utxo" ],
101
- target_weight = 3500 ,
101
+ target_vsize = 875 ,
102
102
version = 3
103
103
)
104
- assert_greater_than_or_equal (tx_v3_child_almost_heavy ["tx" ].get_vsize () + tx_v3_child_almost_heavy_rbf ["tx" ].get_vsize (), 1000 )
104
+ assert_greater_than_or_equal (tx_v3_child_almost_heavy ["tx" ].get_vsize () + tx_v3_child_almost_heavy_rbf ["tx" ].get_vsize (),
105
+ TRUC_CHILD_MAX_VSIZE )
105
106
self .check_mempool ([tx_v3_parent_normal ["txid" ], tx_v3_child_almost_heavy_rbf ["txid" ]])
106
107
assert_equal (node .getmempoolentry (tx_v3_parent_normal ["txid" ])["descendantcount" ], 2 )
107
108
@@ -199,8 +200,8 @@ def test_truc_reorg(self):
199
200
self .check_mempool ([])
200
201
tx_v2_from_v3 = self .wallet .send_self_transfer (from_node = node , utxo_to_spend = tx_v3_block ["new_utxo" ], version = 2 )
201
202
tx_v3_from_v2 = self .wallet .send_self_transfer (from_node = node , utxo_to_spend = tx_v2_block ["new_utxo" ], version = 3 )
202
- tx_v3_child_large = self .wallet .send_self_transfer (from_node = node , utxo_to_spend = tx_v3_block2 ["new_utxo" ], target_weight = 5000 , version = 3 )
203
- assert_greater_than (node .getmempoolentry (tx_v3_child_large ["txid" ])["vsize" ], 1000 )
203
+ tx_v3_child_large = self .wallet .send_self_transfer (from_node = node , utxo_to_spend = tx_v3_block2 ["new_utxo" ], target_vsize = 1250 , version = 3 )
204
+ assert_greater_than (node .getmempoolentry (tx_v3_child_large ["txid" ])["vsize" ], TRUC_CHILD_MAX_VSIZE )
204
205
self .check_mempool ([tx_v2_from_v3 ["txid" ], tx_v3_from_v2 ["txid" ], tx_v3_child_large ["txid" ]])
205
206
node .invalidateblock (block [0 ])
206
207
self .check_mempool ([tx_v3_block ["txid" ], tx_v2_block ["txid" ], tx_v3_block2 ["txid" ], tx_v2_from_v3 ["txid" ], tx_v3_from_v2 ["txid" ], tx_v3_child_large ["txid" ]])
@@ -217,22 +218,22 @@ def test_nondefault_package_limits(self):
217
218
"""
218
219
node = self .nodes [0 ]
219
220
self .log .info ("Test that a decreased limitdescendantsize also applies to TRUC child" )
220
- parent_target_weight = 9990 * WITNESS_SCALE_FACTOR
221
- child_target_weight = 500 * WITNESS_SCALE_FACTOR
221
+ parent_target_vsize = 9990
222
+ child_target_vsize = 500
222
223
tx_v3_parent_large1 = self .wallet .send_self_transfer (
223
224
from_node = node ,
224
- target_weight = parent_target_weight ,
225
+ target_vsize = parent_target_vsize ,
225
226
version = 3
226
227
)
227
228
tx_v3_child_large1 = self .wallet .create_self_transfer (
228
229
utxo_to_spend = tx_v3_parent_large1 ["new_utxo" ],
229
- target_weight = child_target_weight ,
230
+ target_vsize = child_target_vsize ,
230
231
version = 3
231
232
)
232
233
233
234
# Parent and child are within v3 limits, but parent's 10kvB descendant limit is exceeded
234
235
assert_greater_than_or_equal (TRUC_MAX_VSIZE , tx_v3_parent_large1 ["tx" ].get_vsize ())
235
- assert_greater_than_or_equal (1000 , tx_v3_child_large1 ["tx" ].get_vsize ())
236
+ assert_greater_than_or_equal (TRUC_CHILD_MAX_VSIZE , tx_v3_child_large1 ["tx" ].get_vsize ())
236
237
assert_greater_than (tx_v3_parent_large1 ["tx" ].get_vsize () + tx_v3_child_large1 ["tx" ].get_vsize (), 10000 )
237
238
238
239
assert_raises_rpc_error (- 26 , f"too-long-mempool-chain, exceeds descendant size limit for tx { tx_v3_parent_large1 ['txid' ]} " , node .sendrawtransaction , tx_v3_child_large1 ["hex" ])
@@ -244,18 +245,18 @@ def test_nondefault_package_limits(self):
244
245
self .restart_node (0 , extra_args = ["-limitancestorsize=10" , "-datacarriersize=40000" ])
245
246
tx_v3_parent_large2 = self .wallet .send_self_transfer (
246
247
from_node = node ,
247
- target_weight = parent_target_weight ,
248
+ target_vsize = parent_target_vsize ,
248
249
version = 3
249
250
)
250
251
tx_v3_child_large2 = self .wallet .create_self_transfer (
251
252
utxo_to_spend = tx_v3_parent_large2 ["new_utxo" ],
252
- target_weight = child_target_weight ,
253
+ target_vsize = child_target_vsize ,
253
254
version = 3
254
255
)
255
256
256
257
# Parent and child are within TRUC limits
257
258
assert_greater_than_or_equal (TRUC_MAX_VSIZE , tx_v3_parent_large2 ["tx" ].get_vsize ())
258
- assert_greater_than_or_equal (1000 , tx_v3_child_large2 ["tx" ].get_vsize ())
259
+ assert_greater_than_or_equal (TRUC_CHILD_MAX_VSIZE , tx_v3_child_large2 ["tx" ].get_vsize ())
259
260
assert_greater_than (tx_v3_parent_large2 ["tx" ].get_vsize () + tx_v3_child_large2 ["tx" ].get_vsize (), 10000 )
260
261
261
262
assert_raises_rpc_error (- 26 , f"too-long-mempool-chain, exceeds ancestor size limit" , node .sendrawtransaction , tx_v3_child_large2 ["hex" ])
@@ -267,12 +268,12 @@ def test_truc_ancestors_package(self):
267
268
node = self .nodes [0 ]
268
269
tx_v3_parent_normal = self .wallet .create_self_transfer (
269
270
fee_rate = 0 ,
270
- target_weight = 4004 ,
271
+ target_vsize = 1001 ,
271
272
version = 3
272
273
)
273
274
tx_v3_parent_2_normal = self .wallet .create_self_transfer (
274
275
fee_rate = 0 ,
275
- target_weight = 4004 ,
276
+ target_vsize = 1001 ,
276
277
version = 3
277
278
)
278
279
tx_v3_child_multiparent = self .wallet .create_self_transfer_multi (
@@ -282,7 +283,7 @@ def test_truc_ancestors_package(self):
282
283
)
283
284
tx_v3_child_heavy = self .wallet .create_self_transfer_multi (
284
285
utxos_to_spend = [tx_v3_parent_normal ["new_utxo" ]],
285
- target_weight = 4004 ,
286
+ target_vsize = TRUC_CHILD_MAX_VSIZE + 1 ,
286
287
fee_per_output = 10000 ,
287
288
version = 3
288
289
)
@@ -294,7 +295,7 @@ def test_truc_ancestors_package(self):
294
295
295
296
self .check_mempool ([])
296
297
result = node .submitpackage ([tx_v3_parent_normal ["hex" ], tx_v3_child_heavy ["hex" ]])
297
- # tx_v3_child_heavy is heavy based on weight , not sigops.
298
+ # tx_v3_child_heavy is heavy based on vsize , not sigops.
298
299
assert_equal (result ['package_msg' ], f"TRUC-violation, version=3 child tx { tx_v3_child_heavy ['txid' ]} (wtxid={ tx_v3_child_heavy ['wtxid' ]} ) is too big: { tx_v3_child_heavy ['tx' ].get_vsize ()} > 1000 virtual bytes" )
299
300
self .check_mempool ([])
300
301
@@ -416,7 +417,7 @@ def test_truc_package_inheritance(self):
416
417
node = self .nodes [0 ]
417
418
tx_v3_parent = self .wallet .create_self_transfer (
418
419
fee_rate = 0 ,
419
- target_weight = 4004 ,
420
+ target_vsize = 1001 ,
420
421
version = 3
421
422
)
422
423
tx_v2_child = self .wallet .create_self_transfer_multi (
0 commit comments