aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGregory Maxwell <greg@xiph.org>2016-06-13 17:27:44 +0000
committerGregory Maxwell <greg@xiph.org>2016-06-15 09:56:37 +0000
commit8c99d1b525562ab3b733e9d7ef770882646bad5c (patch)
tree60c73cd07b468cea795a0ab41f68c42bdf918dc2 /src
parent11cc143895e730002749f0881c4c95635fa54bd5 (diff)
downloadbitcoin-8c99d1b525562ab3b733e9d7ef770882646bad5c.tar.xz
Treat orphans as implicit inv for parents, discard when parents rejected.
An orphan whos parents were rejected is never going to connect, so there is little utility in keeping it. Orphans also helpfully tell us what we're missing, so go ahead and treat it as INVed.
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 44d96d614e..6a2290bc05 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5156,13 +5156,29 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
else if (fMissingInputs)
{
- AddOrphanTx(tx, pfrom->GetId());
+ bool fRejectedParents = false; // It may be the case that the orphans parents have all been rejected
+ BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ if (recentRejects->contains(txin.prevout.hash)) {
+ fRejectedParents = true;
+ break;
+ }
+ }
+ if (!fRejectedParents) {
+ BOOST_FOREACH(const CTxIn& txin, tx.vin) {
+ CInv inv(MSG_TX, txin.prevout.hash);
+ pfrom->AddInventoryKnown(inv);
+ if (!AlreadyHave(inv)) pfrom->AskFor(inv);
+ }
+ AddOrphanTx(tx, pfrom->GetId());
- // DoS prevention: do not allow mapOrphanTransactions to grow unbounded
- unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
- unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx);
- if (nEvicted > 0)
- LogPrint("mempool", "mapOrphan overflow, removed %u tx\n", nEvicted);
+ // DoS prevention: do not allow mapOrphanTransactions to grow unbounded
+ unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, GetArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
+ unsigned int nEvicted = LimitOrphanTxSize(nMaxOrphanTx);
+ if (nEvicted > 0)
+ LogPrint("mempool", "mapOrphan overflow, removed %u tx\n", nEvicted);
+ } else {
+ LogPrint("mempool", "not keeping orphan with rejected parents %s\n",tx.GetHash().ToString());
+ }
} else {
assert(recentRejects);
recentRejects->insert(tx.GetHash());