Bitcoin ABC 0.26.3
P2P Digital Currency
Loading...
Searching...
No Matches
Classes | Typedefs | Enumerations | Functions | Variables
net.h File Reference
#include <avalanche/proofid.h>
#include <avalanche/proofradixtreeadapter.h>
#include <chainparams.h>
#include <common/bloom.h>
#include <compat.h>
#include <consensus/amount.h>
#include <crypto/siphash.h>
#include <hash.h>
#include <i2p.h>
#include <kernel/cs_main.h>
#include <logging.h>
#include <net_permissions.h>
#include <netaddress.h>
#include <netbase.h>
#include <nodeid.h>
#include <protocol.h>
#include <pubkey.h>
#include <radix.h>
#include <random.h>
#include <span.h>
#include <streams.h>
#include <sync.h>
#include <threadinterrupt.h>
#include <uint256.h>
#include <util/check.h>
#include <util/sock.h>
#include <util/time.h>
#include <atomic>
#include <condition_variable>
#include <cstdint>
#include <deque>
#include <functional>
#include <list>
#include <map>
#include <memory>
#include <thread>
#include <vector>
Include dependency graph for net.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  AddedNodeInfo
 
struct  CSerializedNetMsg
 
struct  LocalServiceInfo
 
struct  CNodeStats
 POD that contains various stats about a node. More...
 
class  CNetMessage
 Transport protocol agnostic message container. More...
 
class  TransportDeserializer
 The TransportDeserializer takes care of holding and deserializing the network receive buffer. More...
 
class  V1TransportDeserializer
 
class  TransportSerializer
 The TransportSerializer prepares messages for the network transport. More...
 
class  V1TransportSerializer
 
struct  CNodeOptions
 
class  CNode
 Information about a peer. More...
 
class  NetEventsInterface
 Interface for message handling. More...
 
class  CConnman
 
struct  CConnman::Options
 
struct  CConnman::ListenSocket
 
struct  CConnman::CachedAddrResponse
 Cache responses to addr requests to minimize privacy leak. More...
 
class  CConnman::NodesSnapshot
 RAII helper to atomically create a copy of m_nodes and add a reference to each of the nodes. More...
 
struct  NodeEvictionCandidate
 

Typedefs

typedef std::map< std::string, uint64_tmapMsgCmdSize
 

Enumerations

enum class  ConnectionType {
  INBOUND , OUTBOUND_FULL_RELAY , MANUAL , FEELER ,
  BLOCK_RELAY , ADDR_FETCH , AVALANCHE_OUTBOUND
}
 Different types of connections to a peer. More...
 
enum  {
  LOCAL_NONE , LOCAL_IF , LOCAL_BIND , LOCAL_MAPPED ,
  LOCAL_MANUAL , LOCAL_MAX
}
 

Functions

std::string ConnectionTypeAsString (ConnectionType conn_type)
 Convert ConnectionType enum to a string value.
 
void Discover ()
 Look up IP addresses from all interfaces on the machine and add them to the list of local addresses to self-advertise.
 
uint16_t GetListenPort ()
 
bool IsPeerAddrLocalGood (CNode *pnode)
 
std::optional< CServiceGetLocalAddrForPeer (CNode &node)
 Returns a local address that we should advertise to this peer.
 
void SetReachable (enum Network net, bool reachable)
 Mark a network as reachable or unreachable (no automatic connects to it)
 
bool IsReachable (enum Network net)
 
bool IsReachable (const CNetAddr &addr)
 
bool AddLocal (const CService &addr, int nScore=LOCAL_NONE)
 
bool AddLocal (const CNetAddr &addr, int nScore=LOCAL_NONE)
 
void RemoveLocal (const CService &addr)
 
bool SeenLocal (const CService &addr)
 vote for a local address
 
bool IsLocal (const CService &addr)
 check whether a given address is potentially local
 
bool GetLocal (CService &addr, const CNetAddr *paddrPeer=nullptr)
 
CService GetLocalAddress (const CNetAddr &addrPeer)
 
std::map< CNetAddr, LocalServiceInfo > mapLocalHost GUARDED_BY (g_maplocalhost_mutex)
 
std::string getSubVersionEB (uint64_t MaxBlockSize)
 This function convert MaxBlockSize from byte to MB with a decimal precision one digit rounded down E.g.
 
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.
 
std::optional< NodeIdSelectNodeToEvict (std::vector< NodeEvictionCandidate > &&vEvictionCandidates)
 Select an inbound peer to evict after filtering out (protecting) peers having distinct, difficult-to-forge characteristics.
 
void ProtectEvictionCandidatesByRatio (std::vector< NodeEvictionCandidate > &vEvictionCandidates)
 Protect desirable or disadvantaged inbound peers from eviction by ratio.
 

Variables

static constexpr std::chrono::minutes TIMEOUT_INTERVAL {20}
 Time after which to disconnect, after waiting for a ping response (or inactivity).
 
static constexpr auto FEELER_INTERVAL = 2min
 Run the feeler connection loop once every 2 minutes.
 
static constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL = 5min
 Run the extra block-relay-only connection loop once every 5 minutes.
 
static const unsigned int MAX_SUBVERSION_LENGTH = 256
 Maximum length of the user agent string in version message.
 
static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS = 16
 Maximum number of automatic outgoing nodes over which we'll relay everything (blocks, tx, addrs, etc)
 
static const int MAX_ADDNODE_CONNECTIONS = 8
 Maximum number of addnode outgoing nodes.
 
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS = 2
 Maximum number of block-relay-only outgoing connections.
 
static const int DEFAULT_MAX_AVALANCHE_OUTBOUND_CONNECTIONS = 300
 Maximum number of avalanche enabled outgoing connections by default.
 
static const int MAX_FEELER_CONNECTIONS = 1
 Maximum number of feeler connections.
 
static const bool DEFAULT_LISTEN = true
 -listen default
 
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 4096
 The maximum number of peer connections to maintain.
 
static constexpr uint64_t DEFAULT_MAX_UPLOAD_TARGET = 0
 The default for -maxuploadtarget.
 
static const bool DEFAULT_BLOCKSONLY = false
 Default for blocks only.
 
static const int64_t DEFAULT_PEER_CONNECT_TIMEOUT = 60
 -peertimeout default
 
static const int NUM_FDS_MESSAGE_CAPTURE = 1
 Number of file descriptors required for message capture.
 
static const bool DEFAULT_FORCEDNSSEED = false
 
static const bool DEFAULT_DNSSEED = true
 
static const bool DEFAULT_FIXEDSEEDS = true
 
static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000
 
static const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000
 
const std::vector< std::string > CONNECTION_TYPE_DOC
 
bool fDiscover
 
bool fListen
 
GlobalMutex g_maplocalhost_mutex
 
const std::string NET_MESSAGE_COMMAND_OTHER
 
std::function< void(const CAddress &addr, const std::string &msg_type, Span< const uint8_t > data, bool is_incoming)> CaptureMessage
 Defaults to CaptureMessageToFile(), but can be overridden by unit tests.
 

Typedef Documentation

◆ mapMsgCmdSize

Definition at line 280 of file net.h.

Enumeration Type Documentation

◆ anonymous enum

Enumerator
LOCAL_NONE 
LOCAL_IF 
LOCAL_BIND 
LOCAL_MAPPED 
LOCAL_MANUAL 
LOCAL_MAX 

Definition at line 229 of file net.h.

◆ ConnectionType

Different types of connections to a peer.

This enum encapsulates the information we have available at the time of opening or accepting the connection. Aside from INBOUND, all types are initiated by us.

Enumerator
INBOUND 

Inbound connections are those initiated by a peer.

This is the only property we know at the time of connection, until P2P messages are exchanged.

OUTBOUND_FULL_RELAY 

These are the default connections that we use to connect with the network.

There is no restriction on what is relayed- by default we relay blocks, addresses & transactions. We automatically attempt to open MAX_OUTBOUND_FULL_RELAY_CONNECTIONS using addresses from our AddrMan.

MANUAL 

We open manual connections to addresses that users explicitly inputted via the addnode RPC, or the -connect command line argument.

Even if a manual connection is misbehaving, we do not automatically disconnect or add it to our discouragement filter.

FEELER 

Feeler connections are short-lived connections made to check that a node is alive.

They can be useful for:

  • test-before-evict: if one of the peers is considered for eviction from our AddrMan because another peer is mapped to the same slot in the tried table, evict only if this longer-known peer is offline.
  • move node addresses from New to Tried table, so that we have more connectable addresses in our AddrMan. Note that in the literature ("Eclipse Attacks on Bitcoin’s Peer-to-Peer Network") only the latter feature is referred to as "feeler connections", although in our codebase feeler connections encompass test-before-evict as well. We make these connections approximately every FEELER_INTERVAL: first we resolve previously found collisions if they exist (test-before-evict), otherwise connect to a node from the new table.
BLOCK_RELAY 

We use block-relay-only connections to help prevent against partition attacks.

By not relaying transactions or addresses, these connections are harder to detect by a third party, thus helping obfuscate the network topology. We automatically attempt to open MAX_BLOCK_RELAY_ONLY_ANCHORS using addresses from our anchors.dat. Then addresses from our AddrMan if MAX_BLOCK_RELAY_ONLY_CONNECTIONS isn't reached yet.

ADDR_FETCH 

AddrFetch connections are short lived connections used to solicit addresses from peers.

These are initiated to addresses submitted via the -seednode command line argument, or under certain conditions when the AddrMan is empty.

AVALANCHE_OUTBOUND 

Special case of connection to a full relay outbound with avalanche service enabled.

Definition at line 148 of file net.h.

Function Documentation

◆ AddLocal() [1/2]

bool AddLocal ( const CNetAddr addr,
int  nScore = LOCAL_NONE 
)

Definition at line 307 of file net.cpp.

Here is the call graph for this function:

◆ AddLocal() [2/2]

bool AddLocal ( const CService addr,
int  nScore = LOCAL_NONE 
)

Definition at line 278 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CaptureMessageToFile()

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.

Definition at line 3451 of file net.cpp.

Here is the call graph for this function:

◆ ConnectionTypeAsString()

std::string ConnectionTypeAsString ( ConnectionType  conn_type)

Convert ConnectionType enum to a string value.

Definition at line 599 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Discover()

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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetListenPort()

uint16_t GetListenPort ( )

Definition at line 137 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLocal()

bool GetLocal ( CService addr,
const CNetAddr paddrPeer = nullptr 
)

Definition at line 173 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLocalAddress()

CService GetLocalAddress ( const CNetAddr addrPeer)

Definition at line 221 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetLocalAddrForPeer()

std::optional< CService > GetLocalAddrForPeer ( CNode node)

Returns a local address that we should advertise to this peer.

Definition at line 243 of file net.cpp.

Here is the call graph for this function:

◆ getSubVersionEB()

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 3417 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GUARDED_BY()

◆ IsLocal()

bool IsLocal ( const CService addr)

check whether a given address is potentially local

Definition at line 346 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsPeerAddrLocalGood()

bool IsPeerAddrLocalGood ( CNode pnode)

Definition at line 237 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsReachable() [1/2]

bool IsReachable ( const CNetAddr addr)
Returns
true if the address is in a reachable network, false otherwise

Definition at line 330 of file net.cpp.

Here is the call graph for this function:

◆ IsReachable() [2/2]

bool IsReachable ( enum Network  net)
Returns
true if the network is reachable, false otherwise

Definition at line 325 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ProtectEvictionCandidatesByRatio()

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:

  • onion peers connected via our tor control service
  • localhost peers, as manually configured hidden services not using -bind=addr[:port]=onion will not be detected as inbound onion connections
  • I2P peers

This 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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RemoveLocal()

void RemoveLocal ( const CService addr)

Definition at line 311 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SeenLocal()

bool SeenLocal ( const CService addr)

vote for a local address

Definition at line 335 of file net.cpp.

Here is the call graph for this function:

◆ SelectNodeToEvict()

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.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ SetReachable()

void SetReachable ( enum Network  net,
bool  reachable 
)

Mark a network as reachable or unreachable (no automatic connects to it)

Note
Networks are reachable by default

Definition at line 317 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ userAgent()

std::string userAgent ( const Config config)

Definition at line 3431 of file net.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ CaptureMessage

std::function<void(const CAddress &addr, const std::string &msg_type, Span<const uint8_t> data, bool is_incoming)> CaptureMessage
extern

Defaults to CaptureMessageToFile(), but can be overridden by unit tests.

Definition at line 3482 of file net.cpp.

◆ CONNECTION_TYPE_DOC

const std::vector<std::string> CONNECTION_TYPE_DOC
Initial value:
{
"outbound-full-relay (default automatic connections)",
"block-relay-only (does not relay transactions or addresses)",
"inbound (initiated by the peer)",
"manual (added via addnode RPC or -addnode/-connect configuration options)",
"addr-fetch (short-lived automatic connection for soliciting addresses)",
"feeler (short-lived automatic connection for testing addresses)"}

Definition at line 135 of file net.h.

◆ DEFAULT_BLOCKSONLY

const bool DEFAULT_BLOCKSONLY = false
static

Default for blocks only.

Definition at line 94 of file net.h.

◆ DEFAULT_DNSSEED

const bool DEFAULT_DNSSEED = true
static

Definition at line 101 of file net.h.

◆ DEFAULT_FIXEDSEEDS

const bool DEFAULT_FIXEDSEEDS = true
static

Definition at line 102 of file net.h.

◆ DEFAULT_FORCEDNSSEED

const bool DEFAULT_FORCEDNSSEED = false
static

Definition at line 100 of file net.h.

◆ DEFAULT_LISTEN

const bool DEFAULT_LISTEN = true
static

-listen default

Definition at line 84 of file net.h.

◆ DEFAULT_MAX_AVALANCHE_OUTBOUND_CONNECTIONS

const int DEFAULT_MAX_AVALANCHE_OUTBOUND_CONNECTIONS = 300
static

Maximum number of avalanche enabled outgoing connections by default.

Can be overridden with the -maxavalancheoutbound option.

Definition at line 80 of file net.h.

◆ DEFAULT_MAX_PEER_CONNECTIONS

const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 4096
static

The maximum number of peer connections to maintain.

This quantity might not be reachable on some systems, especially on platforms that do not provide a working poll() interface.

Definition at line 90 of file net.h.

◆ DEFAULT_MAX_UPLOAD_TARGET

constexpr uint64_t DEFAULT_MAX_UPLOAD_TARGET = 0
staticconstexpr

The default for -maxuploadtarget.

0 = Unlimited

Definition at line 92 of file net.h.

◆ DEFAULT_MAXRECEIVEBUFFER

const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000
static

Definition at line 103 of file net.h.

◆ DEFAULT_MAXSENDBUFFER

const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000
static

Definition at line 104 of file net.h.

◆ DEFAULT_PEER_CONNECT_TIMEOUT

const int64_t DEFAULT_PEER_CONNECT_TIMEOUT = 60
static

-peertimeout default

Definition at line 96 of file net.h.

◆ EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL

constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL = 5min
staticconstexpr

Run the extra block-relay-only connection loop once every 5 minutes.

Definition at line 64 of file net.h.

◆ fDiscover

bool fDiscover
extern

Definition at line 125 of file net.cpp.

◆ FEELER_INTERVAL

constexpr auto FEELER_INTERVAL = 2min
staticconstexpr

Run the feeler connection loop once every 2 minutes.

Definition at line 62 of file net.h.

◆ fListen

bool fListen
extern

Definition at line 126 of file net.cpp.

◆ g_maplocalhost_mutex

GlobalMutex g_maplocalhost_mutex
extern

Definition at line 127 of file net.cpp.

◆ MAX_ADDNODE_CONNECTIONS

const int MAX_ADDNODE_CONNECTIONS = 8
static

Maximum number of addnode outgoing nodes.

Definition at line 73 of file net.h.

◆ MAX_BLOCK_RELAY_ONLY_CONNECTIONS

const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS = 2
static

Maximum number of block-relay-only outgoing connections.

Definition at line 75 of file net.h.

◆ MAX_FEELER_CONNECTIONS

const int MAX_FEELER_CONNECTIONS = 1
static

Maximum number of feeler connections.

Definition at line 82 of file net.h.

◆ MAX_OUTBOUND_FULL_RELAY_CONNECTIONS

const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS = 16
static

Maximum number of automatic outgoing nodes over which we'll relay everything (blocks, tx, addrs, etc)

Definition at line 71 of file net.h.

◆ MAX_SUBVERSION_LENGTH

const unsigned int MAX_SUBVERSION_LENGTH = 256
static

Maximum length of the user agent string in version message.

Definition at line 66 of file net.h.

◆ NET_MESSAGE_COMMAND_OTHER

const std::string NET_MESSAGE_COMMAND_OTHER
extern

Definition at line 112 of file net.cpp.

◆ NUM_FDS_MESSAGE_CAPTURE

const int NUM_FDS_MESSAGE_CAPTURE = 1
static

Number of file descriptors required for message capture.

Definition at line 98 of file net.h.

◆ TIMEOUT_INTERVAL

constexpr std::chrono::minutes TIMEOUT_INTERVAL {20}
staticconstexpr

Time after which to disconnect, after waiting for a ping response (or inactivity).

Definition at line 60 of file net.h.