|
template<typename Stream > |
void | Serialize (Stream &s_) const EXCLUSIVE_LOCKS_REQUIRED(!cs) |
|
template<typename Stream > |
void | Unserialize (Stream &s_) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
|
| CAddrMan (std::vector< bool > asmap, bool deterministic, int32_t consistency_check_ratio) |
|
| ~CAddrMan () |
|
size_t | size () const EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Return the number of (unique) addresses in all tables. More...
|
|
bool | Add (const std::vector< CAddress > &vAddr, const CNetAddr &source, int64_t nTimePenalty=0) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Add addresses to addrman's new table. More...
|
|
void | Good (const CService &addr, int64_t nTime=GetAdjustedTime()) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Mark an entry as accessible. More...
|
|
void | Attempt (const CService &addr, bool fCountFailure, int64_t nTime=GetAdjustedTime()) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Mark an entry as connection attempted to. More...
|
|
void | ResolveCollisions () EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| See if any to-be-evicted tried table entries have been tested and if so resolve the collisions. More...
|
|
CAddrInfo | SelectTriedCollision () EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Randomly select an address in tried that another address is attempting to evict. More...
|
|
CAddrInfo | Select (bool newOnly=false) const EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Choose an address to connect to. More...
|
|
std::vector< CAddress > | GetAddr (size_t max_addresses, size_t max_pct, std::optional< Network > network) const EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Return all or many randomly selected addresses, optionally by network. More...
|
|
void | Connected (const CService &addr, int64_t nTime=GetAdjustedTime()) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
| Outer function for Connected_() More...
|
|
void | SetServices (const CService &addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(!cs) |
|
const std::vector< bool > & | GetAsmap () const |
|
|
FastRandomContext insecure_rand | GUARDED_BY (cs) |
| Source of random numbers for randomization in inner loops. More...
|
|
int nIdCount | GUARDED_BY (cs) |
| last used nId More...
|
|
std::unordered_map< int, CAddrInfo > mapInfo | GUARDED_BY (cs) |
| table with information about all nIds More...
|
|
std::unordered_map< CNetAddr, int, CNetAddrHash > mapAddr | GUARDED_BY (cs) |
| find an nId based on its network address More...
|
|
std::vector< int > vRandom | GUARDED_BY (cs) |
| randomly-ordered vector of all nIds This is mutable because it is unobservable outside the class, so any changes to it (even in const methods) are also unobservable. More...
|
|
int nTried | GUARDED_BY (cs) |
|
int vvTried[ADDRMAN_TRIED_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] | GUARDED_BY (cs) |
| list of "tried" buckets More...
|
|
int nNew | GUARDED_BY (cs) |
| number of (unique) "new" entries More...
|
|
int vvNew[ADDRMAN_NEW_BUCKET_COUNT][ADDRMAN_BUCKET_SIZE] | GUARDED_BY (cs) |
| list of "new" buckets More...
|
|
int64_t nLastGood | GUARDED_BY (cs) |
| last time Good was called (memory only). Initially set to 1 so that "never" is strictly worse. More...
|
|
CAddrInfo * | Find (const CNetAddr &addr, int *pnId=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Find an entry. More...
|
|
CAddrInfo * | Create (const CAddress &addr, const CNetAddr &addrSource, int *pnId=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Create a new entry and add it to the internal data structures mapInfo, mapAddr and vRandom. More...
|
|
void | SwapRandom (unsigned int nRandomPos1, unsigned int nRandomPos2) const EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Swap two elements in vRandom. More...
|
|
void | MakeTried (CAddrInfo &info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Move an entry from the "new" table(s) to the "tried" table. More...
|
|
void | Delete (int nId) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Delete an entry. It must not be in tried, and have refcount 0. More...
|
|
void | ClearNew (int nUBucket, int nUBucketPos) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Clear a position in a "new" table. This is the only place where entries are actually deleted. More...
|
|
void | Good_ (const CService &addr, bool test_before_evict, int64_t time) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Mark an entry "good", possibly moving it from "new" to "tried". More...
|
|
bool | Add_ (const CAddress &addr, const CNetAddr &source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Add an entry to the "new" table. More...
|
|
void | Attempt_ (const CService &addr, bool fCountFailure, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Mark an entry as attempted to connect. More...
|
|
CAddrInfo | Select_ (bool newOnly) const EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Select an address to connect to, if newOnly is set to true, only the new table is selected from. More...
|
|
void | ResolveCollisions_ () EXCLUSIVE_LOCKS_REQUIRED(cs) |
| See if any to-be-evicted tried table entries have been tested and if so resolve the collisions. More...
|
|
CAddrInfo | SelectTriedCollision_ () EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Return a random to-be-evicted tried table address. More...
|
|
void | Check () const EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Consistency check, taking into account m_consistency_check_ratio. Will std::abort if an inconsistency is detected. More...
|
|
int | ForceCheckAddrman () const EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Perform consistency check, regardless of m_consistency_check_ratio. More...
|
|
void | GetAddr_ (std::vector< CAddress > &vAddr, size_t max_addresses, size_t max_pct, std::optional< Network > network) const EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Return all or many randomly selected addresses, optionally by network. More...
|
|
void | Connected_ (const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| We have successfully connected to this peer. More...
|
|
void | SetServices_ (const CService &addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(cs) |
| Update an entry's service bits. More...
|
|
Stochastical (IP) address manager.
Definition at line 142 of file addrman.h.
void CAddrMan::Connected_ |
( |
const CService & |
addr, |
|
|
int64_t |
nTime |
|
) |
| |
|
private |
We have successfully connected to this peer.
Calling this function updates the CAddress's nTime, which is used in our IsTerrible() decisions and gossiped to peers. Callers should be careful that updating this information doesn't leak topology information to network spies.
net_processing calls this function when it disconnects from a peer to not leak information about currently connected peers.
- Parameters
-
[in] | addr | The address of the peer we were connected to |
[in] | nTime | The time that we were last connected to this peer |
Definition at line 889 of file addrman.cpp.
template<typename Stream >
template void CAddrMan::Serialize |
( |
Stream & |
s_ | ) |
const |
Serialized format.
- format version byte (
- See also
Format
)
- lowest compatible format version byte. This is used to help old software decide whether to parse the file. For example:
- Bitcoin Core version N knows how to parse up to format=3. If a new format=4 is introduced in version N+1 that is compatible with format=3 and it is known that version N will be able to parse it, then version N+1 will write (format=4, lowest_compatible=3) in the first two bytes of the file, and so version N will still try to parse it.
- Bitcoin Core version N+2 introduces a new incompatible format=5. It will write (format=5, lowest_compatible=5) and so any versions that do not know how to parse format=5 will not try to read the file.
- nKey
- nNew
- nTried
- number of "new" buckets XOR 2**30
- all new addresses (total count: nNew)
- all tried addresses (total count: nTried)
- for each new bucket:
- number of elements
- for each element: index in the serialized "all new addresses"
- asmap checksum
2**30 is xorred with the number of buckets to make addrman deserializer v0 detect it as incompatible. This is necessary because it did not check the version number on deserialization.
vvNew, vvTried, mapInfo, mapAddr and vRandom are never encoded explicitly; they are instead reconstructed from the other information.
This format is more complex, but significantly smaller (at most 1.5 MiB), and supports changes to the ADDRMAN_ parameters without breaking the on-disk structure.
We don't use SERIALIZE_METHODS since the serialization and deserialization code has very little in common.
Definition at line 123 of file addrman.cpp.