Skip to content

Commit bdfe27c

Browse files
committed
Merge bitcoin/bitcoin#26933: mempool: disallow txns under min relay fee, even in packages
bf77fc9 [test] mempool full in package accept (glozow) b51ebcc [validation] set PackageValidationState when mempool full (glozow) 563a2ee [policy] disallow transactions under min relay fee, even in packages (glozow) c4554fe [test] package cpfp bumps parents <mempoolminfee but >=minrelaytxfee (glozow) ac463e8 [test util] mock mempool minimum feerate (glozow) Pull request description: Part of package relay, see #27463. Note that this still allows packages to bump transactions that are below the dynamic mempool minimum feerate, which means this still solves the "mempool is congested and my presigned 1sat/vB tx is screwed" problem for all transactions. On master, the package policy (only accessible through regtest-only RPC submitpackage) allows 0-fee (or otherwise below min relay feerate) transactions if they are bumped by a child. However, with default package limits, we don't yet have a DoS-resistant way of ensuring these transactions remain bumped throughout their time in the mempool. Primarily, the fee-bumping child may later be replaced by another transaction that doesn't bump the parent(s). The parent(s) could potentially stay bumped by other transactions, but not enough to ever be selected by the `BlockAssembler` (due to `blockmintxfee`). For example, (tested [here](https://github.com/glozow/bitcoin/commits/26933-motivation)): - The mempool accepts 24 below-minrelayfeerate transactions ("0-fee parents"), all bumped by a single high-fee transaction ("the fee-bumping child"). The fee-bumping child also spends a confirmed UTXO. - Two additional children are added to each 0-fee parent. These children each pay a feerate slightly above the minimum relay feerate (e.g. 1.9sat/vB) such that, for each 0-fee parent, the total fees of its two children divided by the total size of the children and parent is above the minimum relay feerate. - If a block template is built now, all transactions would be selected. - A transaction replaces the the fee-bumping child, spending only the confirmed UTXO and not any of the outputs from the 0-fee parents. - The 0-fee parents now each have 2 children. Their descendant feerates are above minrelayfeerate, which means that they remain in the mempool, even if the mempool evicts all below-minrelayfeerate packages. - If a block template is built now, none of the 0-fee parents or their children would be selected. - Even more low-feerate descendants can be added to these below-minrelayfeerate packages and they will not be evicted until they expire or the mempool reaches capacity. Unless we have a DoS-resistant way of ensuring package CPFP-bumped transactions are always bumped, allowing package CPFP to bump below-minrelayfeerate transactions can result in these problematic situations. See #27018 which proposes a partial solution with some limitations, and contains discussion about potential improvements to eviction strategy. While no adequate solution exists, for now, avoid these situations by requiring all transactions to meet min relay feerate. ACKs for top commit: ajtowns: reACK bf77fc9 instagibbs: re-ACK bitcoin/bitcoin@bf77fc9 Tree-SHA512: 28940f41493a9e280b010284316fb8caf1ed7b2090ba9a4ef8a3b2eafc5933601074b142f4f7d4e3c6c4cce99d3146f5c8e1393d9406c6f2070dd41c817985c9
2 parents 2cc43de + bf77fc9 commit bdfe27c

File tree

7 files changed

+194
-87
lines changed

7 files changed

+194
-87
lines changed

doc/policy/packages.md

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,24 +80,37 @@ test accepts):
8080
If any transactions in the package are already in the mempool, they are not submitted again
8181
("deduplicated") and are thus excluded from this calculation.
8282

83-
To meet the two feerate requirements of a mempool, i.e., the pre-configured minimum relay feerate
84-
(`-minrelaytxfee`) and the dynamic mempool minimum feerate, the total package feerate is used instead
85-
of the individual feerate. The individual transactions are allowed to be below the feerate
86-
requirements if the package meets the feerate requirements. For example, the parent(s) in the
87-
package can pay no fees but be paid for by the child.
88-
89-
*Rationale*: This can be thought of as "CPFP within a package," solving the issue of a parent not
90-
meeting minimum fees on its own. This would allow contracting applications to adjust their fees at
91-
broadcast time instead of overshooting or risking becoming stuck or pinned.
92-
93-
*Rationale*: It would be incorrect to use the fees of transactions that are already in the mempool, as
94-
we do not want a transaction's fees to be double-counted.
83+
To meet the dynamic mempool minimum feerate, i.e., the feerate determined by the transactions
84+
evicted when the mempool reaches capacity (not the static minimum relay feerate), the total package
85+
feerate instead of individual feerate can be used. For example, if the mempool minimum feerate is
86+
5sat/vB and a 1sat/vB parent transaction has a high-feerate child, it may be accepted if
87+
submitted as a package.
88+
89+
*Rationale*: This can be thought of as "CPFP within a package," solving the issue of a presigned
90+
transaction (i.e. in which a replacement transaction with a higher fee cannot be signed) being
91+
rejected from the mempool when transaction volume is high and the mempool minimum feerate rises.
92+
93+
Note: Package feerate cannot be used to meet the minimum relay feerate (`-minrelaytxfee`)
94+
requirement. For example, if the mempool minimum feerate is 5sat/vB and the minimum relay feerate is
95+
set to 5satvB, a 1sat/vB parent transaction with a high-feerate child will not be accepted, even if
96+
submitted as a package.
97+
98+
*Rationale*: Avoid situations in which the mempool contains non-bumped transactions below min relay
99+
feerate (which we consider to have pay 0 fees and thus receiving free relay). While package
100+
submission would ensure these transactions are bumped at the time of entry, it is not guaranteed
101+
that the transaction will always be bumped. For example, a later transaction could replace the
102+
fee-bumping child without still bumping the parent. These no-longer-bumped transactions should be
103+
removed during a replacement, but we do not have a DoS-resistant way of removing them or enforcing a
104+
limit on their quantity. Instead, prevent their entry into the mempool.
95105

96106
Implementation Note: Transactions within a package are always validated individually first, and
97107
package validation is used for the transactions that failed. Since package feerate is only
98108
calculated using transactions that are not in the mempool, this implementation detail affects the
99109
outcome of package validation.
100110

111+
*Rationale*: It would be incorrect to use the fees of transactions that are already in the mempool, as
112+
we do not want a transaction's fees to be double-counted.
113+
101114
*Rationale*: Packages are intended for incentive-compatible fee-bumping: transaction B is a
102115
"legitimate" fee-bump for transaction A only if B is a descendant of A and has a *higher* feerate
103116
than A. We want to prevent "parents pay for children" behavior; fees of parents should not help

src/test/txpackage_tests.cpp

Lines changed: 44 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
#include <boost/test/unit_test.hpp>
1717

1818
BOOST_AUTO_TEST_SUITE(txpackage_tests)
19+
// A fee amount that is above 1sat/vB but below 5sat/vB for most transactions created within these
20+
// unit tests.
21+
static const CAmount low_fee_amt{200};
1922

2023
// Create placeholder transactions that have no meaning.
2124
inline CTransactionRef create_placeholder_tx(size_t num_inputs, size_t num_outputs)
@@ -373,6 +376,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
373376
{
374377
// Mine blocks to mature coinbases.
375378
mineBlocks(5);
379+
MockMempoolMinFee(CFeeRate(5000));
376380
LOCK(cs_main);
377381

378382
// Transactions with a same-txid-different-witness transaction in the mempool should be ignored,
@@ -560,13 +564,15 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
560564
BOOST_CHECK(parent2_v2_result.m_result_type == MempoolAcceptResult::ResultType::VALID);
561565
package_mixed.push_back(ptx_parent2_v1);
562566

563-
// parent3 will be a new transaction. Put 0 fees on it to make it invalid on its own.
567+
// parent3 will be a new transaction. Put a low feerate to make it invalid on its own.
564568
auto mtx_parent3 = CreateValidMempoolTransaction(/*input_transaction=*/m_coinbase_txns[3], /*input_vout=*/0,
565569
/*input_height=*/0, /*input_signing_key=*/coinbaseKey,
566570
/*output_destination=*/acs_spk,
567-
/*output_amount=*/CAmount(50 * COIN), /*submit=*/false);
571+
/*output_amount=*/CAmount(50 * COIN - low_fee_amt), /*submit=*/false);
568572
CTransactionRef ptx_parent3 = MakeTransactionRef(mtx_parent3);
569573
package_mixed.push_back(ptx_parent3);
574+
BOOST_CHECK(m_node.mempool->GetMinFee().GetFee(GetVirtualTransactionSize(*ptx_parent3)) > low_fee_amt);
575+
BOOST_CHECK(m_node.mempool->m_min_relay_feerate.GetFee(GetVirtualTransactionSize(*ptx_parent3)) <= low_fee_amt);
570576

571577
// child spends parent1, parent2, and parent3
572578
CKey mixed_grandchild_key;
@@ -627,6 +633,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
627633
BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
628634
{
629635
mineBlocks(5);
636+
MockMempoolMinFee(CFeeRate(5000));
630637
LOCK(::cs_main);
631638
size_t expected_pool_size = m_node.mempool->size();
632639
CKey child_key;
@@ -636,9 +643,9 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
636643
grandchild_key.MakeNewKey(true);
637644
CScript child_spk = GetScriptForDestination(WitnessV0KeyHash(grandchild_key.GetPubKey()));
638645

639-
// zero-fee parent and high-fee child package
646+
// low-fee parent and high-fee child package
640647
const CAmount coinbase_value{50 * COIN};
641-
const CAmount parent_value{coinbase_value - 0};
648+
const CAmount parent_value{coinbase_value - low_fee_amt};
642649
const CAmount child_value{parent_value - COIN};
643650

644651
Package package_cpfp;
@@ -657,26 +664,29 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
657664
package_cpfp.push_back(tx_child);
658665

659666
// Package feerate is calculated using modified fees, and prioritisetransaction accepts negative
660-
// fee deltas. This should be taken into account. De-prioritise the parent transaction by -1BTC,
661-
// bringing the package feerate to 0.
662-
m_node.mempool->PrioritiseTransaction(tx_parent->GetHash(), -1 * COIN);
667+
// fee deltas. This should be taken into account. De-prioritise the parent transaction
668+
// to bring the package feerate to 0.
669+
m_node.mempool->PrioritiseTransaction(tx_parent->GetHash(), child_value - coinbase_value);
663670
{
664671
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
665672
const auto submit_cpfp_deprio = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
666673
package_cpfp, /*test_accept=*/ false);
667-
BOOST_CHECK_EQUAL(submit_cpfp_deprio.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
668-
BOOST_CHECK_MESSAGE(submit_cpfp_deprio.m_state.IsInvalid(),
669-
"Package validation unexpectedly succeeded: " << submit_cpfp_deprio.m_state.GetRejectReason());
670-
BOOST_CHECK(submit_cpfp_deprio.m_tx_results.empty());
674+
BOOST_CHECK_EQUAL(submit_cpfp_deprio.m_state.GetResult(), PackageValidationResult::PCKG_TX);
675+
BOOST_CHECK(submit_cpfp_deprio.m_state.IsInvalid());
676+
BOOST_CHECK_EQUAL(submit_cpfp_deprio.m_tx_results.find(tx_parent->GetWitnessHash())->second.m_state.GetResult(),
677+
TxValidationResult::TX_MEMPOOL_POLICY);
678+
BOOST_CHECK_EQUAL(submit_cpfp_deprio.m_tx_results.find(tx_child->GetWitnessHash())->second.m_state.GetResult(),
679+
TxValidationResult::TX_MISSING_INPUTS);
680+
BOOST_CHECK(submit_cpfp_deprio.m_tx_results.find(tx_parent->GetWitnessHash())->second.m_state.GetRejectReason() == "min relay fee not met");
671681
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
672682
const CFeeRate expected_feerate(0, GetVirtualTransactionSize(*tx_parent) + GetVirtualTransactionSize(*tx_child));
673683
}
674684

675685
// Clear the prioritisation of the parent transaction.
676686
WITH_LOCK(m_node.mempool->cs, m_node.mempool->ClearPrioritisation(tx_parent->GetHash()));
677687

678-
// Package CPFP: Even though the parent pays 0 absolute fees, the child pays 1 BTC which is
679-
// enough for the package feerate to meet the threshold.
688+
// Package CPFP: Even though the parent's feerate is below the mempool minimum feerate, the
689+
// child pays enough for the package feerate to meet the threshold.
680690
{
681691
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
682692
const auto submit_cpfp = ProcessNewPackage(m_node.chainman->ActiveChainstate(), *m_node.mempool,
@@ -689,7 +699,7 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
689699
auto it_child = submit_cpfp.m_tx_results.find(tx_child->GetWitnessHash());
690700
BOOST_CHECK(it_parent != submit_cpfp.m_tx_results.end());
691701
BOOST_CHECK(it_parent->second.m_result_type == MempoolAcceptResult::ResultType::VALID);
692-
BOOST_CHECK(it_parent->second.m_base_fees.value() == 0);
702+
BOOST_CHECK(it_parent->second.m_base_fees.value() == coinbase_value - parent_value);
693703
BOOST_CHECK(it_child != submit_cpfp.m_tx_results.end());
694704
BOOST_CHECK(it_child->second.m_result_type == MempoolAcceptResult::ResultType::VALID);
695705
BOOST_CHECK(it_child->second.m_base_fees.value() == COIN);
@@ -709,22 +719,28 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
709719
}
710720

711721
// Just because we allow low-fee parents doesn't mean we allow low-feerate packages.
712-
// This package just pays 200 satoshis total. This would be enough to pay for the child alone,
713-
// but isn't enough for the entire package to meet the 1sat/vbyte minimum.
722+
// The mempool minimum feerate is 5sat/vB, but this package just pays 800 satoshis total.
723+
// The child fees would be able to pay for itself, but isn't enough for the entire package.
714724
Package package_still_too_low;
725+
const CAmount parent_fee{200};
726+
const CAmount child_fee{600};
715727
auto mtx_parent_cheap = CreateValidMempoolTransaction(/*input_transaction=*/m_coinbase_txns[1], /*input_vout=*/0,
716728
/*input_height=*/0, /*input_signing_key=*/coinbaseKey,
717729
/*output_destination=*/parent_spk,
718-
/*output_amount=*/coinbase_value, /*submit=*/false);
730+
/*output_amount=*/coinbase_value - parent_fee, /*submit=*/false);
719731
CTransactionRef tx_parent_cheap = MakeTransactionRef(mtx_parent_cheap);
720732
package_still_too_low.push_back(tx_parent_cheap);
733+
BOOST_CHECK(m_node.mempool->GetMinFee().GetFee(GetVirtualTransactionSize(*tx_parent_cheap)) > parent_fee);
734+
BOOST_CHECK(m_node.mempool->m_min_relay_feerate.GetFee(GetVirtualTransactionSize(*tx_parent_cheap)) <= parent_fee);
721735

722736
auto mtx_child_cheap = CreateValidMempoolTransaction(/*input_transaction=*/tx_parent_cheap, /*input_vout=*/0,
723737
/*input_height=*/101, /*input_signing_key=*/child_key,
724738
/*output_destination=*/child_spk,
725-
/*output_amount=*/coinbase_value - 200, /*submit=*/false);
739+
/*output_amount=*/coinbase_value - parent_fee - child_fee, /*submit=*/false);
726740
CTransactionRef tx_child_cheap = MakeTransactionRef(mtx_child_cheap);
727741
package_still_too_low.push_back(tx_child_cheap);
742+
BOOST_CHECK(m_node.mempool->GetMinFee().GetFee(GetVirtualTransactionSize(*tx_child_cheap)) <= child_fee);
743+
BOOST_CHECK(m_node.mempool->GetMinFee().GetFee(GetVirtualTransactionSize(*tx_parent_cheap) + GetVirtualTransactionSize(*tx_child_cheap)) > parent_fee + child_fee);
728744

729745
// Cheap package should fail with package-fee-too-low.
730746
{
@@ -735,11 +751,6 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
735751
BOOST_CHECK_EQUAL(submit_package_too_low.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
736752
BOOST_CHECK_EQUAL(submit_package_too_low.m_state.GetRejectReason(), "package-fee-too-low");
737753
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
738-
const CFeeRate child_feerate(200, GetVirtualTransactionSize(*tx_child_cheap));
739-
BOOST_CHECK(child_feerate.GetFeePerK() > 1000);
740-
const CFeeRate expected_feerate(200,
741-
GetVirtualTransactionSize(*tx_parent_cheap) + GetVirtualTransactionSize(*tx_child_cheap));
742-
BOOST_CHECK(expected_feerate.GetFeePerK() < 1000);
743754
}
744755

745756
// Package feerate includes the modified fees of the transactions.
@@ -752,18 +763,18 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
752763
expected_pool_size += 2;
753764
BOOST_CHECK_MESSAGE(submit_prioritised_package.m_state.IsValid(),
754765
"Package validation unexpectedly failed" << submit_prioritised_package.m_state.GetRejectReason());
755-
const CFeeRate expected_feerate(1 * COIN + 200,
766+
const CFeeRate expected_feerate(1 * COIN + parent_fee + child_fee,
756767
GetVirtualTransactionSize(*tx_parent_cheap) + GetVirtualTransactionSize(*tx_child_cheap));
757768
BOOST_CHECK_EQUAL(submit_prioritised_package.m_tx_results.size(), package_still_too_low.size());
758769
auto it_parent = submit_prioritised_package.m_tx_results.find(tx_parent_cheap->GetWitnessHash());
759770
auto it_child = submit_prioritised_package.m_tx_results.find(tx_child_cheap->GetWitnessHash());
760771
BOOST_CHECK(it_parent != submit_prioritised_package.m_tx_results.end());
761772
BOOST_CHECK(it_parent->second.m_result_type == MempoolAcceptResult::ResultType::VALID);
762-
BOOST_CHECK(it_parent->second.m_base_fees.value() == 0);
773+
BOOST_CHECK(it_parent->second.m_base_fees.value() == parent_fee);
763774
BOOST_CHECK(it_parent->second.m_effective_feerate.value() == expected_feerate);
764775
BOOST_CHECK(it_child != submit_prioritised_package.m_tx_results.end());
765776
BOOST_CHECK(it_child->second.m_result_type == MempoolAcceptResult::ResultType::VALID);
766-
BOOST_CHECK(it_child->second.m_base_fees.value() == 200);
777+
BOOST_CHECK(it_child->second.m_base_fees.value() == child_fee);
767778
BOOST_CHECK(it_child->second.m_effective_feerate.value() == expected_feerate);
768779
std::vector<uint256> expected_wtxids({tx_parent_cheap->GetWitnessHash(), tx_child_cheap->GetWitnessHash()});
769780
BOOST_CHECK(it_parent->second.m_wtxids_fee_calculations.value() == expected_wtxids);
@@ -800,8 +811,8 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
800811
BOOST_CHECK_MESSAGE(submit_rich_parent.m_state.IsInvalid(), "Package validation unexpectedly succeeded");
801812

802813
// The child would have been validated on its own and failed, then submitted as a "package" of 1.
803-
BOOST_CHECK_EQUAL(submit_rich_parent.m_state.GetResult(), PackageValidationResult::PCKG_POLICY);
804-
BOOST_CHECK_EQUAL(submit_rich_parent.m_state.GetRejectReason(), "package-fee-too-low");
814+
BOOST_CHECK_EQUAL(submit_rich_parent.m_state.GetResult(), PackageValidationResult::PCKG_TX);
815+
BOOST_CHECK_EQUAL(submit_rich_parent.m_state.GetRejectReason(), "transaction failed");
805816

806817
auto it_parent = submit_rich_parent.m_tx_results.find(tx_parent_rich->GetWitnessHash());
807818
BOOST_CHECK(it_parent != submit_rich_parent.m_tx_results.end());
@@ -810,6 +821,11 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
810821
BOOST_CHECK_MESSAGE(it_parent->second.m_base_fees.value() == high_parent_fee,
811822
strprintf("rich parent: expected fee %s, got %s", high_parent_fee, it_parent->second.m_base_fees.value()));
812823
BOOST_CHECK(it_parent->second.m_effective_feerate == CFeeRate(high_parent_fee, GetVirtualTransactionSize(*tx_parent_rich)));
824+
auto it_child = submit_rich_parent.m_tx_results.find(tx_child_poor->GetWitnessHash());
825+
BOOST_CHECK(it_child != submit_rich_parent.m_tx_results.end());
826+
BOOST_CHECK_EQUAL(it_child->second.m_result_type, MempoolAcceptResult::ResultType::INVALID);
827+
BOOST_CHECK_EQUAL(it_child->second.m_state.GetResult(), TxValidationResult::TX_MEMPOOL_POLICY);
828+
BOOST_CHECK(it_child->second.m_state.GetRejectReason() == "min relay fee not met");
813829

814830
BOOST_CHECK_EQUAL(m_node.mempool->size(), expected_pool_size);
815831
BOOST_CHECK(m_node.mempool->exists(GenTxid::Txid(tx_parent_rich->GetHash())));

src/test/util/setup_common.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,33 @@ std::vector<CTransactionRef> TestChain100Setup::PopulateMempool(FastRandomContex
433433
return mempool_transactions;
434434
}
435435

436+
void TestChain100Setup::MockMempoolMinFee(const CFeeRate& target_feerate)
437+
{
438+
LOCK2(cs_main, m_node.mempool->cs);
439+
// Transactions in the mempool will affect the new minimum feerate.
440+
assert(m_node.mempool->size() == 0);
441+
// The target feerate cannot be too low...
442+
// ...otherwise the transaction's feerate will need to be negative.
443+
assert(target_feerate > m_node.mempool->m_incremental_relay_feerate);
444+
// ...otherwise this is not meaningful. The feerate policy uses the maximum of both feerates.
445+
assert(target_feerate > m_node.mempool->m_min_relay_feerate);
446+
447+
// Manually create an invalid transaction. Manually set the fee in the CTxMemPoolEntry to
448+
// achieve the exact target feerate.
449+
CMutableTransaction mtx = CMutableTransaction();
450+
mtx.vin.push_back(CTxIn{COutPoint{g_insecure_rand_ctx.rand256(), 0}});
451+
mtx.vout.push_back(CTxOut(1 * COIN, GetScriptForDestination(WitnessV0ScriptHash(CScript() << OP_TRUE))));
452+
const auto tx{MakeTransactionRef(mtx)};
453+
LockPoints lp;
454+
// The new mempool min feerate is equal to the removed package's feerate + incremental feerate.
455+
const auto tx_fee = target_feerate.GetFee(GetVirtualTransactionSize(*tx)) -
456+
m_node.mempool->m_incremental_relay_feerate.GetFee(GetVirtualTransactionSize(*tx));
457+
m_node.mempool->addUnchecked(CTxMemPoolEntry(tx, /*fee=*/tx_fee,
458+
/*time=*/0, /*entry_height=*/1,
459+
/*spends_coinbase=*/true, /*sigops_cost=*/1, lp));
460+
m_node.mempool->TrimToSize(0);
461+
assert(m_node.mempool->GetMinFee() == target_feerate);
462+
}
436463
/**
437464
* @returns a real block (0000000000013b8ab2cd513b0261a14096412195a72a0c4827d229dcc7e0f7af)
438465
* with 9 txs.

0 commit comments

Comments
 (0)