diff options
author | Anthony Towns <aj@erisian.com.au> | 2021-01-31 23:37:41 +1000 |
---|---|---|
committer | Anthony Towns <aj@erisian.com.au> | 2021-02-27 00:31:09 +1000 |
commit | 03257b832debcb1470420d8657d30ba30f4be770 (patch) | |
tree | 37d9ea35a839832c1629523ef8345139e0bd55c7 /src/txorphanage.cpp | |
parent | 3c4c3c2fdda3a361e3802e97bc3566f815b75de1 (diff) |
txorphanage: Extract EraseOrphansForBlock
Extract code that erases orphans when a new block is found into
EraseOrphansForBlock.
Diffstat (limited to 'src/txorphanage.cpp')
-rw-r--r-- | src/txorphanage.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
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<CTransactionRef, NodeId> 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<uint256> 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); + } +} |