 |
Bitcoin Core
22.99.0
P2P Digital Currency
|
Go to the documentation of this file.
5 #ifndef BITCOIN_ADDRMAN_IMPL_H
6 #define BITCOIN_ADDRMAN_IMPL_H
19 #include <unordered_map>
20 #include <unordered_set>
67 READWRITE(obj.source, obj.nLastSuccess, obj.nAttempts);
103 AddrManImpl(std::vector<bool>&& asmap,
bool deterministic, int32_t consistency_check_ratio);
107 template <
typename Stream>
110 template <
typename Stream>
115 bool Add(
const std::vector<CAddress>& vAddr,
const CNetAddr&
source, int64_t nTimePenalty)
128 std::pair<CAddress, int64_t>
Select(
bool newOnly)
const
131 std::vector<CAddress>
GetAddr(
size_t max_addresses,
size_t max_pct, std::optional<Network> network)
const
143 const std::vector<bool>&
GetAsmap()
const;
184 std::unordered_map<int, AddrInfo> mapInfo
GUARDED_BY(
cs);
187 std::unordered_map<CService, int, CServiceHash> mapAddr
GUARDED_BY(
cs);
282 #endif // BITCOIN_ADDRMAN_IMPL_H
A combination of a network address (CNetAddr) and a (TCP) port.
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.
int64_t nLastSuccess
last successful connection by us
std::pair< CAddress, int64_t > Select(bool newOnly) const EXCLUSIVE_LOCKS_REQUIRED(!cs)
void Connected_(const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs)
FastRandomContext insecure_rand GUARDED_BY(cs)
Source of random numbers for randomization in inner loops.
void Serialize(Stream &s_) const EXCLUSIVE_LOCKS_REQUIRED(!cs)
AddrInfo(const CAddress &addrIn, const CNetAddr &addrSource)
bool AddSingle(const CAddress &addr, const CNetAddr &source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(cs)
Attempt to add a single address to addrman's new table.
std::vector< CAddress > GetAddr_(size_t max_addresses, size_t max_pct, std::optional< Network > network) const EXCLUSIVE_LOCKS_REQUIRED(cs)
@ V4_MULTIPORT
adds support for multiple ports per IP
const std::vector< bool > m_asmap
int nAttempts
connection attempts since last successful attempt
void SetServices(const CService &addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(!cs)
void ResolveCollisions() EXCLUSIVE_LOCKS_REQUIRED(!cs)
static constexpr int32_t ADDRMAN_NEW_BUCKET_COUNT_LOG2
Total number of buckets for new addresses.
std::optional< AddressPosition > FindAddressEntry_(const CAddress &addr) EXCLUSIVE_LOCKS_REQUIRED(cs)
AddrInfo * 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.
static constexpr int ADDRMAN_TRIED_BUCKET_COUNT
Extended statistics about a CAddress.
ServiceFlags
nServices flags
int64_t nLastTry
last try whatsoever by us (memory only)
std::vector< CAddress > GetAddr(size_t max_addresses, size_t max_pct, std::optional< Network > network) const EXCLUSIVE_LOCKS_REQUIRED(!cs)
#define READWRITEAS(type, obj)
static constexpr int ADDRMAN_BUCKET_SIZE
AddrManImpl(std::vector< bool > &&asmap, bool deterministic, int32_t consistency_check_ratio)
void SetServices_(const CService &addr, ServiceFlags nServices) EXCLUSIVE_LOCKS_REQUIRED(cs)
std::pair< CAddress, int64_t > SelectTriedCollision_() EXCLUSIVE_LOCKS_REQUIRED(cs)
int nIdCount GUARDED_BY(cs)
last used nId
AddrInfo * Find(const CService &addr, int *pnId=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs)
Find an entry.
static constexpr int32_t ADDRMAN_TRIED_BUCKET_COUNT_LOG2
Total number of buckets for tried addresses.
SERIALIZE_METHODS(AddrInfo, obj)
@ V3_BIP155
same as V2_ASMAP plus addresses are in BIP155 format
void Connected(const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(!cs)
void ResolveCollisions_() EXCLUSIVE_LOCKS_REQUIRED(cs)
bool IsTerrible(int64_t nNow=GetAdjustedTime()) const
Determine whether the statistics about this entry are bad enough so that it can just be deleted.
int GetBucketPosition(const uint256 &nKey, bool fNew, int nBucket) const
Calculate in which position of a bucket to store this entry.
void Attempt_(const CService &addr, bool fCountFailure, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(cs)
CNetAddr source
where knowledge about this address first came from
int GetNewBucket(const uint256 &nKey, const CNetAddr &src, const std::vector< bool > &asmap) const
Calculate in which "new" bucket this entry belongs, given a certain source.
int64_t nLastCountAttempt
last counted attempt (memory only)
std::set< int > m_tried_collisions
Holds addrs inserted into tried table that collide with existing entries. Test-before-evict disciplin...
Test-only struct, capturing info about an address in AddrMan.
@ V0_HISTORICAL
historic format, before commit e6b343d88
const int32_t m_consistency_check_ratio
Perform consistency checks every m_consistency_check_ratio operations (if non-zero).
void MakeTried(AddrInfo &info, int nId) EXCLUSIVE_LOCKS_REQUIRED(cs)
Move an entry from the "new" table(s) to the "tried" table.
bool Add(const std::vector< CAddress > &vAddr, const CNetAddr &source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(!cs)
uint256 nKey
secret key to randomize bucket select with
void Check() const EXCLUSIVE_LOCKS_REQUIRED(cs)
Consistency check, taking into account m_consistency_check_ratio.
int nNew GUARDED_BY(cs)
number of (unique) "new" entries
int64_t GetAdjustedTime()
A CService with information about it as peer.
static constexpr uint8_t INCOMPATIBILITY_BASE
The initial value of a field that is incremented every time an incompatible format change is made (su...
bool Good_(const CService &addr, bool test_before_evict, int64_t time) EXCLUSIVE_LOCKS_REQUIRED(cs)
void SwapRandom(unsigned int nRandomPos1, unsigned int nRandomPos2) const EXCLUSIVE_LOCKS_REQUIRED(cs)
Swap two elements in vRandom.
static constexpr Format FILE_FORMAT
The maximum format this software knows it can unserialize.
int nRefCount
reference count in new sets (memory only)
bool Add_(const std::vector< CAddress > &vAddr, const CNetAddr &source, int64_t nTimePenalty) EXCLUSIVE_LOCKS_REQUIRED(cs)
void Unserialize(Stream &s_) EXCLUSIVE_LOCKS_REQUIRED(!cs)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
bool Good(const CService &addr, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(!cs)
std::pair< CAddress, int64_t > Select_(bool newOnly) const EXCLUSIVE_LOCKS_REQUIRED(cs)
double GetChance(int64_t nNow=GetAdjustedTime()) const
Calculate the relative chance this entry should be given when selecting nodes to connect to.
std::optional< AddressPosition > FindAddressEntry(const CAddress &addr) EXCLUSIVE_LOCKS_REQUIRED(!cs)
const std::vector< bool > & GetAsmap() const
static constexpr int ADDRMAN_NEW_BUCKET_COUNT
Mutex cs
A mutex to protect the inner data structures.
@ V1_DETERMINISTIC
for pre-asmap files
static constexpr int32_t ADDRMAN_BUCKET_SIZE_LOG2
Maximum allowed number of entries in buckets for new and tried addresses.
size_t size() const EXCLUSIVE_LOCKS_REQUIRED(!cs)
int CheckAddrman() const EXCLUSIVE_LOCKS_REQUIRED(cs)
Perform consistency check, regardless of m_consistency_check_ratio.
int GetTriedBucket(const uint256 &nKey, const std::vector< bool > &asmap) const
Calculate in which "tried" bucket this entry belongs.
int nTried GUARDED_BY(cs)
std::pair< CAddress, int64_t > SelectTriedCollision() EXCLUSIVE_LOCKS_REQUIRED(!cs)
@ V2_ASMAP
for files including asmap version
int GetNewBucket(const uint256 &nKey, const std::vector< bool > &asmap) const
Calculate in which "new" bucket this entry belongs, using its default source.
bool fInTried
in tried set? (memory only)
Format
Serialization versions.
int nRandomPos
position in vRandom
void Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs)
Delete an entry. It must not be in tried, and have refcount 0.
void Attempt(const CService &addr, bool fCountFailure, int64_t nTime) EXCLUSIVE_LOCKS_REQUIRED(!cs)