diff --git a/p2p/src/server.rs b/p2p/src/server.rs index d4e030e38..72ad506d5 100644 --- a/p2p/src/server.rs +++ b/p2p/src/server.rs @@ -24,7 +24,7 @@ use std::time::Duration; use futures; use futures::{Future, Stream}; use futures::future::{self, IntoFuture}; -use rand::{self, Rng}; +use rand::{thread_rng, Rng}; use tokio_core::net::{TcpListener, TcpStream}; use tokio_core::reactor; use tokio_timer::Timer; @@ -274,14 +274,15 @@ impl Server { if peers.len() == 0 { return None; } + + // we want to randomize which "most_work_peer" we select + thread_rng().shuffle(&mut peers[..]); + peers.sort_by_key(|p| { let p = p.read().unwrap(); p.info.total_difficulty.clone() }); - // TODO we should shuffle here - // we want a random peer with highest total_difficulty - let peer = peers.last().unwrap(); Some(peer.clone()) } @@ -290,11 +291,9 @@ impl Server { pub fn random_peer(&self) -> Option>> { let peers = self.all_peers(); if peers.len() == 0 { - None - } else { - let idx = rand::thread_rng().gen_range(0, peers.len()); - Some(peers[idx].clone()) + return None; } + Some(thread_rng().choose(&peers).unwrap().clone()) } /// Broadcasts the provided block to all our peers. A peer implementation