34#include <util/threadinterrupt.h>
37#include <condition_variable>
48#include <unordered_set>
138 std::vector<unsigned char>
data;
244 uint32_t m_message_size{0};
245 uint32_t m_raw_message_size{0};
280 virtual
bool ReceivedMessageComplete() const = 0;
288 virtual
bool ReceivedBytes(
std::span<const uint8_t>& msg_bytes) = 0;
317 std::span<const uint8_t> ,
357 virtual
BytesToSend GetBytesToSend(
bool have_next_message) const noexcept = 0;
365 virtual
void MarkBytesSent(
size_t bytes_sent) noexcept = 0;
368 virtual
size_t GetSendMemoryUsage() const noexcept = 0;
373 virtual
bool ShouldReconnectV1() const noexcept = 0;
410 if (!in_data)
return false;
411 return hdr.nMessageSize == nDataPos;
417 std::vector<uint8_t> m_header_to_send
GUARDED_BY(m_send_mutex);
431 return WITH_LOCK(m_recv_mutex,
return CompleteInternal());
434 Info GetInfo() const noexcept override;
440 int ret = in_data ? readData(msg_bytes) : readHeader(msg_bytes);
444 msg_bytes = msg_bytes.subspan(
ret);
455 bool ShouldReconnectV1() const noexcept
override {
return false; }
464 static constexpr std::array<std::byte, 0> VERSION_CONTENTS = {};
468 static constexpr size_t V1_PREFIX_LEN = 16;
603 std::vector<uint8_t> m_recv_decode_buffer
GUARDED_BY(m_recv_mutex);
615 std::vector<uint8_t> m_send_garbage
GUARDED_BY(m_send_mutex);
621 bool m_sent_v1_header_worth
GUARDED_BY(m_send_mutex) {
false};
628 static std::optional<std::string> GetMessageType(std::span<const uint8_t>& contents)
noexcept;
643 static constexpr uint32_t MAX_GARBAGE_LEN = 4095;
674 std::optional<Proxy> proxy_override = {};
675 std::unique_ptr<i2p::sam::Session> i2p_sam_session =
nullptr;
676 bool prefer_evict =
false;
678 bool use_v2transport =
false;
730 std::atomic<int> nVersion{0};
737 const bool m_prefer_evict{
false};
742 std::atomic_bool fSuccessfullyConnected{
false};
745 std::atomic_bool fDisconnect{
false};
747 std::atomic<int> nRefCount{0};
750 std::atomic_bool fPauseRecv{
false};
751 std::atomic_bool fPauseSend{
false};
760 void MarkReceivedMsgsForProcessing()
772 void AccountForSentBytes(const
std::
string& msg_type,
size_t sent_bytes)
775 mapSendBytesPerMsgType[msg_type] += sent_bytes;
779 switch (m_conn_type) {
804 switch (m_conn_type) {
848 switch (m_conn_type) {
873 Network ConnectedThroughNetwork()
const;
876 [[nodiscard]]
bool IsConnectedThroughPrivacyNet()
const;
879 std::atomic<bool> m_bip152_highbandwidth_to{
false};
881 std::atomic<bool> m_bip152_highbandwidth_from{
false};
884 std::atomic_bool m_has_all_wanted_services{
false};
888 std::atomic_bool m_relays_txs{
false};
892 std::atomic_bool m_bloom_filter_loaded{
false};
899 std::atomic<std::chrono::seconds> m_last_block_time{0
s};
905 std::atomic<std::chrono::seconds> m_last_tx_time{0
s};
908 std::atomic<NodeClock::duration> m_last_ping_time{0us};
912 std::atomic<NodeClock::duration> m_min_ping_time{NodeClock::duration::max()};
915 std::shared_ptr<Sock> sock,
917 uint64_t nKeyedNetGroupIn,
918 uint64_t nLocalHostNonceIn,
920 const std::string& addrNameIn,
923 uint64_t network_key,
933 return nLocalHostNonce;
956 m_greatest_common_version = greatest_common_version;
960 return m_greatest_common_version;
989 std::string LogPeer()
const;
996 std::string DisconnectMsg()
const;
1001 m_last_ping_time = ping_time;
1002 m_min_ping_time = std::min(m_min_ping_time.load(), ping_time);
1014 std::list<CNetMessage> m_msg_process_queue
GUARDED_BY(m_msg_process_queue_mutex);
1015 size_t m_msg_process_queue_size
GUARDED_BY(m_msg_process_queue_mutex){0};
1034 std::unique_ptr<i2p::sam::Session> m_i2p_sam_session
GUARDED_BY(m_sock_mutex);
1096 unsigned int nSendBufferMaxSize = 0;
1097 unsigned int nReceiveFloodSize = 0;
1098 uint64_t nMaxOutboundLimit = 0;
1109 bool m_use_addrman_outgoing =
true;
1115 bool m_capture_messages =
false;
1122 m_local_services = connOptions.m_local_services;
1123 m_max_automatic_connections = connOptions.m_max_automatic_connections;
1126 m_max_automatic_outbound = m_max_outbound_full_relay + m_max_outbound_block_relay + m_max_feeler;
1127 m_max_inbound = std::max(0, m_max_automatic_connections - m_max_automatic_outbound);
1128 m_max_inbound_full_relay = std::max(0,
static_cast<int>(connOptions.m_full_relay_inbound_percent / 100.0 * m_max_inbound));
1129 m_use_addrman_outgoing = connOptions.m_use_addrman_outgoing;
1130 m_client_interface = connOptions.uiInterface;
1131 m_banman = connOptions.m_banman;
1132 m_msgproc = connOptions.m_msgproc;
1133 nSendBufferMaxSize = connOptions.nSendBufferMaxSize;
1134 nReceiveFloodSize = connOptions.nReceiveFloodSize;
1135 m_peer_connect_timeout = std::chrono::seconds{connOptions.m_peer_connect_timeout};
1137 LOCK(m_total_bytes_sent_mutex);
1138 nMaxOutboundLimit = connOptions.nMaxOutboundLimit;
1140 vWhitelistedRangeIncoming = connOptions.vWhitelistedRangeIncoming;
1141 vWhitelistedRangeOutgoing = connOptions.vWhitelistedRangeOutgoing;
1143 LOCK(m_added_nodes_mutex);
1147 for (
const std::string& added_node : connOptions.m_added_nodes) {
1148 m_added_node_params.push_back({added_node, use_v2transport});
1151 m_onion_binds = connOptions.onion_binds;
1152 whitelist_forcerelay = connOptions.whitelist_forcerelay;
1153 whitelist_relay = connOptions.whitelist_relay;
1154 m_capture_messages = connOptions.m_capture_messages;
1165 bool network_active =
true,
1166 std::shared_ptr<CThreadInterrupt> interrupt_net = std::make_shared<CThreadInterrupt>());
1183 bool GetNetworkActive()
const {
return fNetworkActive; };
1185 void SetNetworkActive(
bool active);
1199 bool OpenNetworkConnection(
const CAddress& addrConnect,
1202 const char* pszDest,
1204 bool use_v2transport,
1205 const std::optional<Proxy>& proxy_override)
1220 std::atomic_bool m_outbound_tor_ok_at_least_once{
false};
1237 std::optional<Network> PickNetwork(std::optional<Proxy>& proxy)
const;
1240 size_t NumToOpen()
const;
1247 void NumToOpenAdd(
size_t n);
1255 size_t NumToOpenSub(
size_t n);
1258 void NumToOpenWait()
const;
1266 std::optional<Proxy> ProxyForIPv4or6()
const;
1269 std::atomic_size_t m_num_to_open{0};
1288 for (
auto&&
node : m_nodes) {
1297 for (
auto&&
node : m_nodes) {
1315 std::vector<CAddress>
GetAddressesUnsafe(
size_t max_addresses,
size_t max_pct, std::optional<Network> network,
bool filtered =
true)
const;
1330 std::vector<CAddress>
GetAddresses(
CNode& requestor,
size_t max_addresses,
size_t max_pct);
1438 : sock{sock_}, m_permissions{permissions_}
1518 const
Sock::EventsPerSock& events_per_sock)
1577 const
char* pszDest,
1581 const
std::optional<
Proxy>& proxy_override)
1679 std::chrono::microseconds m_cache_entry_expiration{0};
1759 std::atomic<bool> flagInterruptMsgProc{
false};
1791 std::atomic_bool m_start_extra_block_relay_peers{
false};
1814 bool m_capture_messages{
false};
1828 std::queue<std::unique_ptr<i2p::sam::Session>> m_unused_i2p_sessions
GUARDED_BY(m_unused_i2p_sessions_mutex);
1849 std::list<ReconnectionInfo> m_reconnections
GUARDED_BY(m_reconnections_mutex);
1852 void PerformReconnections()
1859 static constexpr
size_t MAX_UNUSED_I2P_SESSIONS_SIZE{10};
1872 LOCK(connman.m_nodes_mutex);
1873 m_nodes_copy = connman.m_nodes;
1874 for (
auto&
node : m_nodes_copy) {
1885 for (
auto&
node : m_nodes_copy) {
1890 const std::vector<CNode*>&
Nodes()
const
1892 return m_nodes_copy;
1905extern std::function<void(
const CAddress& addr,
1906 const std::string& msg_type,
1907 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) EXCLUSIVE_LOCKS_REQUIRED(!connman.m_nodes_mutex)
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.
void AcceptConnection(const ListenSocket &hListenSocket) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
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)
std::vector< NetWhitelistPermissions > vWhitelistedRangeIncoming
CClientUIInterface * m_client_interface
bool MaybePickPreferredNetwork(std::optional< Network > &network) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Search for a "preferred" network, a reachable network to which we currently don't have any OUTBOUND_F...
std::reference_wrapper< AddrMan > addrman
void DisconnectNodes() EXCLUSIVE_LOCKS_REQUIRED(!m_reconnections_mutex
void DeleteNode(CNode *pnode)
void ThreadI2PAcceptIncoming() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
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)
bool AlreadyConnectedToAddress(const CNetAddr &addr) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given address.
bool ShouldRunInactivityChecks(const CNode &node, NodeClock::time_point now) const
Return true if we should disconnect the peer for failing an inactivity check.
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)
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
std::vector< CAddress > GetCurrentBlockRelayOnlyConns() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Return vector of current BLOCK_RELAY peers.
bool AlreadyConnectedToAddressPort(const CService &addr_port) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given address:port.
uint64_t nMaxOutboundLimit GUARDED_BY(m_total_bytes_sent_mutex)
std::atomic< NodeId > nLastNodeId
bool AlreadyConnectedToHost(std::string_view host) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Determine whether we're already connected to a given "host:port".
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...
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)
void SocketHandlerListening(const Sock::EventsPerSock &events_per_sock) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Accept incoming connections, one from each read-ready listening socket.
uint64_t GetMaxOutboundTarget() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
std::thread threadDNSAddressSeed
void ForEachNode(const NodeFn &func) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
bool AddConnection(const std::string &address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Attempts to open a connection.
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 StartExtraBlockRelayPeers()
const NetGroupManager & m_netgroupman
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
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::vector< AddedNodeInfo > GetAddedNodeInfo(bool include_connected) const EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
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_nodes_mutex
Open a new P2P connection.
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
CSipHasher GetDeterministicRandomizer(uint64_t id) const
Get a unique deterministic randomizer.
Mutex m_total_bytes_sent_mutex
void ThreadOpenAddedConnections() EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
bool Bind(const CService &addr, unsigned int flags, NetPermissionFlags permissions)
bool EvictTxPeerIfFull(std::optional< NodeId > protect_peer=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
If we are at capacity for inbound tx-relay peers, attempt to evict one.
std::thread threadOpenConnections
std::atomic< ServiceFlags > m_local_services
Services this node offers.
void ThreadPrivateBroadcast() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
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.
const uint64_t nSeed0
SipHasher seeds for deterministic randomness.
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.
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)
bool InactivityCheck(const CNode &node, NodeClock::time_point now) const
Return true if the peer is inactive and should be disconnected.
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 CreateNodeFromAcceptedSocket(std::unique_ptr< Sock > &&sock, NetPermissionFlags permission_flags, const CService &addr_bind, const CService &addr) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Create a CNode object from a socket that has just been accepted and add the node to the m_nodes membe...
void ThreadOpenConnections(std::vector< std::string > connect, std::span< const std::string > seed_nodes) EXCLUSIVE_LOCKS_REQUIRED(!m_added_nodes_mutex
bool AttemptToEvictConnection(bool evict_tx_relay_peer_only, std::optional< NodeId > protect_peer=std::nullopt) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
Try to find an inbound connection to evict.
void GetNodeStats(std::vector< CNodeStats > &vstats) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
void AddLocalServices(ServiceFlags services)
Updates the local services that this node advertises to other peers during connection handshake.
bool ForNode(NodeId id, std::function< bool(CNode *pnode)> func) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
std::thread threadPrivateBroadcast
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.
void NotifyNumConnectionsChanged() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
int GetExtraBlockRelayCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
std::thread threadOpenAddedConnections
bool DisconnectNode(std::string_view node) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
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)
void ThreadMessageHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Mutex & GetNodesMutex() const LOCK_RETURNED(m_nodes_mutex)
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)
int m_max_inbound_full_relay
uint64_t GetTotalBytesSent() const EXCLUSIVE_LOCKS_REQUIRED(!m_total_bytes_sent_mutex)
std::unique_ptr< std::counting_semaphore<> > semAddnode
size_t GetNodeCount(ConnectionDirection) const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
void RecordBytesRecv(uint64_t bytes)
std::chrono::seconds nMaxOutboundCycleStartTime GUARDED_BY(m_total_bytes_sent_mutex)
int GetExtraFullOutboundCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_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...
void SocketHandler() EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex
Check connected and listening sockets for IO readiness and process them accordingly.
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...
bool CheckIncomingNonce(uint64_t nonce) EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
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
AssertLockNotHeld(m_reconnections_mutex)
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...
std::thread threadSocketHandler
int GetFullOutboundConnCount() const EXCLUSIVE_LOCKS_REQUIRED(!m_nodes_mutex)
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
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
size_t m_msg_process_queue_size GUARDED_BY(m_msg_process_queue_mutex)
bool IsAddrFetchConn() const
uint64_t GetLocalNonce() const
const NodeClock::time_point m_connected
Unix epoch time at peer connection.
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.
void PongReceived(NodeClock::duration ping_time)
A ping-pong round trip has completed successfully. Update latest and minimum ping durations.
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.
int AdvertisedVersion() const
Protocol version advertised in our VERSION message.
const std::optional< Proxy > m_proxy_override
Proxy to use regardless of global proxy settings if reconnecting to this node.
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.
NodeClock::duration m_min_ping_time
mapMsgTypeSize mapRecvBytesPerMsgType
ConnectionType m_conn_type
std::chrono::seconds m_last_tx_time
mapMsgTypeSize mapSendBytesPerMsgType
NodeClock::time_point m_last_recv
NodeClock::time_point m_last_send
NodeClock::duration m_last_ping_time
TransportProtocolType m_transport_type
Transport protocol type.
bool m_bip152_highbandwidth_from
bool m_bip152_highbandwidth_to
NodeClock::time_point m_connected
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::thread thread
Thread variable should be after other struct members so the thread does not start until the other mem...
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[]
constexpr bool DEFAULT_LISTEN
-listen default
constexpr bool DEFAULT_PRIVATE_BROADCAST
Default for -privatebroadcast.
constexpr unsigned int MAX_SUBVERSION_LENGTH
Maximum length of the user agent string in version message.
bool IsLocal(const CService &addr)
check whether a given address is potentially local
constexpr int MAX_FEELER_CONNECTIONS
Maximum number of feeler connections.
constexpr bool DEFAULT_BLOCKSONLY
Default for blocks only.
constexpr int MAX_ADDNODE_CONNECTIONS
Maximum number of addnode outgoing nodes.
void RemoveLocal(const CService &addr)
constexpr std::chrono::minutes TIMEOUT_INTERVAL
Time after which to disconnect, after waiting for a ping response (or inactivity).
constexpr size_t DEFAULT_MAXSENDBUFFER
constexpr bool DEFAULT_FIXEDSEEDS
constexpr unsigned int DEFAULT_MAX_PEER_CONNECTIONS
The maximum number of peer connections to maintain.
constexpr int64_t DEFAULT_PEER_CONNECT_TIMEOUT
-peertimeout default
constexpr unsigned int MAX_PROTOCOL_MESSAGE_LENGTH
Maximum length of incoming protocol messages (no message over 4 MB is currently acceptable).
constexpr auto EXTRA_BLOCK_RELAY_ONLY_PEER_INTERVAL
Run the extra block-relay-only connection loop once every 5 minutes.
constexpr size_t DEFAULT_MAXRECEIVEBUFFER
std::string strSubVersion
Subversion as sent to the P2P network in version messages.
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
constexpr bool DEFAULT_FORCEDNSSEED
constexpr size_t MAX_PRIVATE_BROADCAST_CONNECTIONS
Maximum number of private broadcast connections.
constexpr bool DEFAULT_DNSSEED
constexpr int MAX_BLOCK_RELAY_ONLY_CONNECTIONS
Maximum number of block-relay-only outgoing connections.
CService GetLocalAddress(const CNode &peer)
GlobalMutex g_maplocalhost_mutex
constexpr std::chrono::hours ASMAP_HEALTH_CHECK_INTERVAL
Interval for ASMap Health Check.
std::map< CNetAddr, LocalServiceInfo > mapLocalHost GUARDED_BY(g_maplocalhost_mutex)
constexpr int NUM_FDS_MESSAGE_CAPTURE
Number of file descriptors required for message capture.
bool AddLocal(const CService &addr, int nScore=LOCAL_NONE, bool add_even_if_unreachable=false)
constexpr auto FEELER_INTERVAL
Run the feeler connection loop once every 2 minutes.
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.
constexpr int DEFAULT_FULL_RELAY_INBOUND_PCT
Default percentage of inbound connection slots that tx-relaying peers can use.
constexpr bool DEFAULT_V2_TRANSPORT
constexpr int MAX_OUTBOUND_FULL_RELAY_CONNECTIONS
Maximum number of automatic outgoing nodes over which we'll relay everything (blocks,...
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
constexpr int INIT_PROTO_VERSION
initial proto version, to be increased after version/verack negotiation
constexpr int PROTOCOL_VERSION
network protocol versioning
constexpr int WTXID_RELAY_VERSION
"wtxidrelay" message type for wtxid-based relay starts with this version
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.
std::optional< Proxy > proxy_override
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).
Version of the system clock that is mockable in the context of tests (via FakeNodeClock or SetMockTim...
std::chrono::time_point< NodeClock > time_point
static constexpr time_point epoch
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(...)