Skip to content

Commit

Permalink
Merge bitcoin#8080: Do not use mempool for GETDATA for tx accepted af…
Browse files Browse the repository at this point in the history
…ter the last mempool req.

7e908c7 Do not use mempool for GETDATA for tx accepted after the last mempool req. (Gregory Maxwell)
  • Loading branch information
laanwj committed May 31, 2016
2 parents a2df115 + 7e908c7 commit 862fd24
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 2 deletions.
6 changes: 5 additions & 1 deletion src/main.cpp
Expand Up @@ -4513,7 +4513,10 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
}
if (!pushed && inv.type == MSG_TX) {
CTransaction tx;
if (mempool.lookup(inv.hash, tx)) {
int64_t txtime;
// To protect privacy, do not answer getdata using the mempool when
// that TX couldn't have been INVed in reply to a MEMPOOL request.
if (mempool.lookup(inv.hash, tx, txtime) && txtime <= pfrom->timeLastMempoolReq) {
pfrom->PushMessage(NetMsgType::TX, tx);
pushed = true;
}
Expand Down Expand Up @@ -5911,6 +5914,7 @@ bool SendMessages(CNode* pto)
vInv.clear();
}
}
pto->timeLastMempoolReq = GetTime();
}

// Determine transactions to relay
Expand Down
1 change: 1 addition & 0 deletions src/net.cpp
Expand Up @@ -2397,6 +2397,7 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
fRelayTxes = false;
fSentAddr = false;
pfilter = new CBloomFilter();
timeLastMempoolReq = 0;
nPingNonceSent = 0;
nPingUsecStart = 0;
nPingUsecTime = 0;
Expand Down
3 changes: 3 additions & 0 deletions src/net.h
Expand Up @@ -17,6 +17,7 @@
#include "sync.h"
#include "uint256.h"

#include <atomic>
#include <deque>
#include <stdint.h>

Expand Down Expand Up @@ -414,6 +415,8 @@ class CNode
// Used for BIP35 mempool sending, also protected by cs_inventory
bool fSendMempool;

// Last time a "MEMPOOL" request was serviced.
std::atomic<int64_t> timeLastMempoolReq;
// Ping time measurement:
// The pong reply we're expecting, or 0 if no pong expected.
uint64_t nPingNonceSent;
Expand Down
10 changes: 9 additions & 1 deletion src/txmempool.cpp
Expand Up @@ -789,15 +789,23 @@ void CTxMemPool::queryHashes(vector<uint256>& vtxid)
std::sort(vtxid.begin(), vtxid.end(), DepthAndScoreComparator(this));
}

bool CTxMemPool::lookup(uint256 hash, CTransaction& result) const

bool CTxMemPool::lookup(uint256 hash, CTransaction& result, int64_t& time) const
{
LOCK(cs);
indexed_transaction_set::const_iterator i = mapTx.find(hash);
if (i == mapTx.end()) return false;
result = i->GetTx();
time = i->GetTime();
return true;
}

bool CTxMemPool::lookup(uint256 hash, CTransaction& result) const
{
int64_t time;
return CTxMemPool::lookup(hash, result, time);
}

bool CTxMemPool::lookupFeeRate(const uint256& hash, CFeeRate& feeRate) const
{
LOCK(cs);
Expand Down
1 change: 1 addition & 0 deletions src/txmempool.h
Expand Up @@ -602,6 +602,7 @@ class CTxMemPool
}

bool lookup(uint256 hash, CTransaction& result) const;
bool lookup(uint256 hash, CTransaction& result, int64_t& time) const;
bool lookupFeeRate(const uint256& hash, CFeeRate& feeRate) const;

/** Estimate fee rate needed to get into the next nBlocks
Expand Down

0 comments on commit 862fd24

Please sign in to comment.