What changed, and why it matters
This commit adds a new internal transaction graph object (TxGraph) inside Bitcoin Core's memory pool (mempool). It is a small, structural code change that initializes the graph and includes its memory usage in accounting. There is no direct evidence in the commit or supplied references that this fixes or introduces a security vulnerability.
Treat as a normal code-review item. Verify that the TxGraph implementation (not shown here) is correctly guarded by cs, that future commits properly synchronize all graph mutations, and that the memory-usage estimate does not undercount graph allocations. No immediate security action is warranted based solely on this commit.
Security signals we found
New mempool subsystem (TxGraph) introduced; correctness depends on future integration
Memory accounting updated to include graph memory usage, which affects resource reporting
No input validation, locking, or boundary checks visible in this patch
Evidence from the diff
The patch instantiates a std::unique_ptr
Changed components
src/txmempool.cppsrc/txmempool.hCTxMemPoolTxGraphInspect captured patch +9 / −1
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index e6e2042e..c931b361 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -413,6 +413,7 @@ static CTxMemPool::Options&& Flatten(CTxMemPool::Options&& opts, bilingual_str&
CTxMemPool::CTxMemPool(Options opts, bilingual_str& error)
: m_opts{Flatten(std::move(opts), error)}
{
+ m_txgraph = MakeTxGraph(64, 101'000, ACCEPTABLE_ITERS);
}
bool CTxMemPool::isSpent(const COutPoint& outpoint) const
@@ -1042,7 +1043,7 @@ void CCoinsViewMemPool::Reset()
size_t CTxMemPool::DynamicMemoryUsage() const {
LOCK(cs);
// Estimate the overhead of mapTx to be 15 pointers + an allocation, as no exact formula for boost::multi_index_contained is implemented.
- return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 15 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(txns_randomized) + cachedInnerUsage;
+ return memusage::MallocUsage(sizeof(CTxMemPoolEntry) + 15 * sizeof(void*)) * mapTx.size() + memusage::DynamicUsage(mapNextTx) + memusage::DynamicUsage(mapDeltas) + memusage::DynamicUsage(txns_randomized) + m_txgraph->GetMainMemoryUsage() + cachedInnerUsage;
}
void CTxMemPool::RemoveUnbroadcastTx(const Txid& txid, const bool unchecked) {
diff --git a/src/txmempool.h b/src/txmempool.h
index 90da90da..bc6eb36c 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -19,6 +19,7 @@
#include <primitives/transaction.h>
#include <primitives/transaction_identifier.h>
#include <sync.h>
+#include <txgraph.h>
#include <util/epochguard.h>
#include <util/feefrac.h>
#include <util/hasher.h>
@@ -49,6 +50,11 @@ struct bilingual_str;
/** Fake height value used in Coin to signify they are only in the memory pool (since 0.8) */
static const uint32_t MEMPOOL_HEIGHT = 0x7FFFFFFF;
+/** How many linearization iterations required for TxGraph clusters to have
+ * "acceptable" quality, if they cannot be optimally linearized with fewer
+ * iterations. */
+static constexpr uint64_t ACCEPTABLE_ITERS = 1'700;
+
/**
* Test whether the LockPoints height and time are still valid on the current chain
*/
@@ -376,6 +382,7 @@ public:
uint64_t CalculateDescendantMaximum(txiter entry) const EXCLUSIVE_LOCKS_REQUIRED(cs);
private:
+ std::unique_ptr<TxGraph> m_txgraph GUARDED_BY(cs);
typedef std::map<txiter, setEntries, CompareIteratorByHash> cacheMap;
Why this scored 17/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.