![]() |
Bitcoin ABC 0.31.0
P2P Digital Currency
|
#include <net.h>
#include <addrdb.h>
#include <addrman.h>
#include <avalanche/avalanche.h>
#include <banman.h>
#include <clientversion.h>
#include <common/args.h>
#include <compat.h>
#include <config.h>
#include <consensus/consensus.h>
#include <crypto/sha256.h>
#include <dnsseeds.h>
#include <i2p.h>
#include <logging.h>
#include <netaddress.h>
#include <netbase.h>
#include <node/ui_interface.h>
#include <protocol.h>
#include <random.h>
#include <scheduler.h>
#include <util/fs.h>
#include <util/sock.h>
#include <util/strencodings.h>
#include <util/thread.h>
#include <util/trace.h>
#include <util/translation.h>
#include <fcntl.h>
#include <algorithm>
#include <array>
#include <cmath>
#include <cstdint>
#include <functional>
#include <limits>
#include <optional>
#include <unordered_map>
Go to the source code of this file.
Classes | |
struct | CompareNodeNetworkTime |
Sort eviction candidates by network/localhost and connection uptime. More... | |
class | CNetCleanup |
Macros | |
#define | FEELER_SLEEP_WINDOW 1 |
Enumerations | |
enum | BindFlags { BF_NONE = 0 , BF_EXPLICIT = (1U << 0) , BF_REPORT_ERROR = (1U << 1) , BF_DONT_ADVERTISE = (1U << 2) } |
Used to pass flags to the Bind() function. More... | |
Functions | |
std::map< CNetAddr, LocalServiceInfo > mapLocalHost | GUARDED_BY (g_maplocalhost_mutex) |
uint16_t | GetListenPort () |
bool | GetLocal (CService &addr, const CNetAddr *paddrPeer) |
static std::vector< CAddress > | convertSeed6 (const std::vector< SeedSpec6 > &vSeedsIn) |
Convert the pnSeed6 array into usable address objects. More... | |
CService | GetLocalAddress (const CNetAddr &addrPeer) |
static int | GetnScore (const CService &addr) |
bool | IsPeerAddrLocalGood (CNode *pnode) |
std::optional< CService > | GetLocalAddrForPeer (CNode &node) |
Returns a local address that we should advertise to this peer. More... | |
bool | AddLocal (const CService &addr, int nScore) |
bool | AddLocal (const CNetAddr &addr, int nScore) |
void | RemoveLocal (const CService &addr) |
void | SetReachable (enum Network net, bool reachable) |
Mark a network as reachable or unreachable (no automatic connects to it) More... | |
bool | IsReachable (enum Network net) |
bool | IsReachable (const CNetAddr &addr) |
bool | SeenLocal (const CService &addr) |
vote for a local address More... | |
bool | IsLocal (const CService &addr) |
check whether a given address is potentially local More... | |
static CAddress | GetBindAddress (SOCKET sock) |
Get the bind address for a socket as CAddress. More... | |
std::string | ConnectionTypeAsString (ConnectionType conn_type) |
Convert ConnectionType enum to a string value. More... | |
static bool | ReverseCompareNodeMinPingTime (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | ReverseCompareNodeTimeConnected (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNetGroupKeyed (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNodeBlockTime (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNodeTXTime (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNodeProofTime (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNodeBlockRelayOnlyTime (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
static bool | CompareNodeAvailabilityScore (const NodeEvictionCandidate &a, const NodeEvictionCandidate &b) |
template<typename T , typename Comparator > | |
static void | EraseLastKElements (std::vector< T > &elements, Comparator comparator, size_t k, std::function< bool(const NodeEvictionCandidate &)> predicate=[](const NodeEvictionCandidate &n) { return true;}) |
Sort an array by the specified comparator, then erase the last K elements where predicate is true. More... | |
void | ProtectEvictionCandidatesByRatio (std::vector< NodeEvictionCandidate > &eviction_candidates) |
Protect desirable or disadvantaged inbound peers from eviction by ratio. More... | |
std::optional< NodeId > | SelectNodeToEvict (std::vector< NodeEvictionCandidate > &&vEvictionCandidates) |
Select an inbound peer to evict after filtering out (protecting) peers having distinct, difficult-to-forge characteristics. More... | |
void | Discover () |
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses to self-advertise. More... | |
std::string | getSubVersionEB (uint64_t MaxBlockSize) |
This function convert MaxBlockSize from byte to MB with a decimal precision one digit rounded down E.g. More... | |
std::string | userAgent (const Config &config) |
void | CaptureMessageToFile (const CAddress &addr, const std::string &msg_type, Span< const uint8_t > data, bool is_incoming) |
Dump binary message to file, with timestamp. More... | |
Variables | |
static constexpr size_t | MAX_BLOCK_RELAY_ONLY_ANCHORS = 2 |
Maximum number of block-relay-only anchor connections. More... | |
const char *const | ANCHORS_DATABASE_FILENAME = "anchors.dat" |
Anchor IP address database file name. More... | |
static constexpr std::chrono::minutes | DUMP_PEERS_INTERVAL {15} |
static constexpr int | DNSSEEDS_TO_QUERY_AT_ONCE = 3 |
Number of DNS seeds to query when the number of connections is low. More... | |
static constexpr std::chrono::seconds | DNSSEEDS_DELAY_FEW_PEERS {11} |
How long to delay before querying DNS seeds. More... | |
static constexpr std::chrono::minutes | DNSSEEDS_DELAY_MANY_PEERS {5} |
static constexpr int | DNSSEEDS_DELAY_PEER_THRESHOLD = 1000 |
static constexpr std::chrono::seconds | MAX_UPLOAD_TIMEFRAME {60 * 60 * 24} |
The default timeframe for -maxuploadtarget. More... | |
static const uint64_t | SELECT_TIMEOUT_MILLISECONDS = 50 |
const std::string | NET_MESSAGE_COMMAND_OTHER = "*other*" |
static const uint64_t | RANDOMIZER_ID_NETGROUP = 0x6c0edd8036ef4036ULL |
static const uint64_t | RANDOMIZER_ID_LOCALHOSTNONCE = 0xd93e69e2bbfa5735ULL |
static const uint64_t | RANDOMIZER_ID_EXTRAENTROPY = 0x94b05d41679a4ff7ULL |
static const uint64_t | RANDOMIZER_ID_ADDRCACHE = 0x1cf2e4ddd306dda9ULL |
bool | fDiscover = true |
bool | fListen = true |
GlobalMutex | g_maplocalhost_mutex |
static CNetCleanup | instance_of_cnetcleanup |
std::function< void(const CAddress &addr, const std::string &msg_type, Span< const uint8_t > data, bool is_incoming)> | CaptureMessage = CaptureMessageToFile |
Defaults to CaptureMessageToFile() , but can be overridden by unit tests. More... | |
enum BindFlags |
Used to pass flags to the Bind() function.
Enumerator | |
---|---|
BF_NONE | |
BF_EXPLICIT | |
BF_REPORT_ERROR | |
BF_DONT_ADVERTISE | Do not call AddLocal() for our special addresses, e.g., for incoming Tor connections, to prevent gossiping them over the network. |
bool AddLocal | ( | const CNetAddr & | addr, |
int | nScore | ||
) |
bool AddLocal | ( | const CService & | addr, |
int | nScore | ||
) |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
std::string ConnectionTypeAsString | ( | ConnectionType | conn_type | ) |
void Discover | ( | ) |
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses to self-advertise.
The loopback interface is skipped and only the first address from each interface is used.
Definition at line 2642 of file net.cpp.
|
static |
uint16_t GetListenPort | ( | ) |
|
static |
std::string getSubVersionEB | ( | uint64_t | MaxBlockSize | ) |
This function convert MaxBlockSize from byte to MB with a decimal precision one digit rounded down E.g.
1660000 -> 1.6 2010000 -> 2.0 1000000 -> 1.0 230000 -> 0.2 50000 -> 0.0
NB behavior for EB<1MB not standardized yet still the function applies the same algo used for EB greater or equal to 1MB
Definition at line 3441 of file net.cpp.
std::map< CNetAddr, LocalServiceInfo > mapLocalHost GUARDED_BY | ( | g_maplocalhost_mutex | ) |
bool IsLocal | ( | const CService & | addr | ) |
bool IsPeerAddrLocalGood | ( | CNode * | pnode | ) |
bool IsReachable | ( | const CNetAddr & | addr | ) |
bool IsReachable | ( | enum Network | net | ) |
void ProtectEvictionCandidatesByRatio | ( | std::vector< NodeEvictionCandidate > & | vEvictionCandidates | ) |
Protect desirable or disadvantaged inbound peers from eviction by ratio.
This function protects half of the peers which have been connected the longest, to replicate the non-eviction implicit behavior and preclude attacks that start later.
Half of these protected spots (1/4 of the total) are reserved for the following categories of peers, sorted by longest uptime, even if they're not longest uptime overall:
-bind=addr[:port]=onion
will not be detected as inbound onion connectionsThis helps protect these privacy network peers, which tend to be otherwise disadvantaged under our eviction criteria for their higher min ping times relative to IPv4/IPv6 peers, and favorise the diversity of peer connections.
Definition at line 1042 of file net.cpp.
void RemoveLocal | ( | const CService & | addr | ) |
|
static |
|
static |
bool SeenLocal | ( | const CService & | addr | ) |
std::optional< NodeId > SelectNodeToEvict | ( | std::vector< NodeEvictionCandidate > && | vEvictionCandidates | ) |
Select an inbound peer to evict after filtering out (protecting) peers having distinct, difficult-to-forge characteristics.
The protection logic picks out fixed numbers of desirable peers per various criteria, followed by (mostly) ratios of desirable or disadvantaged peers. If any eviction candidates remain, the selection logic chooses a peer to evict.
Definition at line 1137 of file net.cpp.
void SetReachable | ( | enum Network | net, |
bool | reachable | ||
) |
std::string userAgent | ( | const Config & | config | ) |
const char* const ANCHORS_DATABASE_FILENAME = "anchors.dat" |
std::function<void(const CAddress &addr, const std::string &msg_type, Span<const uint8_t> data, bool is_incoming)> CaptureMessage = CaptureMessageToFile |
Defaults to CaptureMessageToFile()
, but can be overridden by unit tests.
|
staticconstexpr |
How long to delay before querying DNS seeds.
If we have more than THRESHOLD entries in addrman, then it's likely that we got those addresses from having previously connected to the P2P network, and that we'll be able to successfully reconnect to the P2P network via contacting one of them. So if that's the case, spend a little longer trying to connect to known peers before querying the DNS seeds.
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
GlobalMutex g_maplocalhost_mutex |
|
static |
|
staticconstexpr |
|
staticconstexpr |
|
static |
|
static |
|
static |
|
static |