Always use a 50% chance to choose between tried and new entries

This change was suggested as Countermeasure 2 in
Eclipse Attacks on Bitcoin’s Peer-to-Peer Network, Ethan Heilman,
Alison Kendler, Aviv Zohar, Sharon Goldberg. ePrint Archive Report
2015/263. March 2015.
This commit is contained in:
Pieter Wuille 2015-03-19 09:51:59 -07:00
parent f68ba3f67b
commit c6a63ceeb4
3 changed files with 7 additions and 9 deletions

View file

@ -332,14 +332,13 @@ void CAddrMan::Attempt_(const CService& addr, int64_t nTime)
info.nAttempts++; info.nAttempts++;
} }
CAddress CAddrMan::Select_(int nUnkBias) CAddress CAddrMan::Select_()
{ {
if (size() == 0) if (size() == 0)
return CAddress(); return CAddress();
double nCorTried = sqrt(nTried) * (100.0 - nUnkBias); // Use a 50% chance for choosing between tried and new table entries.
double nCorNew = sqrt(nNew) * nUnkBias; if (nTried > 0 && (nNew == 0 || GetRandInt(2) == 0)) {
if ((nCorTried + nCorNew) * GetRandInt(1 << 30) / (1 << 30) < nCorTried) {
// use a tried node // use a tried node
double fChanceFactor = 1.0; double fChanceFactor = 1.0;
while (1) { while (1) {

View file

@ -231,7 +231,7 @@ protected:
//! Select an address to connect to. //! Select an address to connect to.
//! nUnkBias determines how much to favor new addresses over tried ones (min=0, max=100) //! nUnkBias determines how much to favor new addresses over tried ones (min=0, max=100)
CAddress Select_(int nUnkBias); CAddress Select_();
#ifdef DEBUG_ADDRMAN #ifdef DEBUG_ADDRMAN
//! Perform consistency check. Returns an error code or zero. //! Perform consistency check. Returns an error code or zero.
@ -533,13 +533,13 @@ public:
* Choose an address to connect to. * Choose an address to connect to.
* nUnkBias determines how much "new" entries are favored over "tried" ones (0-100). * nUnkBias determines how much "new" entries are favored over "tried" ones (0-100).
*/ */
CAddress Select(int nUnkBias = 50) CAddress Select()
{ {
CAddress addrRet; CAddress addrRet;
{ {
LOCK(cs); LOCK(cs);
Check(); Check();
addrRet = Select_(nUnkBias); addrRet = Select_();
Check(); Check();
} }
return addrRet; return addrRet;

View file

@ -1221,8 +1221,7 @@ void ThreadOpenConnections()
int nTries = 0; int nTries = 0;
while (true) while (true)
{ {
// use an nUnkBias between 10 (no outgoing connections) and 90 (8 outgoing connections) CAddress addr = addrman.Select();
CAddress addr = addrman.Select(10 + min(nOutbound,8)*10);
// if we selected an invalid address, restart // if we selected an invalid address, restart
if (!addr.IsValid() || setConnected.count(addr.GetGroup()) || IsLocal(addr)) if (!addr.IsValid() || setConnected.count(addr.GetGroup()) || IsLocal(addr))