diff options
author | John Newbery <john@johnnewbery.com> | 2021-12-14 10:35:37 +0000 |
---|---|---|
committer | Martin Zumsande <mzumsande@gmail.com> | 2022-01-13 15:55:01 +0100 |
commit | ea99f5d01e56ab0192d211da1034ffb299876937 (patch) | |
tree | ac2d9ad1df5486eb188ff69c4665477c3b46ff1b /src/net_processing.cpp | |
parent | bb060746df22c956b8f44e5b8cd1ae4ed73faddc (diff) | |
download | bitcoin-ea99f5d01e56ab0192d211da1034ffb299876937.tar.xz |
[net processing] Move PoissonNextSendInbound to PeerManager
Diffstat (limited to 'src/net_processing.cpp')
-rw-r--r-- | src/net_processing.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/net_processing.cpp b/src/net_processing.cpp index b24f94bd6d..8a7dc9e1f7 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -444,6 +444,8 @@ private: */ std::map<NodeId, PeerRef> m_peer_map GUARDED_BY(m_peer_mutex); + std::atomic<std::chrono::microseconds> m_next_send_inv_to_incoming{0us}; + /** Number of nodes with fSyncStarted. */ int nSyncStarted GUARDED_BY(cs_main) = 0; @@ -518,6 +520,15 @@ private: Mutex m_recent_confirmed_transactions_mutex; CRollingBloomFilter m_recent_confirmed_transactions GUARDED_BY(m_recent_confirmed_transactions_mutex){48'000, 0.000'001}; + /** + * For sending `inv`s to inbound peers, we use a single (exponentially + * distributed) timer for all peers. If we used a separate timer for each + * peer, a spy node could make multiple inbound connections to us to + * accurately determine when we received the transaction (and potentially + * determine the transaction's origin). */ + std::chrono::microseconds PoissonNextSendInbound(std::chrono::microseconds now, + std::chrono::seconds average_interval); + /** Have we requested this block from a peer */ bool IsBlockRequested(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main); @@ -819,6 +830,18 @@ static void UpdatePreferredDownload(const CNode& node, CNodeState* state) EXCLUS nPreferredDownload += state->fPreferredDownload; } +std::chrono::microseconds PeerManagerImpl::PoissonNextSendInbound(std::chrono::microseconds now, + std::chrono::seconds average_interval) +{ + if (m_next_send_inv_to_incoming.load() < now) { + // If this function were called from multiple threads simultaneously + // it would possible that both update the next send variable, and return a different result to their caller. + // This is not possible in practice as only the net processing thread invokes this function. + m_next_send_inv_to_incoming = GetExponentialRand(now, average_interval); + } + return m_next_send_inv_to_incoming; +} + bool PeerManagerImpl::IsBlockRequested(const uint256& hash) { return mapBlocksInFlight.find(hash) != mapBlocksInFlight.end(); @@ -4786,7 +4809,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto) if (pto->m_tx_relay->nNextInvSend < current_time) { fSendTrickle = true; if (pto->IsInboundConn()) { - pto->m_tx_relay->nNextInvSend = m_connman.PoissonNextSendInbound(current_time, INBOUND_INVENTORY_BROADCAST_INTERVAL); + pto->m_tx_relay->nNextInvSend = PoissonNextSendInbound(current_time, INBOUND_INVENTORY_BROADCAST_INTERVAL); } else { pto->m_tx_relay->nNextInvSend = GetExponentialRand(current_time, OUTBOUND_INVENTORY_BROADCAST_INTERVAL); } |