test: switch MiniWallet padding unit from weight to vsize
The weight unit is merely a consensus rule detail and is largely irrelevant for fee-rate calculations and mempool policy rules (e.g. for package relay and TRUC limits), so there doesn't seem to be any value of using a granularity that we can't even guarantee to reach exactly anyway. Switch to the more natural unit of vsize instead, which simplifies both the padding implementation and the current tests that take use of this padding. The rather annoying multiplications by `WITNESS_SCALE_FACTOR` can then be removed and weird-looking magic numbers like `4004` can be replaced by numbers that are more connected to actual policy limit constants from the codebase, e.g. `1001` for exceeding `TRUC_CHILD_MAX_VSIZE` by one.
This commit is contained in:
1 parent
d812cf1189
commit
c16ae71768
6 files changed
+61
-72
No files matched your search
@@ -55,12 +55,12 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
self.generate(node, 1)
|
||||
|
||||
# tx_A needs to be RBF'd, set minfee at set size
|
||||
A_weight = 1000
|
||||
A_vsize = 250
|
||||
mempoolmin_feerate = node.getmempoolinfo()["mempoolminfee"]
|
||||
tx_A = self.wallet.send_self_transfer(
|
||||
from_node=node,
|
||||
fee_rate=mempoolmin_feerate,
|
||||
target_weight=A_weight,
|
||||
target_vsize=A_vsize,
|
||||
utxo_to_spend=rbf_utxo,
|
||||
confirmed_only=True
|
||||
)
|
||||
@@ -68,15 +68,15 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
# RBF's tx_A, is not yet submitted
|
||||
tx_B = self.wallet.create_self_transfer(
|
||||
fee=tx_A["fee"] * 4,
|
||||
target_weight=A_weight,
|
||||
target_vsize=A_vsize,
|
||||
utxo_to_spend=rbf_utxo,
|
||||
confirmed_only=True
|
||||
)
|
||||
|
||||
# Spends tx_B's output, too big for cpfp carveout (because that would also increase the descendant limit by 1)
|
||||
non_cpfp_carveout_weight = 40001 # EXTRA_DESCENDANT_TX_SIZE_LIMIT + 1
|
||||
non_cpfp_carveout_vsize = 10001 # EXTRA_DESCENDANT_TX_SIZE_LIMIT + 1
|
||||
tx_C = self.wallet.create_self_transfer(
|
||||
target_weight=non_cpfp_carveout_weight,
|
||||
target_vsize=non_cpfp_carveout_vsize,
|
||||
fee_rate=mempoolmin_feerate,
|
||||
utxo_to_spend=tx_B["new_utxo"],
|
||||
confirmed_only=True
|
||||
@@ -103,14 +103,14 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
# UTXOs to be spent by the ultimate child transaction
|
||||
parent_utxos = []
|
||||
|
||||
evicted_weight = 8000
|
||||
evicted_vsize = 2000
|
||||
# Mempool transaction which is evicted due to being at the "bottom" of the mempool when the
|
||||
# mempool overflows and evicts by descendant score. It's important that the eviction doesn't
|
||||
# happen in the middle of package evaluation, as it can invalidate the coins cache.
|
||||
mempool_evicted_tx = self.wallet.send_self_transfer(
|
||||
from_node=node,
|
||||
fee_rate=mempoolmin_feerate,
|
||||
target_weight=evicted_weight,
|
||||
target_vsize=evicted_vsize,
|
||||
confirmed_only=True
|
||||
)
|
||||
# Already in mempool when package is submitted.
|
||||
@@ -132,14 +132,16 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
|
||||
# Series of parents that don't need CPFP and are submitted individually. Each one is large and
|
||||
# high feerate, which means they should trigger eviction but not be evicted.
|
||||
parent_weight = 100000
|
||||
parent_vsize = 25000
|
||||
num_big_parents = 3
|
||||
assert_greater_than(parent_weight * num_big_parents, current_info["maxmempool"] - current_info["bytes"])
|
||||
# Need to be large enough to trigger eviction
|
||||
# (note that the mempool usage of a tx is about three times its vsize)
|
||||
assert_greater_than(parent_vsize * num_big_parents * 3, current_info["maxmempool"] - current_info["bytes"])
|
||||
parent_feerate = 100 * mempoolmin_feerate
|
||||
|
||||
big_parent_txids = []
|
||||
for i in range(num_big_parents):
|
||||
parent = self.wallet.create_self_transfer(fee_rate=parent_feerate, target_weight=parent_weight, confirmed_only=True)
|
||||
parent = self.wallet.create_self_transfer(fee_rate=parent_feerate, target_vsize=parent_vsize, confirmed_only=True)
|
||||
parent_utxos.append(parent["new_utxo"])
|
||||
package_hex.append(parent["hex"])
|
||||
big_parent_txids.append(parent["txid"])
|
||||
@@ -311,8 +313,9 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
entry = node.getmempoolentry(txid)
|
||||
worst_feerate_btcvb = min(worst_feerate_btcvb, entry["fees"]["descendant"] / entry["descendantsize"])
|
||||
# Needs to be large enough to trigger eviction
|
||||
target_weight_each = 200000
|
||||
assert_greater_than(target_weight_each * 2, node.getmempoolinfo()["maxmempool"] - node.getmempoolinfo()["bytes"])
|
||||
# (note that the mempool usage of a tx is about three times its vsize)
|
||||
target_vsize_each = 50000
|
||||
assert_greater_than(target_vsize_each * 2 * 3, node.getmempoolinfo()["maxmempool"] - node.getmempoolinfo()["bytes"])
|
||||
# Should be a true CPFP: parent's feerate is just below mempool min feerate
|
||||
parent_feerate = mempoolmin_feerate - Decimal("0.000001") # 0.1 sats/vbyte below min feerate
|
||||
# Parent + child is above mempool minimum feerate
|
||||
@@ -320,8 +323,8 @@ class MempoolLimitTest(BitcoinTestFramework):
|
||||
# However, when eviction is triggered, these transactions should be at the bottom.
|
||||
# This assertion assumes parent and child are the same size.
|
||||
miniwallet.rescan_utxos()
|
||||
tx_parent_just_below = miniwallet.create_self_transfer(fee_rate=parent_feerate, target_weight=target_weight_each)
|
||||
tx_child_just_above = miniwallet.create_self_transfer(utxo_to_spend=tx_parent_just_below["new_utxo"], fee_rate=child_feerate, target_weight=target_weight_each)
|
||||
tx_parent_just_below = miniwallet.create_self_transfer(fee_rate=parent_feerate, target_vsize=target_vsize_each)
|
||||
tx_child_just_above = miniwallet.create_self_transfer(utxo_to_spend=tx_parent_just_below["new_utxo"], fee_rate=child_feerate, target_vsize=target_vsize_each)
|
||||
# This package ranks below the lowest descendant package in the mempool
|
||||
package_fee = tx_parent_just_below["fee"] + tx_child_just_above["fee"]
|
||||
package_vsize = tx_parent_just_below["tx"].get_vsize() + tx_child_just_above["tx"].get_vsize()
|
||||
|
||||
Reference in new issue
Block a user