diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3007,15 +3007,7 @@ LogPrint(BCLog::MEMPOOL, " accepted orphan tx %s\n", orphanTxId.ToString()); RelayTransaction(orphanTxId, m_connman); - for (size_t i = 0; i < porphanTx->vout.size(); i++) { - auto it_by_prev = - mapOrphanTransactionsByPrev.find(COutPoint(orphanTxId, i)); - if (it_by_prev != mapOrphanTransactionsByPrev.end()) { - for (const auto &elem : it_by_prev->second) { - orphan_work_set.insert(elem->first); - } - } - } + AddChildrenToWorkSet(*porphanTx, orphan_work_set); EraseOrphanTx(orphanTxId); break; } else if (state.GetResult() != TxValidationResult::TX_MISSING_INPUTS) { @@ -4317,15 +4309,7 @@ // about any requests for it. m_txrequest.ForgetInvId(tx.GetId()); RelayTransaction(tx.GetId(), m_connman); - for (size_t i = 0; i < tx.vout.size(); i++) { - auto it_by_prev = - mapOrphanTransactionsByPrev.find(COutPoint(txid, i)); - if (it_by_prev != mapOrphanTransactionsByPrev.end()) { - for (const auto &elem : it_by_prev->second) { - peer->m_orphan_work_set.insert(elem->first); - } - } - } + AddChildrenToWorkSet(tx, peer->m_orphan_work_set); pfrom.m_last_tx_time = GetTime(); diff --git a/src/txorphanage.h b/src/txorphanage.h --- a/src/txorphanage.h +++ b/src/txorphanage.h @@ -27,6 +27,9 @@ void EraseOrphansFor(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); +void AddChildrenToWorkSet(const CTransaction &tx, + std::set &orphan_work_set) + EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); /** * Map from txid to orphan transaction record. Limited by diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp --- a/src/txorphanage.cpp +++ b/src/txorphanage.cpp @@ -112,3 +112,17 @@ } return nEvicted; } + +void AddChildrenToWorkSet(const CTransaction &tx, + std::set &orphan_work_set) { + AssertLockHeld(g_cs_orphans); + for (size_t i = 0; i < tx.vout.size(); i++) { + auto it_by_prev = + mapOrphanTransactionsByPrev.find(COutPoint(tx.GetId(), i)); + if (it_by_prev != mapOrphanTransactionsByPrev.end()) { + for (const auto &elem : it_by_prev->second) { + orphan_work_set.insert(elem->first); + } + } + } +}