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.
This commit is contained in:
parent
b02ddbedcb
commit
4c8fc1a588
3 changed files with 14 additions and 0 deletions
|
@ -2838,6 +2838,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
vRecv >> pfrom->strSubVer;
|
vRecv >> pfrom->strSubVer;
|
||||||
if (!vRecv.empty())
|
if (!vRecv.empty())
|
||||||
vRecv >> pfrom->nStartingHeight;
|
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())
|
if (pfrom->fInbound && addrMe.IsRoutable())
|
||||||
{
|
{
|
||||||
|
@ -3391,6 +3395,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||||
delete pfrom->pfilter;
|
delete pfrom->pfilter;
|
||||||
pfrom->pfilter = new CBloomFilter(filter);
|
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);
|
LOCK(pfrom->cs_filter);
|
||||||
delete pfrom->pfilter;
|
delete pfrom->pfilter;
|
||||||
pfrom->pfilter = NULL;
|
pfrom->pfilter = NULL;
|
||||||
|
pfrom->fRelayTxes = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2031,6 +2031,8 @@ void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataSt
|
||||||
LOCK(cs_vNodes);
|
LOCK(cs_vNodes);
|
||||||
BOOST_FOREACH(CNode* pnode, vNodes)
|
BOOST_FOREACH(CNode* pnode, vNodes)
|
||||||
{
|
{
|
||||||
|
if(!pnode->fRelayTxes)
|
||||||
|
continue;
|
||||||
LOCK(pnode->cs_filter);
|
LOCK(pnode->cs_filter);
|
||||||
if (pnode->pfilter)
|
if (pnode->pfilter)
|
||||||
{
|
{
|
||||||
|
|
|
@ -152,6 +152,11 @@ public:
|
||||||
bool fNetworkNode;
|
bool fNetworkNode;
|
||||||
bool fSuccessfullyConnected;
|
bool fSuccessfullyConnected;
|
||||||
bool fDisconnect;
|
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;
|
CSemaphoreGrant grantOutbound;
|
||||||
CCriticalSection cs_filter;
|
CCriticalSection cs_filter;
|
||||||
CBloomFilter* pfilter;
|
CBloomFilter* pfilter;
|
||||||
|
@ -211,6 +216,7 @@ public:
|
||||||
nStartingHeight = -1;
|
nStartingHeight = -1;
|
||||||
fGetAddr = false;
|
fGetAddr = false;
|
||||||
nMisbehavior = 0;
|
nMisbehavior = 0;
|
||||||
|
fRelayTxes = false;
|
||||||
setInventoryKnown.max_size(SendBufferSize() / 1000);
|
setInventoryKnown.max_size(SendBufferSize() / 1000);
|
||||||
pfilter = NULL;
|
pfilter = NULL;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue