From 318176aff1ded36d1fbc5977f288ac3bac1d8712 Mon Sep 17 00:00:00 2001 From: Martin Zumsande Date: Wed, 28 Jul 2021 23:48:34 +0200 Subject: doc: Update high-level addrman description --- src/addrman.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/addrman.h') diff --git a/src/addrman.h b/src/addrman.h index 1fc64ac07f..7e87457a9f 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -104,19 +104,23 @@ public: * * Make sure no (localized) attacker can fill the entire table with his nodes/addresses. * * To that end: - * * Addresses are organized into buckets. - * * Addresses that have not yet been tried go into 1024 "new" buckets. - * * Based on the address range (/16 for IPv4) of the source of information, 64 buckets are selected at random. + * * Addresses are organized into buckets that can each store up to 64 entries. + * * Addresses to which our node has not successfully connected go into 1024 "new" buckets. + * * Based on the address range (/16 for IPv4) of the source of information, or if an asmap is provided, + * the AS it belongs to (for IPv4/IPv6), 64 buckets are selected at random. * * The actual bucket is chosen from one of these, based on the range in which the address itself is located. + * * The position in the bucket is chosen based on the full address. * * One single address can occur in up to 8 different buckets to increase selection chances for addresses that * are seen frequently. The chance for increasing this multiplicity decreases exponentially. - * * When adding a new address to a full bucket, a randomly chosen entry (with a bias favoring less recently seen - * ones) is removed from it first. + * * When adding a new address to an occupied position of a bucket, it will not replace the existing entry + * unless that address is also stored in another bucket or it doesn't meet one of several quality criteria + * (see IsTerrible for exact criteria). * * Addresses of nodes that are known to be accessible go into 256 "tried" buckets. * * Each address range selects at random 8 of these buckets. * * The actual bucket is chosen from one of these, based on the full address. - * * When adding a new good address to a full bucket, a randomly chosen entry (with a bias favoring less recently - * tried ones) is evicted from it, back to the "new" buckets. + * * When adding a new good address to an occupied position of a bucket, a FEELER connection to the + * old address is attempted. The old entry is only replaced and moved back to the "new" buckets if this + * attempt was unsuccessful. * * Bucket selection is based on cryptographic hashing, using a randomly-generated 256-bit key, which should not * be observable by adversaries. * * Several indexes are kept for high performance. Defining DEBUG_ADDRMAN will introduce frequent (and expensive) -- cgit v1.2.3 From 036d7eadf5dd0e06e0734a5d78dbe28f4bfaa07f Mon Sep 17 00:00:00 2001 From: Amiti Uttarwar Date: Mon, 2 Aug 2021 22:22:18 +0200 Subject: doc: Correct description of CAddrMan::Create() Co-authored-by: Martin Zumsande --- src/addrman.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/addrman.h') diff --git a/src/addrman.h b/src/addrman.h index 7e87457a9f..4f1d5e6bdf 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -696,8 +696,7 @@ private: //! Find an entry. CAddrInfo* Find(const CNetAddr& addr, int *pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); - //! find an entry, creating it if necessary. - //! nTime and nServices of the found node are updated, if necessary. + //! Create a new entry and add it to the internal data structures mapInfo, mapAddr and vRandom. CAddrInfo* Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId = nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs); //! Swap two elements in vRandom. -- cgit v1.2.3