Bitcoin Core  27.99.0
P2P Digital Currency
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes | List of all members
CNode Class Reference

Information about a peer. More...

#include <net.h>

Collaboration diagram for CNode:
[legend]

Public Member Functions

std::shared_ptr< Sock > m_sock GUARDED_BY (m_sock_mutex)
 Socket used for communication with the node. More...
 
size_t m_send_memusage GUARDED_BY (cs_vSend)
 Sum of GetMemoryUsage of all vSendMsg entries. More...
 
uint64_t nSendBytes GUARDED_BY (cs_vSend)
 Total number of bytes sent on the wire to this peer. More...
 
std::deque< CSerializedNetMsg > vSendMsg GUARDED_BY (cs_vSend)
 Messages still to be fed to m_transport->SetMessageToSend. More...
 
uint64_t nRecvBytes GUARDED_BY (cs_vRecv)
 
std::string cleanSubVer GUARDED_BY (m_subver_mutex)
 cleanSubVer is a sanitized string of the user agent byte array we read from the wire. More...
 
bool HasPermission (NetPermissionFlags permission) const
 
void MarkReceivedMsgsForProcessing () EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex)
 Move all messages from the received queue to the processing queue. More...
 
std::optional< std::pair< CNetMessage, bool > > PollMessage () EXCLUSIVE_LOCKS_REQUIRED(!m_msg_process_queue_mutex)
 Poll the next message from the processing queue of this connection. More...
 
void AccountForSentBytes (const std::string &msg_type, size_t sent_bytes) EXCLUSIVE_LOCKS_REQUIRED(cs_vSend)
 Account for the total size of a sent message in the per msg type connection stats. More...
 
bool IsOutboundOrBlockRelayConn () const
 
bool IsFullOutboundConn () const
 
bool IsManualConn () const
 
bool IsManualOrFullOutboundConn () const
 
bool IsBlockOnlyConn () const
 
bool IsFeelerConn () const
 
bool IsAddrFetchConn () const
 
bool IsInboundConn () const
 
bool ExpectServicesFromConn () const
 
Network ConnectedThroughNetwork () const
 Get network the peer connected through. More...
 
bool IsConnectedThroughPrivacyNet () const
 Whether this peer connected through a privacy network. More...
 
 CNode (NodeId id, std::shared_ptr< Sock > sock, const CAddress &addrIn, uint64_t nKeyedNetGroupIn, uint64_t nLocalHostNonceIn, const CAddress &addrBindIn, const std::string &addrNameIn, ConnectionType conn_type_in, bool inbound_onion, CNodeOptions &&node_opts={})
 
 CNode (const CNode &)=delete
 
CNodeoperator= (const CNode &)=delete
 
NodeId GetId () const
 
uint64_t GetLocalNonce () const
 
int GetRefCount () const
 
bool ReceiveMsgBytes (Span< const uint8_t > msg_bytes, bool &complete) EXCLUSIVE_LOCKS_REQUIRED(!cs_vRecv)
 Receive bytes from the buffer and deserialize them into messages. More...
 
void SetCommonVersion (int greatest_common_version)
 
int GetCommonVersion () const
 
CService GetAddrLocal () const EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex)
 
void SetAddrLocal (const CService &addrLocalIn) EXCLUSIVE_LOCKS_REQUIRED(!m_addr_local_mutex)
 May not be called more than once. More...
 
CNodeAddRef ()
 
void Release ()
 
void CloseSocketDisconnect () EXCLUSIVE_LOCKS_REQUIRED(!m_sock_mutex)
 
void CopyStats (CNodeStats &stats) EXCLUSIVE_LOCKS_REQUIRED(!m_subver_mutex
 
std::string ConnectionTypeAsString () const
 
void PongReceived (std::chrono::microseconds ping_time)
 A ping-pong round trip has completed successfully. More...
 

Public Attributes

const std::unique_ptr< Transportm_transport
 Transport serializer/deserializer. More...
 
const NetPermissionFlags m_permission_flags
 
Mutex cs_vSend
 
Mutex m_sock_mutex
 
Mutex cs_vRecv
 
std::atomic< std::chrono::seconds > m_last_send {0s}
 
std::atomic< std::chrono::seconds > m_last_recv {0s}
 
const std::chrono::seconds m_connected
 Unix epoch time at peer connection. More...
 
std::atomic< int64_t > nTimeOffset {0}
 
const CAddress addr
 
const CAddress addrBind
 
const std::string m_addr_name
 
const std::string m_dest
 The pszDest argument provided to ConnectNode(). More...
 
const bool m_inbound_onion
 Whether this peer is an inbound onion, i.e. connected via our Tor onion service. More...
 
std::atomic< int > nVersion {0}
 
Mutex m_subver_mutex
 
const bool m_prefer_evict {false}
 
std::atomic_bool fSuccessfullyConnected {false}
 fSuccessfullyConnected is set to true on receiving VERACK from the peer. More...
 
std::atomic_bool fDisconnect {false}
 
CSemaphoreGrant grantOutbound
 
std::atomic< int > nRefCount {0}
 
const uint64_t nKeyedNetGroup
 
std::atomic_bool fPauseRecv {false}
 
std::atomic_bool fPauseSend {false}
 
const ConnectionType m_conn_type
 
std::atomic< bool > m_bip152_highbandwidth_to {false}
 
std::atomic< bool > m_bip152_highbandwidth_from {false}
 
std::atomic_bool m_has_all_wanted_services {false}
 Whether this peer provides all services that we want. More...
 
std::atomic_bool m_relays_txs {false}
 Whether we should relay transactions to this peer. More...
 
std::atomic_bool m_bloom_filter_loaded {false}
 Whether this peer has loaded a bloom filter. More...
 
std::atomic< std::chrono::seconds > m_last_block_time {0s}
 UNIX epoch time of the last block received from this peer that we had not yet seen (e.g. More...
 
std::atomic< std::chrono::seconds > m_last_tx_time {0s}
 UNIX epoch time of the last transaction received from this peer that we had not yet seen (e.g. More...
 
std::atomic< std::chrono::microseconds > m_last_ping_time {0us}
 Last measured round-trip time. More...
 
std::atomic< std::chrono::microseconds > m_min_ping_time {std::chrono::microseconds::max()}
 Lowest measured round-trip time. More...
 
void !m_addr_local_mutex
 
void !cs_vSend
 
void !cs_vRecv
 

Private Member Functions

std::list< CNetMessage > m_msg_process_queue GUARDED_BY (m_msg_process_queue_mutex)
 
size_t m_msg_process_queue_size GUARDED_BY (m_msg_process_queue_mutex)
 
CService addrLocal GUARDED_BY (m_addr_local_mutex)
 
mapMsgTypeSize mapSendBytesPerMsgType GUARDED_BY (cs_vSend)
 
mapMsgTypeSize mapRecvBytesPerMsgType GUARDED_BY (cs_vRecv)
 
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 stored here so that it can be destroyed when the socket is closed. More...
 

Private Attributes

const NodeId id
 
const uint64_t nLocalHostNonce
 
std::atomic< int > m_greatest_common_version {INIT_PROTO_VERSION}
 
const size_t m_recv_flood_size
 
std::list< CNetMessagevRecvMsg
 
Mutex m_msg_process_queue_mutex
 
Mutex m_addr_local_mutex
 

Detailed Description

Information about a peer.

Definition at line 671 of file net.h.

Constructor & Destructor Documentation

◆ CNode() [1/2]

CNode::CNode ( NodeId  id,
std::shared_ptr< Sock sock,
const CAddress addrIn,
uint64_t  nKeyedNetGroupIn,
uint64_t  nLocalHostNonceIn,
const CAddress addrBindIn,
const std::string &  addrNameIn,
ConnectionType  conn_type_in,
bool  inbound_onion,
CNodeOptions &&  node_opts = {} 
)

Definition at line 3658 of file net.cpp.

Here is the call graph for this function:

◆ CNode() [2/2]

CNode::CNode ( const CNode )
delete

Member Function Documentation

◆ AccountForSentBytes()

void CNode::AccountForSentBytes ( const std::string &  msg_type,
size_t  sent_bytes 
)
inline

Account for the total size of a sent message in the per msg type connection stats.

Definition at line 754 of file net.h.

◆ AddRef()

CNode* CNode::AddRef ( )
inline

Definition at line 933 of file net.h.

Here is the caller graph for this function:

◆ CloseSocketDisconnect()

void CNode::CloseSocketDisconnect ( )

Definition at line 536 of file net.cpp.

◆ ConnectedThroughNetwork()

Network CNode::ConnectedThroughNetwork ( ) const

Get network the peer connected through.

Returns Network::NET_ONION for inbound onion connections, and CNetAddr::GetNetClass() otherwise. The latter cannot be used directly because it doesn't detect the former, and it's not the responsibility of the CNetAddr class to know the actual network a peer is connected through.

Returns
network the peer connected through.

Definition at line 579 of file net.cpp.

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

◆ ConnectionTypeAsString()

std::string CNode::ConnectionTypeAsString ( ) const
inline

Definition at line 948 of file net.h.

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

◆ CopyStats()

void CNode::CopyStats ( CNodeStats stats)

Definition at line 591 of file net.cpp.

Here is the call graph for this function:

◆ ExpectServicesFromConn()

bool CNode::ExpectServicesFromConn ( ) const
inline

Definition at line 815 of file net.h.

Here is the call graph for this function:

◆ GetAddrLocal()

CService CNode::GetAddrLocal ( ) const

Definition at line 562 of file net.cpp.

Here is the caller graph for this function:

◆ GetCommonVersion()

int CNode::GetCommonVersion ( ) const
inline

Definition at line 924 of file net.h.

◆ GetId()

NodeId CNode::GetId ( ) const
inline

Definition at line 894 of file net.h.

Here is the caller graph for this function:

◆ GetLocalNonce()

uint64_t CNode::GetLocalNonce ( ) const
inline

Definition at line 898 of file net.h.

◆ GetRefCount()

int CNode::GetRefCount ( ) const
inline

Definition at line 902 of file net.h.

Here is the call graph for this function:

◆ GUARDED_BY() [1/12]

uint64_t nRecvBytes CNode::GUARDED_BY ( cs_vRecv  )
inline

Definition at line 700 of file net.h.

◆ GUARDED_BY() [2/12]

mapMsgTypeSize mapRecvBytesPerMsgType CNode::GUARDED_BY ( cs_vRecv  )
private

◆ GUARDED_BY() [3/12]

size_t m_send_memusage CNode::GUARDED_BY ( cs_vSend  )
inline

Sum of GetMemoryUsage of all vSendMsg entries.

Definition at line 691 of file net.h.

◆ GUARDED_BY() [4/12]

uint64_t nSendBytes CNode::GUARDED_BY ( cs_vSend  )
inline

Total number of bytes sent on the wire to this peer.

Definition at line 693 of file net.h.

◆ GUARDED_BY() [5/12]

std::deque<CSerializedNetMsg> vSendMsg CNode::GUARDED_BY ( cs_vSend  )

Messages still to be fed to m_transport->SetMessageToSend.

◆ GUARDED_BY() [6/12]

mapMsgTypeSize mapSendBytesPerMsgType CNode::GUARDED_BY ( cs_vSend  )
private

◆ GUARDED_BY() [7/12]

CService addrLocal CNode::GUARDED_BY ( m_addr_local_mutex  )
private

◆ GUARDED_BY() [8/12]

std::list<CNetMessage> m_msg_process_queue CNode::GUARDED_BY ( m_msg_process_queue_mutex  )
private

◆ GUARDED_BY() [9/12]

size_t m_msg_process_queue_size CNode::GUARDED_BY ( m_msg_process_queue_mutex  )
inlineprivate

Definition at line 966 of file net.h.

◆ GUARDED_BY() [10/12]

std::shared_ptr<Sock> m_sock CNode::GUARDED_BY ( m_sock_mutex  )

Socket used for communication with the node.

May not own a Sock object (after CloseSocketDisconnect() or during tests). shared_ptr (instead of unique_ptr) is used to avoid premature close of the underlying file descriptor by one thread while another thread is poll(2)-ing it for activity.

See also
https://github.com/bitcoin/bitcoin/issues/21744 for details.

◆ GUARDED_BY() [11/12]

std::unique_ptr<i2p::sam::Session> m_i2p_sam_session CNode::GUARDED_BY ( m_sock_mutex  )
private

If an I2P session is created per connection (for outbound transient I2P connections) then it is stored here so that it can be destroyed when the socket is closed.

I2P sessions involve a data/transport socket (in m_sock) and a control socket (in m_i2p_sam_session). For transient sessions, once the data socket is closed, the control socket is not going to be used anymore and is just taking up resources. So better close it as soon as m_sock is closed. Otherwise this unique_ptr is empty.

◆ GUARDED_BY() [12/12]

std::string cleanSubVer CNode::GUARDED_BY ( m_subver_mutex  )
inline

cleanSubVer is a sanitized string of the user agent byte array we read from the wire.

This cleaned string can safely be logged or displayed.

Definition at line 722 of file net.h.

◆ HasPermission()

bool CNode::HasPermission ( NetPermissionFlags  permission) const
inline

Definition at line 724 of file net.h.

Here is the call graph for this function:

◆ IsAddrFetchConn()

bool CNode::IsAddrFetchConn ( ) const
inline

Definition at line 807 of file net.h.

◆ IsBlockOnlyConn()

bool CNode::IsBlockOnlyConn ( ) const
inline

Definition at line 799 of file net.h.

◆ IsConnectedThroughPrivacyNet()

bool CNode::IsConnectedThroughPrivacyNet ( ) const

Whether this peer connected through a privacy network.

Definition at line 584 of file net.cpp.

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

◆ IsFeelerConn()

bool CNode::IsFeelerConn ( ) const
inline

Definition at line 803 of file net.h.

◆ IsFullOutboundConn()

bool CNode::IsFullOutboundConn ( ) const
inline

Definition at line 775 of file net.h.

◆ IsInboundConn()

bool CNode::IsInboundConn ( ) const
inline

Definition at line 811 of file net.h.

Here is the caller graph for this function:

◆ IsManualConn()

bool CNode::IsManualConn ( ) const
inline

Definition at line 779 of file net.h.

◆ IsManualOrFullOutboundConn()

bool CNode::IsManualOrFullOutboundConn ( ) const
inline

Definition at line 783 of file net.h.

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

◆ IsOutboundOrBlockRelayConn()

bool CNode::IsOutboundOrBlockRelayConn ( ) const
inline

Definition at line 760 of file net.h.

Here is the call graph for this function:

◆ MarkReceivedMsgsForProcessing()

void CNode::MarkReceivedMsgsForProcessing ( )

Move all messages from the received queue to the processing queue.

Definition at line 3698 of file net.cpp.

◆ operator=()

CNode& CNode::operator= ( const CNode )
delete

◆ PollMessage()

std::optional< std::pair< CNetMessage, bool > > CNode::PollMessage ( )

Poll the next message from the processing queue of this connection.

Returns std::nullopt if the processing queue is empty, or a pair consisting of the message and a bool that indicates if the processing queue has more entries.

Definition at line 3715 of file net.cpp.

◆ PongReceived()

void CNode::PongReceived ( std::chrono::microseconds  ping_time)
inline

A ping-pong round trip has completed successfully.

Update latest and minimum ping times.

Definition at line 951 of file net.h.

◆ ReceiveMsgBytes()

bool CNode::ReceiveMsgBytes ( Span< const uint8_t >  msg_bytes,
bool &  complete 
)

Receive bytes from the buffer and deserialize them into messages.

Parameters
[in]msg_bytesThe raw data
[out]completeSet True if at least one message has been deserialized and is ready to be processed
Returns
True if the peer should stay connected, False if the peer should be disconnected from.

Definition at line 638 of file net.cpp.

Here is the call graph for this function:

◆ Release()

void CNode::Release ( )
inline

Definition at line 939 of file net.h.

◆ SetAddrLocal()

void CNode::SetAddrLocal ( const CService addrLocalIn)

May not be called more than once.

Definition at line 569 of file net.cpp.

Here is the call graph for this function:

◆ SetCommonVersion()

void CNode::SetCommonVersion ( int  greatest_common_version)
inline

Definition at line 919 of file net.h.

Member Data Documentation

◆ !cs_vRecv

void CNode::!cs_vRecv

Definition at line 946 of file net.h.

◆ !cs_vSend

void CNode::!cs_vSend

Definition at line 946 of file net.h.

◆ !m_addr_local_mutex

void CNode::!m_addr_local_mutex

Definition at line 946 of file net.h.

◆ addr

const CAddress CNode::addr

Definition at line 708 of file net.h.

◆ addrBind

const CAddress CNode::addrBind

Definition at line 710 of file net.h.

◆ cs_vRecv

Mutex CNode::cs_vRecv

Definition at line 698 of file net.h.

◆ cs_vSend

Mutex CNode::cs_vSend

Definition at line 696 of file net.h.

◆ fDisconnect

std::atomic_bool CNode::fDisconnect {false}

Definition at line 731 of file net.h.

◆ fPauseRecv

std::atomic_bool CNode::fPauseRecv {false}

Definition at line 736 of file net.h.

◆ fPauseSend

std::atomic_bool CNode::fPauseSend {false}

Definition at line 737 of file net.h.

◆ fSuccessfullyConnected

std::atomic_bool CNode::fSuccessfullyConnected {false}

fSuccessfullyConnected is set to true on receiving VERACK from the peer.

Definition at line 728 of file net.h.

◆ grantOutbound

CSemaphoreGrant CNode::grantOutbound

Definition at line 732 of file net.h.

◆ id

const NodeId CNode::id
private

Definition at line 957 of file net.h.

◆ m_addr_local_mutex

Mutex CNode::m_addr_local_mutex
mutableprivate

Definition at line 970 of file net.h.

◆ m_addr_name

const std::string CNode::m_addr_name

Definition at line 711 of file net.h.

◆ m_bip152_highbandwidth_from

std::atomic<bool> CNode::m_bip152_highbandwidth_from {false}

Definition at line 848 of file net.h.

◆ m_bip152_highbandwidth_to

std::atomic<bool> CNode::m_bip152_highbandwidth_to {false}

Definition at line 846 of file net.h.

◆ m_bloom_filter_loaded

std::atomic_bool CNode::m_bloom_filter_loaded {false}

Whether this peer has loaded a bloom filter.

Used only in inbound eviction logic.

Definition at line 859 of file net.h.

◆ m_conn_type

const ConnectionType CNode::m_conn_type

Definition at line 739 of file net.h.

◆ m_connected

const std::chrono::seconds CNode::m_connected

Unix epoch time at peer connection.

Definition at line 705 of file net.h.

◆ m_dest

const std::string CNode::m_dest

The pszDest argument provided to ConnectNode().

Only used for reconnections.

Definition at line 713 of file net.h.

◆ m_greatest_common_version

std::atomic<int> CNode::m_greatest_common_version {INIT_PROTO_VERSION}
private

Definition at line 959 of file net.h.

◆ m_has_all_wanted_services

std::atomic_bool CNode::m_has_all_wanted_services {false}

Whether this peer provides all services that we want.

Used for eviction decisions

Definition at line 851 of file net.h.

◆ m_inbound_onion

const bool CNode::m_inbound_onion

Whether this peer is an inbound onion, i.e. connected via our Tor onion service.

Definition at line 715 of file net.h.

◆ m_last_block_time

std::atomic<std::chrono::seconds> CNode::m_last_block_time {0s}

UNIX epoch time of the last block received from this peer that we had not yet seen (e.g.

not already received from another peer), that passed preliminary validity checks and was saved to disk, even if we don't connect the block or it eventually fails connection. Used as an inbound peer eviction criterium in CConnman::AttemptToEvictConnection.

Definition at line 866 of file net.h.

◆ m_last_ping_time

std::atomic<std::chrono::microseconds> CNode::m_last_ping_time {0us}

Last measured round-trip time.

Used only for RPC/GUI stats/debugging.

Definition at line 875 of file net.h.

◆ m_last_recv

std::atomic<std::chrono::seconds> CNode::m_last_recv {0s}

Definition at line 703 of file net.h.

◆ m_last_send

std::atomic<std::chrono::seconds> CNode::m_last_send {0s}

Definition at line 702 of file net.h.

◆ m_last_tx_time

std::atomic<std::chrono::seconds> CNode::m_last_tx_time {0s}

UNIX epoch time of the last transaction received from this peer that we had not yet seen (e.g.

not already received from another peer) and that was accepted into our mempool. Used as an inbound peer eviction criterium in CConnman::AttemptToEvictConnection.

Definition at line 872 of file net.h.

◆ m_min_ping_time

std::atomic<std::chrono::microseconds> CNode::m_min_ping_time {std::chrono::microseconds::max()}

Lowest measured round-trip time.

Used as an inbound peer eviction criterium in CConnman::AttemptToEvictConnection.

Definition at line 879 of file net.h.

◆ m_msg_process_queue_mutex

Mutex CNode::m_msg_process_queue_mutex
private

Definition at line 964 of file net.h.

◆ m_permission_flags

const NetPermissionFlags CNode::m_permission_flags

Definition at line 678 of file net.h.

◆ m_prefer_evict

const bool CNode::m_prefer_evict {false}

Definition at line 723 of file net.h.

◆ m_recv_flood_size

const size_t CNode::m_recv_flood_size
private

Definition at line 961 of file net.h.

◆ m_relays_txs

std::atomic_bool CNode::m_relays_txs {false}

Whether we should relay transactions to this peer.

This only changes from false to true. It will never change back to false.

Definition at line 855 of file net.h.

◆ m_sock_mutex

Mutex CNode::m_sock_mutex

Definition at line 697 of file net.h.

◆ m_subver_mutex

Mutex CNode::m_subver_mutex

Definition at line 717 of file net.h.

◆ m_transport

const std::unique_ptr<Transport> CNode::m_transport

Transport serializer/deserializer.

The receive side functions are only called under cs_vRecv, while the sending side functions are only called under cs_vSend.

Definition at line 676 of file net.h.

◆ nKeyedNetGroup

const uint64_t CNode::nKeyedNetGroup

Definition at line 735 of file net.h.

◆ nLocalHostNonce

const uint64_t CNode::nLocalHostNonce
private

Definition at line 958 of file net.h.

◆ nRefCount

std::atomic<int> CNode::nRefCount {0}

Definition at line 733 of file net.h.

◆ nTimeOffset

std::atomic<int64_t> CNode::nTimeOffset {0}

Definition at line 706 of file net.h.

◆ nVersion

std::atomic<int> CNode::nVersion {0}

Definition at line 716 of file net.h.

◆ vRecvMsg

std::list<CNetMessage> CNode::vRecvMsg
private

Definition at line 962 of file net.h.


The documentation for this class was generated from the following files: