|
|
@ -846,6 +846,8 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (vEvictionCandidates.empty()) return false; |
|
|
|
|
|
|
|
|
|
|
|
// Protect connections with certain characteristics
|
|
|
|
// Protect connections with certain characteristics
|
|
|
|
|
|
|
|
|
|
|
|
// Deterministically select 4 peers to protect by netgroup.
|
|
|
|
// Deterministically select 4 peers to protect by netgroup.
|
|
|
@ -854,18 +856,21 @@ static bool AttemptToEvictConnection(bool fPreferNewConnection) { |
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), comparerNetGroupKeyed); |
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), comparerNetGroupKeyed); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(4, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end()); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(4, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (vEvictionCandidates.empty()) return false; |
|
|
|
|
|
|
|
|
|
|
|
// Protect the 8 nodes with the best ping times.
|
|
|
|
// Protect the 8 nodes with the best ping times.
|
|
|
|
// An attacker cannot manipulate this metric without physically moving nodes closer to the target.
|
|
|
|
// An attacker cannot manipulate this metric without physically moving nodes closer to the target.
|
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeMinPingTime); |
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeMinPingTime); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(8, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end()); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(8, static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (vEvictionCandidates.empty()) return false; |
|
|
|
|
|
|
|
|
|
|
|
// Protect the 64 nodes which have been connected the longest.
|
|
|
|
// Protect the 64 nodes which have been connected the longest.
|
|
|
|
// This replicates the existing implicit behavior.
|
|
|
|
// This replicates the existing implicit behavior.
|
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected); |
|
|
|
std::sort(vEvictionCandidates.begin(), vEvictionCandidates.end(), ReverseCompareNodeTimeConnected); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - std::min(static_cast<int>(vEvictionCandidates.size() / 2), static_cast<int>(vEvictionCandidates.size())), vEvictionCandidates.end()); |
|
|
|
vEvictionCandidates.erase(vEvictionCandidates.end() - static_cast<int>(vEvictionCandidates.size() / 2), vEvictionCandidates.end()); |
|
|
|
|
|
|
|
|
|
|
|
if (vEvictionCandidates.empty()) |
|
|
|
if (vEvictionCandidates.empty()) return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Identify CNetAddr with the most connections
|
|
|
|
// Identify CNetAddr with the most connections
|
|
|
|
CNetAddr naMostConnections; |
|
|
|
CNetAddr naMostConnections; |
|
|
|