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:
parent
b2a27c0624
commit
dfa0bd2341
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user