From 03257b832debcb1470420d8657d30ba30f4be770 Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Sun, 31 Jan 2021 23:37:41 +1000 Subject: txorphanage: Extract EraseOrphansForBlock Extract code that erases orphans when a new block is found into EraseOrphansForBlock. --- src/txorphanage.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/txorphanage.cpp') diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp index 1527bdf5ea..45bc0885fa 100644 --- a/src/txorphanage.cpp +++ b/src/txorphanage.cpp @@ -175,3 +175,34 @@ std::pair GetOrphanTx(const uint256& txid) if (it == mapOrphanTransactions.end()) return {nullptr, -1}; return {it->second.tx, it->second.fromPeer}; } + +void EraseOrphansForBlock(const CBlock& block) +{ + LOCK(g_cs_orphans); + + std::vector vOrphanErase; + + for (const CTransactionRef& ptx : block.vtx) { + const CTransaction& tx = *ptx; + + // Which orphan pool entries must we evict? + for (const auto& txin : tx.vin) { + auto itByPrev = mapOrphanTransactionsByPrev.find(txin.prevout); + if (itByPrev == mapOrphanTransactionsByPrev.end()) continue; + for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) { + const CTransaction& orphanTx = *(*mi)->second.tx; + const uint256& orphanHash = orphanTx.GetHash(); + vOrphanErase.push_back(orphanHash); + } + } + } + + // Erase orphan transactions included or precluded by this block + if (vOrphanErase.size()) { + int nErased = 0; + for (const uint256& orphanHash : vOrphanErase) { + nErased += EraseOrphanTx(orphanHash); + } + LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased); + } +} -- cgit v1.2.3