Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
cd0bea2
Allow moving CTxMemPoolEntry objects, disallow copying
sdaftuar Jan 9, 2025
c5706ea
Make CTxMemPoolEntry derive from TxGraph::Ref
sdaftuar Jan 9, 2025
91d9bfc
Create a txgraph inside CTxMemPool
sdaftuar Jan 9, 2025
83c8753
Use named constant for acceptable iters
sdaftuar Sep 13, 2025
f2eff17
Add sigops adjusted weight calculator
sdaftuar Jan 30, 2025
1d3b53b
Add accessor for sigops-adjusted weight
sdaftuar Feb 4, 2025
8c59aa5
Add transactions to txgraph, but without cluster dependencies
sdaftuar Jan 9, 2025
2801e80
Add new (unused) limits for cluster size/count
sdaftuar Sep 21, 2023
429bdbe
test: update feature_rbf.py replacement test
sdaftuar Feb 9, 2025
8d6c7e4
[test] rework/delete feature_rbf tests requiring large clusters
glozow Sep 3, 2025
5a388c0
Do not allow mempool clusters to exceed configured limits
sdaftuar Sep 21, 2023
1102ac7
Check cluster limits when using -walletrejectlongchains
sdaftuar Jan 23, 2025
7a19c9b
Rework miner_tests to not require large cluster limit
sdaftuar Feb 8, 2025
5502eeb
Limit mempool size based on chunk feerate
sdaftuar Sep 21, 2023
24d0031
bench: rewrite ComplexMemPool to not create oversized clusters
sdaftuar Oct 9, 2025
ae1ac54
Select transactions for blocks based on chunk feerate
sdaftuar Sep 21, 2023
0f7739e
test: rewrite PopulateMempool to not violate mempool policy (cluster …
sdaftuar Oct 9, 2025
576d71b
policy: Remove CPFP carveout rule
sdaftuar Oct 3, 2023
2aad9f0
Implement new RBF logic for cluster mempool
sdaftuar Sep 21, 2023
8cdd7bb
==== END CLUSTER IMPLEMENTATION ====
sdaftuar Oct 17, 2023
56e20fe
==== BEGIN MEMPOOL CLEANUP ====
sdaftuar Oct 17, 2023
97b5213
Remove the ancestor and descendant indices from the mempool
sdaftuar Sep 21, 2023
97fea94
Use cluster linearization for transaction relay sort order
sdaftuar Sep 27, 2023
14a5698
Remove CTxMemPool::GetSortedDepthAndScore
sdaftuar Sep 28, 2023
80ac0dc
Reimplement GetTransactionAncestry() to not rely on cached data
sdaftuar Sep 28, 2023
87ae4fe
rpc: Calculate ancestor data from scratch for mempool rpc calls
sdaftuar Sep 28, 2023
b5701bd
Remove dependency on cached ancestor data in mini-miner
sdaftuar Sep 28, 2023
8a416fb
Stop enforcing ancestor size/count limits
sdaftuar Sep 28, 2023
ea58f64
Add test case for cluster size limits to TRUC logic
sdaftuar Apr 14, 2024
54ffcb3
Use mempool/txgraph to determine if a tx has descendants
sdaftuar Oct 3, 2023
9fe542e
Calculate descendant information for mempool RPC output on-the-fly
sdaftuar Oct 3, 2023
2055406
test: remove rbf carveout test from mempool_limit.py
sdaftuar Oct 18, 2023
e80e95e
Stop enforcing descendant size/count limits
sdaftuar Oct 3, 2023
7509c32
Eliminate RBF workaround for CPFP carveout transactions
sdaftuar Jun 12, 2024
f5246c9
wallet: Replace max descendantsize with clustersize
sdaftuar Oct 3, 2023
8455773
mempool: Remove unused function CalculateDescendantMaximum
sdaftuar Oct 4, 2023
3cf2bb1
Eliminate use of cached ancestor data in miniminer_tests and truc_policy
sdaftuar Apr 14, 2024
11079b9
mempool: eliminate accessors to mempool entry ancestor/descendant cac…
sdaftuar Oct 4, 2023
9e45438
Remove unused members from CTxMemPoolEntry
sdaftuar Oct 4, 2023
189ff7e
Remove mempool logic designed to maintain ancestor/descendant state
sdaftuar Oct 4, 2023
d4cb16f
mempool: addUnchecked no longer needs ancestors
sdaftuar Oct 5, 2023
a753975
Remove unused limits from CalculateMemPoolAncestors
sdaftuar Oct 15, 2023
d89c989
Make removeConflicts private
sdaftuar Oct 15, 2023
050ca80
==== END MEMPOOL CLEANUP ====
sdaftuar Oct 17, 2023
c6ad34c
==== BEGIN OPTIMIZATIONS ====
sdaftuar Oct 17, 2023
5502a06
Simplify ancestor calculation functions
sdaftuar Oct 15, 2023
f350915
Use txgraph to calculate ancestors
sdaftuar Apr 14, 2024
d55f4eb
Use txgraph to calculate descendants
sdaftuar Apr 14, 2024
e488cde
Rework truc_policy to use descendants, not children
sdaftuar Jan 23, 2025
d85723a
Make getting parents/children a function of the mempool, not a mempoo…
sdaftuar Apr 16, 2024
b3c6b78
Eliminate CheckPackageLimits, which no longer does anything
sdaftuar Jan 25, 2025
517c734
Fix miniminer_tests to work with cluster limits
sdaftuar Feb 8, 2025
cc6d55b
Rewrite GatherClusters to use the txgraph implementation
sdaftuar Apr 16, 2024
bdbe50e
Stop tracking parents/children outside of txgraph
sdaftuar Apr 16, 2024
4c52a21
==== END OPTIMIZATIONS ====
sdaftuar Feb 5, 2025
233b886
==== BEGIN DOCS/TESTING ====
sdaftuar Feb 5, 2025
befe5c8
Avoid violating mempool policy limits in tests
sdaftuar Feb 4, 2025
dbb6e2b
bench: add more mempool benchmarks
sdaftuar Oct 11, 2023
fb211f8
fuzz: try to add more code coverage for mempool fuzzing
sdaftuar Oct 12, 2023
7ffd7c8
Expose cluster information via rpc
sdaftuar Apr 19, 2023
ac20c79
doc: Update mempool_replacements.md to reflect feerate diagram checks
sdaftuar Apr 24, 2024
aa30f26
test: add functional test for new cluster mempool RPCs
sdaftuar Apr 27, 2024
c88360c
fuzz: remove comparison between mini_miner block construction and miner
sdaftuar Apr 28, 2024
b80c039
Invoke TxGraph::DoWork() at appropriate times
sdaftuar Jul 29, 2025
6bb3e4f
Update comments for CTxMemPool class
sdaftuar Sep 2, 2025
92872a7
Add check that GetSortedScoreWithTopology() agrees with CompareMining…
sdaftuar Sep 17, 2025
d3f8b63
Rework RBF and TRUC validation
sdaftuar Sep 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 9 additions & 19 deletions doc/policy/mempool-replacements.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,7 @@ other consensus and policy rules, each of the following conditions are met:

1. (Removed)

2. The replacement transaction only include an unconfirmed input if that input was included in
one of the directly conflicting transactions. An unconfirmed input spends an output from a
currently-unconfirmed transaction.

*Rationale*: When RBF was originally implemented, the mempool did not keep track of
ancestor feerates yet. This rule was suggested as a temporary restriction.
2. [REDACTED]

3. The replacement transaction pays an absolute fee of at least the sum paid by the original
transactions.
Expand All @@ -38,23 +33,16 @@ other consensus and policy rules, each of the following conditions are met:
*Rationale*: Try to prevent DoS attacks where an attacker causes the network to repeatedly relay
transactions each paying a tiny additional amount in fees, e.g. just 1 satoshi.

5. The number of original transactions does not exceed 100. More precisely, the sum of all
directly conflicting transactions' descendant counts (number of transactions inclusive of itself
and its descendants) must not exceed 100; it is possible that this overestimates the true number
of original transactions.
5. The number of distinct clusters corresponding to conflicting transactions does not exceed 100.

*Rationale*: Try to prevent DoS attacks where an attacker is able to easily occupy and flush out
significant portions of the node's mempool using replacements with multiple directly conflicting
transactions, each with large descendant sets.
*Rationale*: Limit CPU usage required to update the mempool for so many transactions being
removed at once.

6. The replacement transaction's feerate is greater than the feerates of all directly conflicting
transactions.
6. The feerate diagram of the mempool must be strictly improved by the replacement transaction.

*Rationale*: This rule was originally intended to ensure that the replacement transaction is
preferable for block-inclusion, compared to what would be removed from the mempool. This rule
predates ancestor feerate-based transaction selection.
*Rationale*: This ensures that block fees in all future blocks will go up
after the replacement (ignoring tail effects at the end of a block).

This set of rules is similar but distinct from BIP125.

## History

Expand All @@ -79,3 +67,5 @@ This set of rules is similar but distinct from BIP125.
* Signaling for replace-by-fee is no longer required as of [PR 30592](https://github.com/bitcoin/bitcoin/pull/30592).

* The incremental relay feerate default is 0.1sat/vB ([PR #33106](https://github.com/bitcoin/bitcoin/pull/33106)).

* Feerate diagram policy enabled in conjunction with switch to cluster mempool as of **v??.0**.
2 changes: 1 addition & 1 deletion src/bench/blockencodings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
LockPoints lp;
AddToMempool(pool, CTxMemPoolEntry(tx, fee, /*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), tx, fee, /*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
}

namespace {
Expand Down
2 changes: 1 addition & 1 deletion src/bench/mempool_ephemeral_spends.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_R
unsigned int sigOpCost{4};
uint64_t fee{0};
LockPoints lp;
AddToMempool(pool, CTxMemPoolEntry(
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(),
tx, fee, nTime, nHeight, sequence,
spendsCoinbase, sigOpCost, lp));
}
Expand Down
2 changes: 1 addition & 1 deletion src/bench/mempool_eviction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ static void AddTx(const CTransactionRef& tx, const CAmount& nFee, CTxMemPool& po
bool spendsCoinbase = false;
unsigned int sigOpCost = 4;
LockPoints lp;
AddToMempool(pool, CTxMemPoolEntry(
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(),
tx, nFee, nTime, nHeight, sequence,
spendsCoinbase, sigOpCost, lp));
}
Expand Down
162 changes: 152 additions & 10 deletions src/bench/mempool_stress.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@

class CCoinsViewCache;

static void AddTx(const CTransactionRef& tx, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
static void AddTx(const CTransactionRef& tx, CTxMemPool& pool, FastRandomContext& det_rand) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
int64_t nTime = 0;
unsigned int nHeight = 1;
uint64_t sequence = 0;
bool spendsCoinbase = false;
unsigned int sigOpCost = 4;
LockPoints lp;
AddToMempool(pool, CTxMemPoolEntry(tx, 1000, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp));
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), tx, det_rand.randrange(10000)+1000, nTime, nHeight, sequence, spendsCoinbase, sigOpCost, lp));
}

struct Available {
Expand All @@ -39,15 +39,17 @@ struct Available {
Available(CTransactionRef& ref, size_t tx_count) : ref(ref), tx_count(tx_count){}
};

static std::vector<CTransactionRef> CreateOrderedCoins(FastRandomContext& det_rand, int childTxs, int min_ancestors)
// Create a cluster of transactions, randomly.
static std::vector<CTransactionRef> CreateCoinCluster(FastRandomContext& det_rand, int childTxs, int min_ancestors)
{
std::vector<Available> available_coins;
std::vector<CTransactionRef> ordered_coins;
// Create some base transactions
size_t tx_counter = 1;
for (auto x = 0; x < 100; ++x) {
for (auto x = 0; x < 10; ++x) {
CMutableTransaction tx = CMutableTransaction();
tx.vin.resize(1);
tx.vin[0].prevout = COutPoint(Txid::FromUint256(GetRandHash()), 1);
tx.vin[0].scriptSig = CScript() << CScriptNum(tx_counter);
tx.vin[0].scriptWitness.stack.push_back(CScriptNum(x).getvch());
tx.vout.resize(det_rand.randrange(10)+2);
Expand Down Expand Up @@ -91,26 +93,106 @@ static std::vector<CTransactionRef> CreateOrderedCoins(FastRandomContext& det_ra
return ordered_coins;
}

static void MemPoolAddTransactions(benchmark::Bench& bench)
{
FastRandomContext det_rand{true};
int childTxs = 50;
if (bench.complexityN() > 1) {
childTxs = static_cast<int>(bench.complexityN());
}
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;

std::vector<CTransactionRef> transactions;
// Create 1000 clusters of 100 transactions each
for (int i=0; i<100; i++) {
auto new_txs = CreateCoinCluster(det_rand, childTxs, /*min_ancestors*/ 1);
transactions.insert(transactions.end(), new_txs.begin(), new_txs.end());
}

LOCK2(cs_main, pool.cs);

bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
for (auto& tx : transactions) {
AddTx(tx, pool, det_rand);
}
pool.TrimToSize(0, nullptr);
});
}

static void ComplexMemPool(benchmark::Bench& bench)
{
FastRandomContext det_rand{true};
int childTxs = 800;
int childTxs = 50;
if (bench.complexityN() > 1) {
childTxs = static_cast<int>(bench.complexityN());
}
std::vector<CTransactionRef> ordered_coins = CreateOrderedCoins(det_rand, childTxs, /*min_ancestors=*/1);
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;

std::vector<CTransactionRef> tx_remove_for_block;
std::vector<Txid> hashes_remove_for_block;

LOCK2(cs_main, pool.cs);

for (int i=0; i<1000; i++) {
std::vector<CTransactionRef> transactions = CreateCoinCluster(det_rand, childTxs, /*min_ancestors=*/1);

// Add all transactions to the mempool.
// Also store the first 10 transactions from each cluster as the
// transactions we'll "mine" in the the benchmark.
int tx_count = 0;
for (auto& tx : transactions) {
if (tx_count < 10) {
tx_remove_for_block.push_back(tx);
++tx_count;
hashes_remove_for_block.emplace_back(tx->GetHash());
}
AddTx(tx, pool, det_rand);
}
}

// Since the benchmark will be run repeatedly, we have to leave the mempool
// in the same state at the end of the function, so we benchmark both
// mining a block and reorging the block's contents back into the mempool.
bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
for (auto& tx : ordered_coins) {
AddTx(tx, pool);
pool.removeForBlock(tx_remove_for_block, /*nBlockHeight*/100);
for (auto& tx: tx_remove_for_block) {
AddTx(tx, pool, det_rand);
}
pool.TrimToSize(pool.DynamicMemoryUsage() * 3 / 4);
pool.TrimToSize(GetVirtualTransactionSize(*ordered_coins.front()));
pool.UpdateTransactionsFromBlock(hashes_remove_for_block);
});
}

static void MemPoolAncestorsDescendants(benchmark::Bench& bench)
{
FastRandomContext det_rand{true};
int childTxs = 50;
if (bench.complexityN() > 1) {
childTxs = static_cast<int>(bench.complexityN());
}
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;

LOCK2(cs_main, pool.cs);

std::vector<CTransactionRef> transactions = CreateCoinCluster(det_rand, childTxs, /*min_ancestors=*/1);
for (auto& tx : transactions) {
AddTx(tx, pool, det_rand);
}

CTxMemPool::txiter first_tx = *pool.GetIter(transactions[0]->GetHash());
CTxMemPool::txiter last_tx = *pool.GetIter(transactions.back()->GetHash());

bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
CTxMemPool::setEntries dummy;
ankerl::nanobench::doNotOptimizeAway(dummy);
pool.CalculateDescendants({first_tx}, dummy);
ankerl::nanobench::doNotOptimizeAway(pool.CalculateMemPoolAncestors(*last_tx));
});
}


static void MempoolCheck(benchmark::Bench& bench)
{
FastRandomContext det_rand{true};
Expand All @@ -126,5 +208,65 @@ static void MempoolCheck(benchmark::Bench& bench)
});
}

#if 0
static void MemPoolMiningScoreCheck(benchmark::Bench& bench)
{
// Default test: each cluster is of size 20, and we'll try to RBF with a
// transaction that merges 10 clusters, evicting 10 transactions from each.

FastRandomContext det_rand{true};
int childTxs = 10;
if (bench.complexityN() > 1) {
childTxs = static_cast<int>(bench.complexityN());
}
const auto testing_setup = MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN);
CTxMemPool& pool = *testing_setup.get()->m_node.mempool;

LOCK2(cs_main, pool.cs);

std::vector<CTransactionRef> parent_txs_for_rbf;
std::set<uint256> child_txs_to_conflict_with;

for (int i=0; i<10; i++) {
std::vector<CTransactionRef> transactions = CreateCoinCluster(det_rand, childTxs, /*min_ancestors=*/1);
parent_txs_for_rbf.push_back(transactions[0]);
// Conflict with everything after the first 10 transactions
for (size_t j=10; j<transactions.size(); ++j) {
child_txs_to_conflict_with.insert(transactions[j]->GetHash());
}

// Add all transactions to the mempool.
for (auto& tx : transactions) {
AddTx(tx, pool, det_rand);
}
}

// Construct a transaction that spends from each of the parent transactions
// selected.
CMutableTransaction tx = CMutableTransaction();
tx.vin.resize(10);
for (size_t i=0; i<parent_txs_for_rbf.size(); ++i) {
tx.vin[i].prevout = COutPoint(parent_txs_for_rbf[i]->GetHash(), 0);
tx.vin[i].scriptSig = CScript() << i;
}
tx.vout.resize(1);
for (auto& out : tx.vout) {
out.scriptPubKey = CScript() << CScriptNum(det_rand.randrange(19)+1) << OP_EQUAL;
out.nValue = 10 * COIN;
}

CTxMemPool::setEntries all_conflicts = pool.GetIterSet(child_txs_to_conflict_with);
CTxMemPoolEntry entry(MakeTransactionRef(tx), det_rand.randrange(10000)+1000, 0, 1, 0, false, 4, LockPoints());

bench.run([&]() NO_THREAD_SAFETY_ANALYSIS {
CTxMemPool::Limits limits(pool.m_limits);
pool.CalculateMiningScoreOfReplacementTx(entry, det_rand.randrange(30000)+1000, all_conflicts, limits);
});
}
#endif

BENCHMARK(MemPoolAncestorsDescendants, benchmark::PriorityLevel::HIGH);
BENCHMARK(MemPoolAddTransactions, benchmark::PriorityLevel::HIGH);
BENCHMARK(ComplexMemPool, benchmark::PriorityLevel::HIGH);
BENCHMARK(MempoolCheck, benchmark::PriorityLevel::HIGH);
//BENCHMARK(MemPoolMiningScoreCheck, benchmark::PriorityLevel::HIGH);
2 changes: 1 addition & 1 deletion src/bench/rpc_mempool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
static void AddTx(const CTransactionRef& tx, const CAmount& fee, CTxMemPool& pool) EXCLUSIVE_LOCKS_REQUIRED(cs_main, pool.cs)
{
LockPoints lp;
AddToMempool(pool, CTxMemPoolEntry(tx, fee, /*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
AddToMempool(pool, CTxMemPoolEntry(TxGraph::Ref(), tx, fee, /*time=*/0, /*entry_height=*/1, /*entry_sequence=*/0, /*spends_coinbase=*/false, /*sigops_cost=*/4, lp));
}

static void RpcMempool(benchmark::Bench& bench)
Expand Down
2 changes: 2 additions & 0 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,8 @@ void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc)
argsman.AddArg("-limitdescendantcount=<n>", strprintf("Do not accept transactions if any ancestor would have <n> or more in-mempool descendants (default: %u)", DEFAULT_DESCENDANT_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-limitdescendantsize=<n>", strprintf("Do not accept transactions if any ancestor would have more than <n> kilobytes of in-mempool descendants (default: %u).", DEFAULT_DESCENDANT_SIZE_LIMIT_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-test=<option>", "Pass a test-only option. Options include : " + Join(TEST_OPTIONS_DOC, ", ") + ".", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-limitclustercount=<n>", strprintf("Do not accept transactions connected to <n> or more existing in-mempool transactions (default: %u, maximum: %u)", DEFAULT_CLUSTER_LIMIT, MAX_CLUSTER_COUNT_LIMIT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-limitclustersize=<n>", strprintf("Do not accept transactions whose size with all in-mempool connected transactions exceeds <n> kilobytes (default: %u)", DEFAULT_CLUSTER_SIZE_LIMIT_KVB), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-capturemessages", "Capture all P2P messages to disk", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_VALIDATION_CACHE_BYTES >> 20), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
Expand Down
1 change: 1 addition & 0 deletions src/kernel/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ add_library(bitcoinkernel
../support/lockedpool.cpp
../sync.cpp
../txdb.cpp
../txgraph.cpp
../txmempool.cpp
../uint256.cpp
../util/chaintype.cpp
Expand Down
Loading
Loading