34#include <util/threadinterrupt.h>
37#include <condition_variable>
48#include <unordered_set>
136 std::vector<unsigned char>
data;
241 std::chrono::microseconds m_time{0};
242 uint32_t m_message_size{0};
243 uint32_t m_raw_message_size{0};
278 virtual
bool ReceivedMessageComplete() const = 0;
286 virtual
bool ReceivedBytes(
std::span<const uint8_t>& msg_bytes) = 0;
295 virtual
CNetMessage GetReceivedMessage(
std::chrono::microseconds time,
bool& reject_message) = 0;
315 std::span<const uint8_t> ,
355 virtual
BytesToSend GetBytesToSend(
bool have_next_message) const noexcept = 0;
363 virtual
void MarkBytesSent(
size_t bytes_sent) noexcept = 0;
366 virtual
size_t GetSendMemoryUsage() const noexcept = 0;
371 virtual
bool ShouldReconnectV1() const noexcept = 0;
408 if (!in_data)
return false;
409 return hdr.nMessageSize == nDataPos;
415 std::vector<uint8_t> m_header_to_send
GUARDED_BY(m_send_mutex);
429 return WITH_LOCK(m_recv_mutex,
return CompleteInternal());
432 Info GetInfo() const noexcept override;
438 int ret = in_data ? readData(msg_bytes) : readHeader(msg_bytes);
442 msg_bytes = msg_bytes.subspan(
ret);
453 bool ShouldReconnectV1() const noexcept
override {
return false; }
462 static constexpr std::array<std::byte, 0> VERSION_CONTENTS = {};
466 static constexpr size_t V1_PREFIX_LEN = 16;
601 std::vector<uint8_t> m_recv_decode_buffer
GUARDED_BY(m_recv_mutex);
613 std::vector<uint8_t> m_send_garbage
GUARDED_BY(m_send_mutex);
619 bool m_sent_v1_header_worth
GUARDED_BY(m_send_mutex) {
false};
626 static std::optional<std::string> GetMessageType(std::span<const uint8_t>& contents)
noexcept;
641 static constexpr uint32_t MAX_GARBAGE_LEN = 4095;
672 std::unique_ptr<i2p::sam::Session> i2p_sam_session =
nullptr;
673 bool prefer_evict =
false;
675 bool use_v2transport =
false;
710 std::atomic<std::chrono::seconds> m_last_send{0
s};
711 std::atomic<std::chrono::seconds> m_last_recv{0
s};
723 std::atomic<int> nVersion{0};
730 const bool m_prefer_evict{
false};
735 std::atomic_bool fSuccessfullyConnected{
false};
738 std::atomic_bool fDisconnect{
false};
740 std::atomic<int> nRefCount{0};
743 std::atomic_bool fPauseRecv{
false};
744 std::atomic_bool fPauseSend{
false};
753 void MarkReceivedMsgsForProcessing()
765 void AccountForSentBytes(const
std::
string& msg_type,
size_t sent_bytes)
768 mapSendBytesPerMsgType[msg_type] += sent_bytes;
772 switch (m_conn_type) {
797 switch (m_conn_type) {
834 switch (m_conn_type) {
859 Network ConnectedThroughNetwork()
const;
862 [[nodiscard]]
bool IsConnectedThroughPrivacyNet()
const;
865 std::atomic<bool> m_bip152_highbandwidth_to{
false};
867 std::atomic<bool> m_bip152_highbandwidth_from{
false};
870 std::atomic_bool m_has_all_wanted_services{
false};
874 std::atomic_bool m_relays_txs{
false};
878 std::atomic_bool m_bloom_filter_loaded{
false};
885 std::atomic<std::chrono::seconds> m_last_block_time{0
s};
891 std::atomic<std::chrono::seconds> m_last_tx_time{0
s};
894 std::atomic<std::chrono::microseconds> m_last_ping_time{0us};
898 std::atomic<std::chrono::microseconds> m_min_ping_time{std::chrono::microseconds::max()};
901 std::shared_ptr<Sock> sock,
903 uint64_t nKeyedNetGroupIn,
904 uint64_t nLocalHostNonceIn,
906 const std::string& addrNameIn,
909 uint64_t network_key,
919 return nLocalHostNonce;
942 m_greatest_common_version = greatest_common_version;
946 return m_greatest_common_version;
976 std::string LogIP(
bool log_ip)
const;
984 std::string DisconnectMsg(
bool log_ip)
const;
988 m_last_ping_time = ping_time;
989 m_min_ping_time = std::min(m_min_ping_time.load(), ping_time);
1001 std::list<CNetMessage> m_msg_process_queue
GUARDED_BY(m_msg_process_queue_mutex);
1002 size_t m_msg_process_queue_size
GUARDED_BY(m_msg_process_queue_mutex){0};
1021 std::unique_ptr<i2p::sam::Session> m_i2p_sam_session
GUARDED_BY(m_sock_mutex);
1078 int m_max_automatic_connections = 0;
1082 unsigned int nSendBufferMaxSize = 0;
1083 unsigned int nReceiveFloodSize = 0;
1084 uint64_t nMaxOutboundLimit = 0;
1095 bool m_use_addrman_outgoing =
true;
1101 bool m_capture_messages =
false;
1108 m_local_services = connOptions.m_local_services;
1109 m_max_automatic_connections = connOptions.m_max_automatic_connections;
1112 m_max_automatic_outbound = m_max_outbound_full_relay + m_max_outbound_block_relay + m_max_feeler;
1113 m_max_inbound = std::max(0, m_max_automatic_connections - m_max_automatic_outbound);
1114 m_use_addrman_outgoing = connOptions.m_use_addrman_outgoing;
1115 m_client_interface = connOptions.uiInterface;
1116 m_banman = connOptions.m_banman;
1117 m_msgproc = connOptions.m_msgproc;
1118 nSendBufferMaxSize = connOptions.nSendBufferMaxSize;
1119 nReceiveFloodSize = connOptions.nReceiveFloodSize;
1120 m_peer_connect_timeout = std::chrono::seconds{connOptions.m_peer_connect_timeout};
1122 LOCK(m_total_bytes_sent_mutex);
1123 nMaxOutboundLimit = connOptions.nMaxOutboundLimit;
1125 vWhitelistedRangeIncoming = connOptions.vWhitelistedRangeIncoming;
1126 vWhitelistedRangeOutgoing = connOptions.vWhitelistedRangeOutgoing;
1128 LOCK(m_added_nodes_mutex);
1132 for (
const std::string& added_node : connOptions.m_added_nodes) {
1133 m_added_node_params.push_back({added_node, use_v2transport});
1136 m_onion_binds = connOptions.onion_binds;
1137 whitelist_forcerelay = connOptions.whitelist_forcerelay;
1138 whitelist_relay = connOptions.whitelist_relay;
1139 m_capture_messages = connOptions.m_capture_messages;
1150 bool network_active =
true,
1151 std::shared_ptr<CThreadInterrupt> interrupt_net = std::make_shared<CThreadInterrupt>());
1167 bool GetNetworkActive()
const {
return fNetworkActive; };
1169 void SetNetworkActive(
bool active);
1183 bool OpenNetworkConnection(
const CAddress& addrConnect,
1186 const char* pszDest,
1188 bool use_v2transport,
1189 const std::optional<Proxy>& proxy_override = std::nullopt)
1204 std::atomic_bool m_outbound_tor_ok_at_least_once{
false};
1221 std::optional<Network> PickNetwork(std::optional<Proxy>& proxy)
const;
1224 size_t NumToOpen()
const;
1231 void NumToOpenAdd(
size_t n);
1239 size_t NumToOpenSub(
size_t n);
1242 void NumToOpenWait()
const;
1250 std::optional<Proxy> ProxyForIPv4or6()
const;
1253 std::atomic_size_t m_num_to_open{0};
1272 for (
auto&&
node : m_nodes) {
1281 for (
auto&&
node : m_nodes) {
1299 std::vector<CAddress>
GetAddressesUnsafe(
size_t max_addresses,
size_t max_pct, std::optional<Network> network,
bool filtered =
true)
const;
1314 std::vector<CAddress>
GetAddresses(
CNode& requestor,
size_t max_addresses,
size_t max_pct);
1358 void GetNodeStats(std::vector<CNodeStats>& vstats)
const;
1410 : sock{sock_}, m_permissions{permissions_}
1471 const
Sock::EventsPerSock& events_per_sock)
1521 const
char* pszDest,
1525 const
std::optional<
Proxy>& proxy_override)
1623 std::chrono::microseconds m_cache_entry_expiration{0};
1702 std::atomic<bool> flagInterruptMsgProc{
false};
1734 std::atomic_bool m_start_extra_block_relay_peers{
false};
1757 bool m_capture_messages{
false};
1771 std::queue<std::unique_ptr<i2p::sam::Session>> m_unused_i2p_sessions
GUARDED_BY(m_unused_i2p_sessions_mutex);
1791 std::list<ReconnectionInfo> m_reconnections
GUARDED_BY(m_reconnections_mutex);
1800 static constexpr
size_t MAX_UNUSED_I2P_SESSIONS_SIZE{10};
1813 m_nodes_copy = connman.m_nodes;
1814 for (
auto&
node : m_nodes_copy) {
1825 for (
auto&
node : m_nodes_copy) {
1830 const std::vector<CNode*>&
Nodes()
const
1832 return m_nodes_copy;
1845extern std::function<void(
const CAddress& addr,
1846 const std::string& msg_type,
1847 std::span<const unsigned char>
data,
#define Assume(val)
Assume is the identity function.
Stochastic address manager.
The BIP324 packet cipher, encapsulating its key derivation, stream cipher, and AEAD.
A CService with information about it as peer.
CChainParams defines various tweakable parameters of a given instance of the Bitcoin system.
Signals for UI communication.
RAII helper to atomically create a copy of m_nodes and add a reference to each of the nodes.
const std::vector< CNode * > & Nodes() const
NodesSnapshot(const CConnman &connman, bool shuffle)
std::vector< CNode * > m_nodes_copy
Group of private broadcast related members.
bool whitelist_relay
flag for adding 'relay' permission to whitelisted inbound and manual peers with default permissions.
std::unordered_set< Network > GetReachableEmptyNetworks() const
Return reachable networks for which we have no addresses in addrman and therefore may require loading...
std::condition_variable condMsgProc
std::thread threadMessageHandler
void RemoveLocalServices(ServiceFlags services)
bool AlreadyConnectedToHost(std::string_view host) const
Determine whether we're already connected to a given "host:port".
std::vector< NetWhitelistPermissions > vWhitelistedRangeIncoming
CClientUIInterface * m_client_interface
std::reference_wrapper< AddrMan > addrman
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc)
void ForEachNode(const NodeFn &func) const
bool ForNode(NodeId id, std::function< bool(CNode *pnode)> func)
void DisconnectNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex
void DeleteNode(CNode *pnode)
bool AttemptToEvictConnection()
Try to find a connection to evict when the node is full.
bool ShouldRunInactivityChecks(const CNode &node, std::chrono::microseconds now) const
Return true if we should disconnect the peer for failing an inactivity check.
bool GetTryNewOutboundPeer() const
std::vector< AddedNodeParams > m_added_node_params GUARDED_BY(m_added_nodes_mutex)
const bool use_v2transport(GetLocalServices() &NODE_P2P_V2)
class CConnman::PrivateBroadcast m_private_broadcast
uint16_t GetDefaultPort(Network net) const
int m_max_outbound_block_relay
std::array< unsigned int, Network::NET_MAX > m_network_conn_counts GUARDED_BY(m_nodes_mutex)
void SetCaptureMessages(bool cap)
std::thread threadI2PAcceptIncoming
std::vector< CAddress > GetAddresses(CNode &requestor, size_t max_addresses, size_t max_pct)
Return addresses from the per-requestor cache.
void SetTryNewOutboundPeer(bool flag)
CNode * ConnectNode(CAddress addrConnect, const char *pszDest, bool fCountFailure, ConnectionType conn_type, bool use_v2transport, const std::optional< Proxy > &proxy_override) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex)
Open a new P2P connection.
void CreateNodeFromAcceptedSocket(std::unique_ptr< Sock > &&sock, NetPermissionFlags permission_flags, const CService &addr_bind, const CService &addr)
Create a CNode object from a socket that has just been accepted and add the node to the m_nodes membe...
std::list< ReconnectionInfo > m_reconnections GUARDED_BY(m_reconnections_mutex)
List of reconnections we have to make.
int m_max_automatic_outbound
std::map< CNetAddr, LocalServiceInfo > getNetLocalAddresses() const
void ThreadDNSAddressSeed() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
int GetFullOutboundConnCount() const
uint64_t nMaxOutboundLimit GUARDED_BY(m_total_bytes_sent_mutex)
std::atomic< NodeId > nLastNodeId
bool fMsgProcWake GUARDED_BY(mutexMsgProc)
flag for waking the message processor.
int m_max_automatic_connections
Maximum number of automatic connections permitted, excluding manual connections but including inbound...
int GetExtraBlockRelayCount() const
void WakeMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!mutexMsgProc)
BanMan * m_banman
Pointer to this node's banman.
bool OutboundTargetReached(bool historicalBlockServingLimit) const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
check if the outbound target is reached if param historicalBlockServingLimit is set true,...
uint64_t nMaxOutboundTotalBytesSentInCycle GUARDED_BY(m_total_bytes_sent_mutex)
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
std::thread threadDNSAddressSeed
void SocketHandlerConnected(const std::vector< CNode * > &nodes, const Sock::EventsPerSock &events_per_sock) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
Do the read/write for connected sockets that are ready for IO.
void ThreadI2PAcceptIncoming()
void StartExtraBlockRelayPeers()
const NetGroupManager & m_netgroupman
bool DisconnectNode(std::string_view node)
std::vector< CAddress > m_anchors
Addresses that were saved during the previous clean shutdown.
std::chrono::seconds GetMaxOutboundTimeframe() const
uint64_t CalculateKeyedNetGroup(const CNetAddr &ad) const
bool whitelist_forcerelay
flag for adding 'forcerelay' permission to whitelisted inbound and manual peers with default permissi...
unsigned int nPrevNodeCount
void AddWhitelistPermissionFlags(NetPermissionFlags &flags, std::optional< CNetAddr > addr, const std::vector< NetWhitelistPermissions > &ranges) const
void NotifyNumConnectionsChanged()
ServiceFlags GetLocalServices() const
Used to convey which local services we are offering peers during node connection.
bool AddNode(const AddedNodeParams &add) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
std::chrono::seconds m_peer_connect_timeout
std::atomic_bool m_try_another_outbound_peer
flag for deciding to connect to an extra outbound peer, in excess of m_max_outbound_full_relay This t...
bool InitBinds(const Options &options)
void AddAddrFetch(const std::string &strDest) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex)
std::vector< ListenSocket > vhListenSocket
bool AlreadyConnectedToAddress(const CNetAddr &addr) const
Determine whether we're already connected to a given address.
std::vector< CAddress > GetCurrentBlockRelayOnlyConns() const
Return vector of current BLOCK_RELAY peers.
CSipHasher GetDeterministicRandomizer(uint64_t id) const
Get a unique deterministic randomizer.
bool AddConnection(const std::string &address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex)
Attempts to open a connection.
Mutex m_total_bytes_sent_mutex
std::vector< AddedNodeInfo > GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
bool Bind(const CService &addr, unsigned int flags, NetPermissionFlags permissions)
std::thread threadOpenConnections
size_t GetNodeCount(ConnectionDirection) const
std::atomic< ServiceFlags > m_local_services
Services this node offers.
uint32_t GetMappedAS(const CNetAddr &addr) const
void ProcessAddrFetch() EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
Mutex m_addr_fetches_mutex
Mutex m_reconnections_mutex
Mutex protecting m_reconnections.
void GetNodeStats(std::vector< CNodeStats > &vstats) const
const uint64_t nSeed0
SipHasher seeds for deterministic randomness.
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
Check connected and listening sockets for IO readiness and process them accordingly.
int GetExtraFullOutboundCount() const
std::chrono::seconds GetMaxOutboundTimeLeftInCycle_() const EXCLUSIVE_LOCKS_REQUIRED(m_total_bytes_sent_mutex)
returns the time left in the current max outbound cycle in case of no limit, it will always return 0
uint64_t GetTotalBytesRecv() const
std::pair< size_t, bool > SocketSendData(CNode &node) const EXCLUSIVE_LOCKS_REQUIRED(node.cs_vSend)
(Try to) send data from node's vSendMsg.
RecursiveMutex m_nodes_mutex
std::queue< std::unique_ptr< i2p::sam::Session > > m_unused_i2p_sessions GUARDED_BY(m_unused_i2p_sessions_mutex)
A pool of created I2P SAM transient sessions that should be used instead of creating new ones in orde...
static bool NodeFullyConnected(const CNode *pnode)
std::unique_ptr< std::counting_semaphore<> > semOutbound
const CChainParams & m_params
bool MultipleManualOrFullOutboundConns(Network net) const EXCLUSIVE_LOCKS_REQUIRED(m_nodes_mutex)
bool AddedNodesContain(const CAddress &addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
std::deque< std::string > m_addr_fetches GUARDED_BY(m_addr_fetches_mutex)
std::chrono::seconds GetMaxOutboundTimeLeftInCycle() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
const std::shared_ptr< CThreadInterrupt > m_interrupt_net
This is signaled when network activity should cease.
void AddLocalServices(ServiceFlags services)
Updates the local services that this node advertises to other peers during connection handshake.
std::thread threadPrivateBroadcast
void ThreadOpenConnections(std::vector< std::string > connect, std::span< const std::string > seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_fetches_mutex
bool RemoveAddedNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex)
bool fAddressesInitialized
std::vector< CAddress > GetAddressesUnsafe(size_t max_addresses, size_t max_pct, std::optional< Network > network, bool filtered=true) const
Return randomly selected addresses.
std::thread threadOpenAddedConnections
Mutex m_added_nodes_mutex
void ThreadSocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex
void RecordBytesSent(uint64_t bytes) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
bool CheckIncomingNonce(uint64_t nonce)
int m_max_outbound_full_relay
Mutex m_unused_i2p_sessions_mutex
Mutex protecting m_i2p_sam_sessions.
std::vector< CNode * > m_nodes GUARDED_BY(m_nodes_mutex)
uint64_t GetTotalBytesSent() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
std::unique_ptr< std::counting_semaphore<> > semAddnode
void ThreadPrivateBroadcast() EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex)
bool MaybePickPreferredNetwork(std::optional< Network > &network)
Search for a "preferred" network, a reachable network to which we currently don't have any OUTBOUND_F...
void RecordBytesRecv(uint64_t bytes)
std::chrono::seconds nMaxOutboundCycleStartTime GUARDED_BY(m_total_bytes_sent_mutex)
uint64_t GetOutboundTargetBytesLeft() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
response the bytes left in the current max outbound cycle in case of no limit, it will always respons...
uint64_t nTotalBytesSent GUARDED_BY(m_total_bytes_sent_mutex)
void PushMessage(CNode *pnode, CSerializedNetMsg &&msg) EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
bool GetUseAddrmanOutgoing() const
std::list< CNode * > m_nodes_disconnected
std::unique_ptr< i2p::sam::Session > m_i2p_sam_session
I2P SAM session.
bool m_use_addrman_outgoing
std::vector< NetWhitelistPermissions > vWhitelistedRangeOutgoing
std::map< uint64_t, CachedAddrResponse > m_addr_response_caches
Addr responses stored in different caches per (network, local socket) prevent cross-network node iden...
std::function< void(CNode *)> NodeFn
Sock::EventsPerSock GenerateWaitSockets(std::span< CNode *const > nodes)
Generate a collection of sockets to check for IO readiness.
NetEventsInterface * m_msgproc
std::atomic< uint64_t > nTotalBytesRecv
std::atomic< bool > fNetworkActive
bool InactivityCheck(const CNode &node, std::chrono::microseconds now) const
Return true if the peer is inactive and should be disconnected.
void SocketHandlerListening(const Sock::EventsPerSock &events_per_sock)
Accept incoming connections, one from each read-ready listening socket.
std::vector< CService > m_onion_binds
A vector of -bind=<address>:<port>=onion arguments each of which is an address and port that are desi...
bool AlreadyConnectedToAddressPort(const CService &addr_port) const
Determine whether we're already connected to a given address:port.
RecursiveMutex & GetNodesMutex() const LOCK_RETURNED(m_nodes_mutex)
std::thread threadSocketHandler
void AcceptConnection(const ListenSocket &hListenSocket)
bool BindListenPort(const CService &bindAddr, bilingual_str &strError, NetPermissionFlags permissions)
A hasher class for Bitcoin's 256-bit hash (double SHA-256).
An encapsulated private key.
Transport protocol agnostic message container.
CNetMessage(CNetMessage &&)=default
CNetMessage(DataStream &&recv_in)
DataStream m_recv
received message data
CNetMessage & operator=(const CNetMessage &)=delete
CNetMessage(const CNetMessage &)=delete
CNetMessage & operator=(CNetMessage &&)=default
Information about a peer.
bool IsFeelerConn() const
const std::chrono::seconds m_connected
Unix epoch time at peer connection.
bool ExpectServicesFromConn() const
const std::string m_dest
The pszDest argument provided to ConnectNode().
CService m_addr_local GUARDED_BY(m_addr_local_mutex)
uint64_t nRecvBytes GUARDED_BY(cs_vRecv)
bool IsInboundConn() const
bool HasPermission(NetPermissionFlags permission) const
CountingSemaphoreGrant grantOutbound
bool IsOutboundOrBlockRelayConn() const
bool IsManualConn() const
const std::string m_addr_name
CNode & operator=(const CNode &)=delete
void SetCommonVersion(int greatest_common_version)
std::list< CNetMessage > vRecvMsg
void PongReceived(std::chrono::microseconds ping_time)
A ping-pong round trip has completed successfully.
size_t m_msg_process_queue_size GUARDED_BY(m_msg_process_queue_mutex)
bool IsAddrFetchConn() const
uint64_t GetLocalNonce() const
mapMsgTypeSize mapSendBytesPerMsgType GUARDED_BY(cs_vSend)
const uint64_t nKeyedNetGroup
std::unique_ptr< i2p::sam::Session > m_i2p_sam_session GUARDED_BY(m_sock_mutex)
If an I2P session is created per connection (for outbound transient I2P connections) then it is store...
bool IsBlockOnlyConn() const
int GetCommonVersion() const
mapMsgTypeSize mapRecvBytesPerMsgType GUARDED_BY(cs_vRecv)
bool IsFullOutboundConn() const
const uint64_t m_network_key
Network key used to prevent fingerprinting our node across networks.
Mutex m_msg_process_queue_mutex
const ConnectionType m_conn_type
const size_t m_recv_flood_size
const uint64_t nLocalHostNonce
bool IsManualOrFullOutboundConn() const
bool IsPrivateBroadcastConn() const
const std::unique_ptr< Transport > m_transport
Transport serializer/deserializer.
std::shared_ptr< Sock > m_sock GUARDED_BY(m_sock_mutex)
Socket used for communication with the node.
const NetPermissionFlags m_permission_flags
CNode(const CNode &)=delete
size_t m_send_memusage GUARDED_BY(cs_vSend)
Sum of GetMemoryUsage of all vSendMsg entries.
const bool m_inbound_onion
Whether this peer is an inbound onion, i.e. connected via our Tor onion service.
uint64_t nSendBytes GUARDED_BY(cs_vSend)
Total number of bytes sent on the wire to this peer.
std::list< CNetMessage > m_msg_process_queue GUARDED_BY(m_msg_process_queue_mutex)
std::deque< CSerializedNetMsg > vSendMsg GUARDED_BY(cs_vSend)
Messages still to be fed to m_transport->SetMessageToSend.
std::string cleanSubVer GUARDED_BY(m_subver_mutex)
cleanSubVer is a sanitized string of the user agent byte array we read from the wire.
std::string m_session_id
BIP324 session id string in hex, if any.
std::chrono::microseconds m_last_ping_time
mapMsgTypeSize mapRecvBytesPerMsgType
std::chrono::seconds m_last_recv
ConnectionType m_conn_type
std::chrono::seconds m_last_send
std::chrono::seconds m_last_tx_time
mapMsgTypeSize mapSendBytesPerMsgType
std::chrono::microseconds m_min_ping_time
TransportProtocolType m_transport_type
Transport protocol type.
std::chrono::seconds m_connected
bool m_bip152_highbandwidth_from
bool m_bip152_highbandwidth_to
std::chrono::seconds m_last_block_time
NetPermissionFlags m_permission_flags
Simple class for background tasks that should be run periodically or once "after a while".
A combination of a network address (CNetAddr) and a (TCP) port.
General SipHash-2-4 implementation.
RAII-style semaphore lock.
Double ended buffer combining vector and stream-like interfaces.
Different type to mark Mutex at global scope.
Interface for message handling.
static Mutex g_msgproc_mutex
Mutex for anything that is only accessed via the msg processing thread.
virtual void FinalizeNode(const CNode &node)=0
Handle removal of a peer (clear state)
virtual bool ProcessMessages(CNode &node, std::atomic< bool > &interrupt) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex)=0
Process protocol messages received from a given node.
virtual bool HasAllDesirableServiceFlags(ServiceFlags services) const =0
Callback to determine whether the given set of service flags are sufficient for a peer to be "relevan...
virtual bool SendMessages(CNode &node) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex)=0
Send queued protocol messages to a given node.
~NetEventsInterface()=default
Protected destructor so that instances can only be deleted by derived classes.
virtual void InitializeNode(const CNode &node, ServiceFlags our_services)=0
Initialize a peer (setup state)
static void AddFlag(NetPermissionFlags &flags, NetPermissionFlags f)
static bool HasFlag(NetPermissionFlags flags, NetPermissionFlags f)
RAII helper class that manages a socket and closes it automatically when it goes out of scope.
The Transport converts one connection's sent messages to wire bytes, and received bytes back.
virtual ~Transport()=default
virtual Info GetInfo() const noexcept=0
Retrieve information about this transport.
std::tuple< std::span< const uint8_t >, bool, const std::string & > BytesToSend
Return type for GetBytesToSend, consisting of:
CHash256 hasher GUARDED_BY(m_recv_mutex)
DataStream hdrbuf GUARDED_BY(m_recv_mutex)
bool m_sending_header GUARDED_BY(m_send_mutex)
Whether we're currently sending header bytes or message bytes.
Mutex m_send_mutex
Lock for sending state.
CSerializedNetMsg m_message_to_send GUARDED_BY(m_send_mutex)
The data of the message currently being sent.
size_t m_bytes_sent GUARDED_BY(m_send_mutex)
How many bytes have been sent so far (from m_header_to_send, or from m_message_to_send....
unsigned int nDataPos GUARDED_BY(m_recv_mutex)
bool in_data GUARDED_BY(m_recv_mutex)
uint256 data_hash GUARDED_BY(m_recv_mutex)
std::vector< uint8_t > m_header_to_send GUARDED_BY(m_send_mutex)
The header of the message currently being sent.
const MessageStartChars m_magic_bytes
unsigned int nHdrPos GUARDED_BY(m_recv_mutex)
DataStream vRecv GUARDED_BY(m_recv_mutex)
bool CompleteInternal() const noexcept EXCLUSIVE_LOCKS_REQUIRED(m_recv_mutex)
CMessageHeader hdr GUARDED_BY(m_recv_mutex)
Mutex m_recv_mutex
Lock for receive state.
bool ReceivedMessageComplete() const override EXCLUSIVE_LOCKS_REQUIRED(!m_recv_mutex)
Returns true if the current message is complete (so GetReceivedMessage can be called).
std::vector< uint8_t > m_send_buffer GUARDED_BY(m_send_mutex)
The send buffer; meaning is determined by m_send_state.
bool m_sent_v1_header_worth GUARDED_BY(m_send_mutex)
Whether we've sent at least 24 bytes (which would trigger disconnect for V1 peers).
const NodeId m_nodeid
NodeId (for debug logging).
BIP324Cipher m_cipher
Cipher state.
SendState
State type that controls the sender side.
V1Transport m_v1_fallback
Encapsulate a V1Transport to fall back to.
Mutex m_send_mutex ACQUIRED_AFTER(m_recv_mutex)
Lock for sending-side fields.
SendState m_send_state GUARDED_BY(m_send_mutex)
Current sender state.
std::string m_send_type GUARDED_BY(m_send_mutex)
Type of the message being sent.
const bool m_initiating
Whether we are the initiator side.
std::vector< uint8_t > m_recv_buffer GUARDED_BY(m_recv_mutex)
Receive buffer; meaning is determined by m_recv_state.
std::vector< uint8_t > m_send_garbage GUARDED_BY(m_send_mutex)
The garbage sent, or to be sent (MAYBE_V1 and AWAITING_KEY state only).
uint32_t m_recv_len GUARDED_BY(m_recv_mutex)
In {VERSION, APP}, the decrypted packet length, if m_recv_buffer.size() >= BIP324Cipher::LENGTH_LEN.
uint32_t m_send_pos GUARDED_BY(m_send_mutex)
How many bytes from the send buffer have been sent so far.
RecvState m_recv_state GUARDED_BY(m_recv_mutex)
Current receiver state.
Mutex m_recv_mutex ACQUIRED_BEFORE(m_send_mutex)
Lock for receiver-side fields.
std::vector< uint8_t > m_recv_aad GUARDED_BY(m_recv_mutex)
AAD expected in next received packet (currently used only for garbage).
std::vector< uint8_t > m_recv_decode_buffer GUARDED_BY(m_recv_mutex)
Buffer to put decrypted contents in, for converting to CNetMessage.
RecvState
State type that defines the current contents of the receive buffer and/or how the next received bytes...
std::string ConnectionTypeAsString(ConnectionType conn_type)
Convert ConnectionType enum to a string value.
ConnectionType
Different types of connections to a peer.
@ PRIVATE_BROADCAST
Private broadcast connections are short-lived and only opened to privacy networks (Tor,...
@ BLOCK_RELAY
We use block-relay-only connections to help prevent against partition attacks.
@ MANUAL
We open manual connections to addresses that users explicitly requested via the addnode RPC or the -a...
@ OUTBOUND_FULL_RELAY
These are the default connections that we use to connect with the network.
@ FEELER
Feeler connections are short-lived connections made to check that a node is alive.
@ INBOUND
Inbound connections are those initiated by a peer.
@ ADDR_FETCH
AddrFetch connections are short lived connections used to solicit addresses from peers.
TransportProtocolType
Transport layer version.
@ V1
Unencrypted, plaintext protocol.
CClientUIInterface uiInterface
std::array< uint8_t, 4 > MessageStartChars
void ForEachNode(const Node< Key > &root, Fn &&fn)
Unordered traversal of a miniscript node tree.
static const unsigned char VERSION[]
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS
The maximum number of peer connections to maintain.
static constexpr bool DEFAULT_PRIVATE_BROADCAST
Default for -privatebroadcast.
bool IsLocal(const CService &addr)
check whether a given address is potentially local
void RemoveLocal(const CService &addr)
static const unsigned int MAX_SUBVERSION_LENGTH
Maximum length of the user agent string in version message.
static constexpr std::chrono::minutes TIMEOUT_INTERVAL
Time after which to disconnect, after waiting for a ping response (or inactivity).
static const int MAX_ADDNODE_CONNECTIONS
Maximum number of addnode outgoing nodes.
bool AddLocal(const CService &addr, int nScore=LOCAL_NONE)
static const size_t DEFAULT_MAXSENDBUFFER
static const int NUM_FDS_MESSAGE_CAPTURE
Number of file descriptors required for message capture.
static constexpr bool DEFAULT_FIXEDSEEDS
static const bool DEFAULT_BLOCKSONLY
Default for blocks only.
static const unsigned int MAX_PROTOCOL_MESSAGE_LENGTH
Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable).
static constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL
Run the extra block-relay-only connection loop once every 5 minutes.
static const size_t DEFAULT_MAXRECEIVEBUFFER
std::string strSubVersion
Subversion as sent to the P2P network in version messages.
static const std::string DEFAULT_MAX_UPLOAD_TARGET
The default for -maxuploadtarget.
std::optional< CService > GetLocalAddrForPeer(CNode &node)
Returns a local address that we should advertise to this peer.
const std::string NET_MESSAGE_TYPE_OTHER
std::map< std::string, uint64_t > mapMsgTypeSize
static constexpr bool DEFAULT_FORCEDNSSEED
static constexpr size_t MAX_PRIVATE_BROADCAST_CONNECTIONS
Maximum number of private broadcast connections.
static constexpr bool DEFAULT_DNSSEED
CService GetLocalAddress(const CNode &peer)
GlobalMutex g_maplocalhost_mutex
static const int MAX_FEELER_CONNECTIONS
Maximum number of feeler connections.
static const bool DEFAULT_LISTEN
-listen default
static constexpr std::chrono::hours ASMAP_HEALTH_CHECK_INTERVAL
Interval for ASMap Health Check.
std::map< CNetAddr, LocalServiceInfo > mapLocalHost GUARDED_BY(g_maplocalhost_mutex)
static constexpr auto FEELER_INTERVAL
Run the feeler connection loop once every 2 minutes.
static const int64_t DEFAULT_PEER_CONNECT_TIMEOUT
-peertimeout default
std::function< void(const CAddress &addr, const std::string &msg_type, std::span< const unsigned char > data, bool is_incoming)> CaptureMessage
Defaults to CaptureMessageToFile(), but can be overridden by unit tests.
static const int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
static constexpr bool DEFAULT_V2_TRANSPORT
static const int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
void Discover()
Look up IP addresses from all interfaces on the machine and add them to the list of local addresses t...
bool SeenLocal(const CService &addr)
vote for a local address
constexpr bool DEFAULT_WHITELISTFORCERELAY
Default for -whitelistforcerelay.
constexpr bool DEFAULT_WHITELISTRELAY
Default for -whitelistrelay.
ServiceFlags
nServices flags
static const int INIT_PROTO_VERSION
initial proto version, to be increased after version/verack negotiation
Cache responses to addr requests to minimize privacy leak.
std::vector< CAddress > m_addrs_response_cache
void AddSocketPermissionFlags(NetPermissionFlags &flags) const
ListenSocket(std::shared_ptr< Sock > sock_, NetPermissionFlags permissions_)
NetPermissionFlags m_permissions
std::shared_ptr< Sock > sock
std::vector< NetWhitebindPermissions > vWhiteBinds
std::vector< NetWhitelistPermissions > vWhitelistedRangeIncoming
std::vector< CService > onion_binds
std::vector< std::string > m_specified_outgoing
std::vector< std::string > m_added_nodes
std::vector< CService > vBinds
bool m_i2p_accept_incoming
std::vector< std::string > vSeedNodes
bool bind_on_any
True if the user did not specify -bind= or -whitebind= and thus we should bind on 0....
std::vector< NetWhitelistPermissions > vWhitelistedRangeOutgoing
Struct for entries in m_reconnections.
CountingSemaphoreGrant grant
CSerializedNetMsg(const CSerializedNetMsg &msg)=delete
CSerializedNetMsg Copy() const
CSerializedNetMsg & operator=(CSerializedNetMsg &&)=default
CSerializedNetMsg & operator=(const CSerializedNetMsg &)=delete
CSerializedNetMsg()=default
CSerializedNetMsg(CSerializedNetMsg &&)=default
std::vector< unsigned char > data
size_t GetMemoryUsage() const noexcept
Compute total memory usage of this object (own memory + any dynamic memory).
std::optional< uint256 > session_id
TransportProtocolType transport_type
#define AssertLockNotHeld(cs)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define EXCLUSIVE_LOCKS_REQUIRED(...)