aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2012-08-20 21:10:25 -0400
committerMatt Corallo <git@bluematt.me>2013-01-16 12:48:02 -0500
commit4c8fc1a5885634c3b463d5d44337d81cc5b1456b (patch)
treeafd148bb61784fc11a2e12bac84b46a99d887063
parentb02ddbedcba4f9d86b1aabeb71fe18ec03f9a41a (diff)
Let a node opt out of tx invs before we get a their bloom filter
Note that the default value for fRelayTxes is false, meaning we now no longer relay tx inv messages before receiving the remote peer's version message.
-rw-r--r--src/main.cpp6
-rw-r--r--src/net.cpp2
-rw-r--r--src/net.h6
3 files changed, 14 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
index abb0174edd..1c1de636a8 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2838,6 +2838,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
vRecv >> pfrom->strSubVer;
if (!vRecv.empty())
vRecv >> pfrom->nStartingHeight;
+ if (!vRecv.empty())
+ vRecv >> pfrom->fRelayTxes; // set to true after we get the first filter* message
+ else
+ pfrom->fRelayTxes = true;
if (pfrom->fInbound && addrMe.IsRoutable())
{
@@ -3391,6 +3395,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
delete pfrom->pfilter;
pfrom->pfilter = new CBloomFilter(filter);
}
+ pfrom->fRelayTxes = true;
}
@@ -3419,6 +3424,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
LOCK(pfrom->cs_filter);
delete pfrom->pfilter;
pfrom->pfilter = NULL;
+ pfrom->fRelayTxes = true;
}
diff --git a/src/net.cpp b/src/net.cpp
index e88efcd19e..319739429c 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -2031,6 +2031,8 @@ void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataSt
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
{
+ if(!pnode->fRelayTxes)
+ continue;
LOCK(pnode->cs_filter);
if (pnode->pfilter)
{
diff --git a/src/net.h b/src/net.h
index 81fe312001..087b2dd6a2 100644
--- a/src/net.h
+++ b/src/net.h
@@ -152,6 +152,11 @@ public:
bool fNetworkNode;
bool fSuccessfullyConnected;
bool fDisconnect;
+ // We use fRelayTxes for two purposes -
+ // a) it allows us to not relay tx invs before receiving the peer's version message
+ // b) the peer may tell us in their version message that we should not relay tx invs
+ // until they have initialized their bloom filter.
+ bool fRelayTxes;
CSemaphoreGrant grantOutbound;
CCriticalSection cs_filter;
CBloomFilter* pfilter;
@@ -211,6 +216,7 @@ public:
nStartingHeight = -1;
fGetAddr = false;
nMisbehavior = 0;
+ fRelayTxes = false;
setInventoryKnown.max_size(SendBufferSize() / 1000);
pfilter = NULL;