From f3be9991d7517182c416b1139d09f3943e31f0ee Mon Sep 17 00:00:00 2001 From: Miguel Herranz Date: Sun, 5 Feb 2017 23:46:47 +0100 Subject: [PATCH 1/2] Make get_random_gray_peer distribution uniform get_random_gray_peer is used to implement feeler connections, described in: https://eprint.iacr.org/2015/263.pdf 2. Random selection --- src/p2p/net_peerlist.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/p2p/net_peerlist.h b/src/p2p/net_peerlist.h index 6b999207b..11d995995 100644 --- a/src/p2p/net_peerlist.h +++ b/src/p2p/net_peerlist.h @@ -408,13 +408,10 @@ namespace nodetool return false; } - size_t x = crypto::rand() % (m_peers_gray.size() + 1); - size_t res = (x * x * x) / (m_peers_gray.size() * m_peers_gray.size()); //parabola \/ - - LOG_PRINT_L3("Random gray peer index=" << res << "(x="<< x << ", max_index=" << m_peers_gray.size() << ")"); + size_t random_index = crypto::rand() % m_peers_gray.size(); peers_indexed::index::type& by_time_index = m_peers_gray.get(); - pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), res); + pe = *epee::misc_utils::move_it_backward(--by_time_index.end(), random_index); return true; From 1a7e18bfdfaeaadb33341173e09b614a129f07de Mon Sep 17 00:00:00 2001 From: Miguel Herranz Date: Tue, 28 Feb 2017 17:39:39 +0100 Subject: [PATCH 2/2] Make gray peer selection uniform Prevents the system from always picking the gray peers with the most recent last_seen. --- src/p2p/net_node.inl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index c40bd8c5d..99c4e9282 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -1023,7 +1023,14 @@ namespace nodetool while(rand_count < (max_random_index+1)*3 && try_count < 10 && !m_net_server.is_stop_signal_sent()) { ++rand_count; - size_t random_index = get_random_index_with_fixed_probability(max_random_index); + size_t random_index; + + if (use_white_list) { + random_index = get_random_index_with_fixed_probability(max_random_index); + } else { + random_index = crypto::rand() % m_peerlist.get_gray_peers_count(); + } + CHECK_AND_ASSERT_MES(random_index < local_peers_count, false, "random_starter_index < peers_local.size() failed!!"); if(tried_peers.count(random_index))