Merge #8080: Do not use mempool for GETDATA for tx accepted after the last mempool req.

7e908c7 Do not use mempool for GETDATA for tx accepted after the last mempool req. (Gregory Maxwell)
This commit is contained in:
Wladimir J. van der Laan 2016-05-31 15:47:15 +02:00 committed by Alexander Block
parent b2a27c0624
commit dfa0bd2341
5 changed files with 17 additions and 2 deletions

View File

@ -2679,6 +2679,7 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn
fRelayTxes = false; fRelayTxes = false;
fSentAddr = false; fSentAddr = false;
pfilter = new CBloomFilter(); pfilter = new CBloomFilter();
timeLastMempoolReq = 0;
nLastBlockTime = 0; nLastBlockTime = 0;
nLastTXTime = 0; nLastTXTime = 0;
nPingNonceSent = 0; nPingNonceSent = 0;

View File

@ -766,6 +766,8 @@ public:
std::atomic<int64_t> nLastBlockTime; std::atomic<int64_t> nLastBlockTime;
std::atomic<int64_t> nLastTXTime; std::atomic<int64_t> nLastTXTime;
// Last time a "MEMPOOL" request was serviced.
std::atomic<int64_t> timeLastMempoolReq;
// Ping time measurement: // Ping time measurement:
// The pong reply we're expecting, or 0 if no pong expected. // The pong reply we're expecting, or 0 if no pong expected.
uint64_t nPingNonceSent; uint64_t nPingNonceSent;

View File

@ -898,7 +898,10 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
if (!pushed && inv.type == MSG_TX) { if (!pushed && inv.type == MSG_TX) {
CTransaction 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) {
connman.PushMessage(pfrom, NetMsgType::TX, tx); connman.PushMessage(pfrom, NetMsgType::TX, tx);
pushed = true; pushed = true;
} }

View File

@ -925,15 +925,23 @@ void CTxMemPool::queryHashes(vector<uint256>& vtxid)
std::sort(vtxid.begin(), vtxid.end(), DepthAndScoreComparator(this)); 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); LOCK(cs);
indexed_transaction_set::const_iterator i = mapTx.find(hash); indexed_transaction_set::const_iterator i = mapTx.find(hash);
if (i == mapTx.end()) return false; if (i == mapTx.end()) return false;
result = i->GetTx(); result = i->GetTx();
time = i->GetTime();
return true; 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 bool CTxMemPool::lookupFeeRate(const uint256& hash, CFeeRate& feeRate) const
{ {
LOCK(cs); LOCK(cs);

View File

@ -648,6 +648,7 @@ public:
} }
bool lookup(uint256 hash, CTransaction& result) const; 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; bool lookupFeeRate(const uint256& hash, CFeeRate& feeRate) const;
/** Estimate fee rate needed to get into the next nBlocks /** Estimate fee rate needed to get into the next nBlocks