From 61ce384d752233c5f236d0b14c2685a259f0557a Mon Sep 17 00:00:00 2001 From: Sam Kleinman Date: Fri, 8 Jul 2022 10:06:57 -0400 Subject: [PATCH] p2p: make peer gossiping coinflip safer (#8949) Closes #8948 --- internal/p2p/peermanager.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/internal/p2p/peermanager.go b/internal/p2p/peermanager.go index fabff390e..4d179e63f 100644 --- a/internal/p2p/peermanager.go +++ b/internal/p2p/peermanager.go @@ -954,7 +954,7 @@ func (m *PeerManager) Advertise(peerID types.NodeID, limit uint16) []NodeAddress } var numAddresses int - var totalScore int + var totalAbsScore int ranked := m.store.Ranked() seenAddresses := map[NodeAddress]struct{}{} scores := map[types.NodeID]int{} @@ -965,8 +965,12 @@ func (m *PeerManager) Advertise(peerID types.NodeID, limit uint16) []NodeAddress continue } score := int(peer.Score()) + if score < 0 { + totalAbsScore += -score + } else { + totalAbsScore += score + } - totalScore += score scores[peer.ID] = score for addr := range peer.AddressInfo { if _, ok := m.options.PrivatePeers[addr.NodeID]; !ok { @@ -975,6 +979,8 @@ func (m *PeerManager) Advertise(peerID types.NodeID, limit uint16) []NodeAddress } } + meanAbsScore := (totalAbsScore + 1) / (len(scores) + 1) + var attempts uint16 var addedLastIteration bool @@ -1023,7 +1029,7 @@ func (m *PeerManager) Advertise(peerID types.NodeID, limit uint16) []NodeAddress // peer. // nolint:gosec // G404: Use of weak random number generator - if numAddresses <= int(limit) || rand.Intn(totalScore+1) <= scores[peer.ID]+1 || rand.Intn((idx+1)*10) <= idx+1 { + if numAddresses <= int(limit) || rand.Intn((meanAbsScore*2)+1) <= scores[peer.ID]+1 || rand.Intn((idx+1)*10) <= idx+1 { addresses = append(addresses, addressInfo.Address) addedLastIteration = true seenAddresses[addressInfo.Address] = struct{}{}