From f32c408f3a0b7e597977df2bc2cdc4ae298586e5 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sat, 6 Jun 2020 10:25:21 -0700 Subject: [PATCH] Make sure unconfirmed parents are requestable --- src/net_processing.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index c8d03da6597..9a4cd7d0d5f 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1694,6 +1694,17 @@ void static ProcessGetData(CNode& pfrom, const CChainParams& chainparams, CConnm int nSendFlags = (inv.type == MSG_TX ? SERIALIZE_TRANSACTION_NO_WITNESS : 0); connman->PushMessage(&pfrom, msgMaker.Make(nSendFlags, NetMsgType::TX, *tx)); mempool.RemoveUnbroadcastTx(inv.hash); + // As we're going to send tx, make sure its unconfirmed parents are made requestable. + for (const auto& txin : tx->vin) { + auto txinfo = mempool.info(txin.prevout.hash); + if (txinfo.tx && txinfo.m_time > now - UNCONDITIONAL_RELAY_DELAY) { + // Relaying a transaction with a recent but unconfirmed parent. + if (WITH_LOCK(pfrom.m_tx_relay->cs_tx_inventory, return !pfrom.m_tx_relay->filterInventoryKnown.contains(txin.prevout.hash))) { + LOCK(cs_main); + State(pfrom.GetId())->m_recently_announced_invs.insert(txin.prevout.hash); + } + } + } } else { vNotFound.push_back(inv); }