Skip to content

Commit

Permalink
Merge bitcoin#22144: Randomize message processing peer order
Browse files Browse the repository at this point in the history
79c02c8 Randomize message processing peer order (Pieter Wuille)

Pull request description:

  Right now, the message handling loop iterates the list of nodes always in the same order: the order they were connected in (see the `vNodes` vector). For some parts of the net processing logic, this order matters. Transaction requests are assigned explicitly to peers since bitcoin#19988, but many other parts of processing work on a "first-served-by-loop-first" basis, such as block downloading. If peers can predict this ordering, it may be exploited to cause delays.

  As there isn't anything particularly optimal about the current ordering, just make it unpredictable by randomizing.

  Reported by Crypt-iQ.

ACKs for top commit:
  jnewbery:
    ACK 79c02c8
  Crypt-iQ:
    ACK 79c02c8
  sdaftuar:
    utACK 79c02c8
  achow101:
    Code Review ACK 79c02c8
  jamesob:
    crACK bitcoin@79c02c8
  jonatack:
    ACK 79c02c8
  vasild:
    ACK 79c02c8
  theStack:
    ACK 79c02c8

Tree-SHA512: 9a87c4dcad47c2d61b76c4f37f59674876b78f33f45943089bf159902a23e12de7a5feae1a73b17cbc3f2e37c980ecf0f7fd86af9e6fa3a68099537a3c82c106
  • Loading branch information
fanquake authored and PastaPastaPasta committed Apr 23, 2024
1 parent 4d20cb7 commit 366ca98
Showing 1 changed file with 5 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/net.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2965,6 +2965,7 @@ void CConnman::ThreadMessageHandler()
{
int64_t nLastSendMessagesTimeMasternodes = 0;

FastRandomContext rng;
while (!flagInterruptMsgProc)
{
std::vector<CNode*> vNodesCopy = CopyNodeVector();
Expand All @@ -2976,6 +2977,10 @@ void CConnman::ThreadMessageHandler()
fSkipSendMessagesForMasternodes = false;
nLastSendMessagesTimeMasternodes = GetTimeMillis();
}
// Randomize the order in which we process messages from/to our peers.
// This prevents attacks in which an attacker exploits having multiple
// consecutive connections in the vNodes list.
Shuffle(vNodesCopy.begin(), vNodesCopy.end(), rng);

for (CNode* pnode : vNodesCopy)
{
Expand Down

0 comments on commit 366ca98

Please sign in to comment.