@@ -5,7 +5,6 @@ package network
55
66import  (
77	"math" 
8- 	"math/rand" 
98	"time" 
109
1110	"github.com/ava-labs/avalanchego/ids" 
@@ -14,6 +13,8 @@ import (
1413	"github.com/ava-labs/libevm/log" 
1514	"github.com/ava-labs/libevm/metrics" 
1615
16+ 	"github.com/ava-labs/coreth/utils/rand" 
17+ 
1718	safemath "github.com/ava-labs/avalanchego/utils/math" 
1819)
1920
@@ -66,17 +67,21 @@ func NewPeerTracker() *peerTracker {
6667
6768// shouldTrackNewPeer returns true if we are not connected to enough peers. 
6869// otherwise returns true probabilistically based on the number of tracked peers. 
69- func  (p  * peerTracker ) shouldTrackNewPeer () bool  {
70+ func  (p  * peerTracker ) shouldTrackNewPeer () ( bool ,  error )  {
7071	numResponsivePeers  :=  p .responsivePeers .Len ()
7172	if  numResponsivePeers  <  desiredMinResponsivePeers  {
72- 		return  true 
73+ 		return  true ,  nil 
7374	}
7475	if  len (p .trackedPeers ) >=  len (p .peers ) {
7576		// already tracking all the peers 
76- 		return  false 
77+ 		return  false ,  nil 
7778	}
7879	newPeerProbability  :=  math .Exp (- float64 (numResponsivePeers ) *  newPeerConnectFactor )
79- 	return  rand .Float64 () <  newPeerProbability 
80+ 	randomValue , err  :=  rand .SecureFloat64 ()
81+ 	if  err  !=  nil  {
82+ 		return  false , err 
83+ 	}
84+ 	return  randomValue  <  newPeerProbability , nil 
8085}
8186
8287// getResponsivePeer returns a random [ids.NodeID] of a peer that has responded 
@@ -94,8 +99,12 @@ func (p *peerTracker) getResponsivePeer() (ids.NodeID, safemath.Averager, bool)
9499	return  nodeID , peer .bandwidth , true 
95100}
96101
97- func  (p  * peerTracker ) GetAnyPeer (minVersion  * version.Application ) (ids.NodeID , bool ) {
98- 	if  p .shouldTrackNewPeer () {
102+ func  (p  * peerTracker ) GetAnyPeer (minVersion  * version.Application ) (ids.NodeID , bool , error ) {
103+ 	shouldTrackNewPeer , err  :=  p .shouldTrackNewPeer ()
104+ 	if  err  !=  nil  {
105+ 		return  ids.NodeID {}, false , err 
106+ 	}
107+ 	if  shouldTrackNewPeer  {
99108		for  nodeID  :=  range  p .peers  {
100109			// if minVersion is specified and peer's version is less, skip 
101110			if  minVersion  !=  nil  &&  p .peers [nodeID ].version .Compare (minVersion ) <  0  {
@@ -106,7 +115,7 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
106115				continue 
107116			}
108117			log .Debug ("peer tracking: connecting to new peer" , "trackedPeers" , len (p .trackedPeers ), "nodeID" , nodeID )
109- 			return  nodeID , true 
118+ 			return  nodeID , true ,  nil 
110119		}
111120	}
112121	var  (
@@ -115,18 +124,23 @@ func (p *peerTracker) GetAnyPeer(minVersion *version.Application) (ids.NodeID, b
115124		random    bool 
116125		averager  safemath.Averager 
117126	)
118- 	if  rand .Float64 () <  randomPeerProbability  {
127+ 	randomValue , err  :=  rand .SecureFloat64 ()
128+ 	switch  {
129+ 	case  err  !=  nil :
130+ 		return  ids.NodeID {}, false , err 
131+ 	case  randomValue  <  randomPeerProbability :
119132		random  =  true 
120133		nodeID , averager , ok  =  p .getResponsivePeer ()
121- 	}  else  { 
134+ 	default : 
122135		nodeID , averager , ok  =  p .bandwidthHeap .Pop ()
123136	}
124137	if  ok  {
125138		log .Debug ("peer tracking: popping peer" , "nodeID" , nodeID , "bandwidth" , averager .Read (), "random" , random )
126- 		return  nodeID , true 
139+ 		return  nodeID , true ,  err 
127140	}
128141	// if no nodes found in the bandwidth heap, return a tracked node at random 
129- 	return  p .trackedPeers .Peek ()
142+ 	nodeID , ok  =  p .trackedPeers .Peek ()
143+ 	return  nodeID , ok , nil 
130144}
131145
132146func  (p  * peerTracker ) TrackPeer (nodeID  ids.NodeID ) {
0 commit comments