aboutsummaryrefslogtreecommitdiff
path: root/src/txorphanage.cpp
diff options
context:
space:
mode:
authorAnthony Towns <aj@erisian.com.au>2021-01-31 23:37:41 +1000
committerAnthony Towns <aj@erisian.com.au>2021-02-27 00:31:09 +1000
commit03257b832debcb1470420d8657d30ba30f4be770 (patch)
tree37d9ea35a839832c1629523ef8345139e0bd55c7 /src/txorphanage.cpp
parent3c4c3c2fdda3a361e3802e97bc3566f815b75de1 (diff)
downloadbitcoin-03257b832debcb1470420d8657d30ba30f4be770.tar.xz
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.cpp31
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);
+ }
+}