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

Information about a peer. More...

#include <net.h>

Collaboration diagram for CNode:
[legend]

Classes

struct  TxRelay
 

Public Member Functions

std::shared_ptr< Sock > m_sock GUARDED_BY (m_sock_mutex)
 Socket used for communication with the node. More...
 
size_t nSendSize GUARDED_BY (cs_vSend)
 Total size of all vSendMsg entries. More...
 
size_t nSendOffset GUARDED_BY (cs_vSend)
 Offset inside the first vSendMsg already sent. More...
 
uint64_t nSendBytes GUARDED_BY (cs_vSend)
 
std::deque< std::vector< unsigned char > > vSendMsg GUARDED_BY (cs_vSend)
 
std::list< CNetMessage > vProcessMsg GUARDED_BY (cs_vProcessMsg)
 
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
 
bool IsOutboundOrBlockRelayConn () const
 
bool IsFullOutboundConn () const
 
bool IsManualConn () 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...
 
 CNode (NodeId id, ServiceFlags nLocalServicesIn, 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)
 
 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)
 Receive bytes from the buffer and deserialize them into messages. More...
 
void SetCommonVersion (int greatest_common_version)
 
int GetCommonVersion () const
 
CService GetAddrLocal () const LOCKS_EXCLUDED(m_addr_local_mutex)
 
void SetAddrLocal (const CService &addrLocalIn) LOCKS_EXCLUDED(m_addr_local_mutex)
 May not be called more than once. More...
 
CNodeAddRef ()
 
void Release ()
 
void AddKnownTx (const uint256 &hash)
 
void PushTxInventory (const uint256 &hash)
 
void CloseSocketDisconnect ()
 
void CopyStats (CNodeStats &stats)
 
ServiceFlags GetLocalServices () const
 
std::string ConnectionTypeAsString () const
 
void PongReceived (std::chrono::microseconds ping_time)
 A ping-pong round trip has completed successfully. More...
 

Public Attributes

std::unique_ptr< TransportDeserializerm_deserializer
 
std::unique_ptr< TransportSerializerm_serializer
 
NetPermissionFlags m_permissionFlags {NetPermissionFlags::None}
 
std::atomic< ServiceFlagsnServices {NODE_NONE}
 
Mutex cs_vSend
 
Mutex m_sock_mutex
 
Mutex cs_vRecv
 
RecursiveMutex cs_vProcessMsg
 
size_t nProcessQueueSize {0}
 
RecursiveMutex cs_sendProcessing
 
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 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
 
bool m_prefer_evict {false}
 
bool fClient {false}
 
bool m_limited_node {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}
 
std::atomic< bool > m_bip152_highbandwidth_to {false}
 
std::atomic< bool > m_bip152_highbandwidth_from {false}
 
std::unique_ptr< TxRelaym_tx_relay
 
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...
 

Private Member Functions

CService addrLocal GUARDED_BY (m_addr_local_mutex)
 
mapMsgCmdSize mapSendBytesPerMsgCmd GUARDED_BY (cs_vSend)
 
mapMsgCmdSize mapRecvBytesPerMsgCmd GUARDED_BY (cs_vRecv)
 

Private Attributes

const NodeId id
 
const uint64_t nLocalHostNonce
 
const ConnectionType m_conn_type
 
std::atomic< int > m_greatest_common_version {INIT_PROTO_VERSION}
 
const ServiceFlags nLocalServices
 Services offered to this peer. More...
 
std::list< CNetMessagevRecvMsg
 
Mutex m_addr_local_mutex
 

Friends

class CConnman
 
struct ConnmanTestMsg
 

Detailed Description

Information about a peer.

Definition at line 394 of file net.h.

Constructor & Destructor Documentation

◆ CNode() [1/2]

CNode::CNode ( NodeId  id,
ServiceFlags  nLocalServicesIn,
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 
)

Definition at line 2989 of file net.cpp.

◆ CNode() [2/2]

CNode::CNode ( const CNode )
delete

Member Function Documentation

◆ AddKnownTx()

void CNode::AddKnownTx ( const uint256 hash)
inline

Definition at line 645 of file net.h.

◆ AddRef()

CNode* CNode::AddRef ( )
inline

Definition at line 634 of file net.h.

Here is the caller graph for this function:

◆ CloseSocketDisconnect()

void CNode::CloseSocketDisconnect ( )

Definition at line 527 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 580 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 671 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 587 of file net.cpp.

Here is the call graph for this function:

◆ ExpectServicesFromConn()

bool CNode::ExpectServicesFromConn ( ) const
inline

Definition at line 510 of file net.h.

Here is the call graph for this function:

◆ GetAddrLocal()

CService CNode::GetAddrLocal ( ) const

Definition at line 563 of file net.cpp.

Here is the caller graph for this function:

◆ GetCommonVersion()

int CNode::GetCommonVersion ( ) const
inline

Definition at line 625 of file net.h.

◆ GetId()

NodeId CNode::GetId ( ) const
inline

Definition at line 595 of file net.h.

Here is the caller graph for this function:

◆ GetLocalNonce()

uint64_t CNode::GetLocalNonce ( ) const
inline

Definition at line 599 of file net.h.

◆ GetLocalServices()

ServiceFlags CNode::GetLocalServices ( ) const
inline

Definition at line 666 of file net.h.

Here is the caller graph for this function:

◆ GetRefCount()

int CNode::GetRefCount ( ) const
inline

Definition at line 603 of file net.h.

Here is the call graph for this function:

◆ GUARDED_BY() [1/11]

std::list<CNetMessage> vProcessMsg CNode::GUARDED_BY ( cs_vProcessMsg  )

◆ GUARDED_BY() [2/11]

uint64_t nRecvBytes CNode::GUARDED_BY ( cs_vRecv  )
inline

Definition at line 432 of file net.h.

◆ GUARDED_BY() [3/11]

mapMsgCmdSize mapRecvBytesPerMsgCmd CNode::GUARDED_BY ( cs_vRecv  )
private

◆ GUARDED_BY() [4/11]

size_t nSendSize CNode::GUARDED_BY ( cs_vSend  )
inline

Total size of all vSendMsg entries.

Definition at line 417 of file net.h.

◆ GUARDED_BY() [5/11]

size_t nSendOffset CNode::GUARDED_BY ( cs_vSend  )
inline

Offset inside the first vSendMsg already sent.

Definition at line 419 of file net.h.

◆ GUARDED_BY() [6/11]

uint64_t nSendBytes CNode::GUARDED_BY ( cs_vSend  )
inline

Definition at line 420 of file net.h.

◆ GUARDED_BY() [7/11]

std::deque<std::vector<unsigned char> > vSendMsg CNode::GUARDED_BY ( cs_vSend  )

◆ GUARDED_BY() [8/11]

mapMsgCmdSize mapSendBytesPerMsgCmd CNode::GUARDED_BY ( cs_vSend  )
private

◆ GUARDED_BY() [9/11]

CService addrLocal CNode::GUARDED_BY ( m_addr_local_mutex  )
private

◆ GUARDED_BY() [10/11]

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/11]

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 452 of file net.h.

◆ HasPermission()

bool CNode::HasPermission ( NetPermissionFlags  permission) const
inline

Definition at line 454 of file net.h.

Here is the call graph for this function:

◆ IsAddrFetchConn()

bool CNode::IsAddrFetchConn ( ) const
inline

Definition at line 502 of file net.h.

◆ IsBlockOnlyConn()

bool CNode::IsBlockOnlyConn ( ) const
inline

Definition at line 494 of file net.h.

◆ IsFeelerConn()

bool CNode::IsFeelerConn ( ) const
inline

Definition at line 498 of file net.h.

◆ IsFullOutboundConn()

bool CNode::IsFullOutboundConn ( ) const
inline

Definition at line 486 of file net.h.

◆ IsInboundConn()

bool CNode::IsInboundConn ( ) const
inline

Definition at line 506 of file net.h.

Here is the caller graph for this function:

◆ IsManualConn()

bool CNode::IsManualConn ( ) const
inline

Definition at line 490 of file net.h.

◆ IsOutboundOrBlockRelayConn()

bool CNode::IsOutboundOrBlockRelayConn ( ) const
inline

Definition at line 471 of file net.h.

Here is the call graph for this function:

◆ operator=()

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

◆ 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 674 of file net.h.

◆ PushTxInventory()

void CNode::PushTxInventory ( const uint256 hash)
inline

Definition at line 653 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 643 of file net.cpp.

Here is the call graph for this function:

◆ Release()

void CNode::Release ( )
inline

Definition at line 640 of file net.h.

◆ SetAddrLocal()

void CNode::SetAddrLocal ( const CService addrLocalIn)

May not be called more than once.

Definition at line 570 of file net.cpp.

Here is the call graph for this function:

◆ SetCommonVersion()

void CNode::SetCommonVersion ( int  greatest_common_version)
inline

Definition at line 620 of file net.h.

Friends And Related Function Documentation

◆ CConnman

friend class CConnman
friend

Definition at line 396 of file net.h.

◆ ConnmanTestMsg

friend struct ConnmanTestMsg
friend

Definition at line 397 of file net.h.

Member Data Documentation

◆ addr

const CAddress CNode::addr

Definition at line 440 of file net.h.

◆ addrBind

const CAddress CNode::addrBind

Definition at line 442 of file net.h.

◆ cs_sendProcessing

RecursiveMutex CNode::cs_sendProcessing

Definition at line 430 of file net.h.

◆ cs_vProcessMsg

RecursiveMutex CNode::cs_vProcessMsg

Definition at line 426 of file net.h.

◆ cs_vRecv

Mutex CNode::cs_vRecv

Definition at line 424 of file net.h.

◆ cs_vSend

Mutex CNode::cs_vSend

Definition at line 422 of file net.h.

◆ fClient

bool CNode::fClient {false}

Definition at line 457 of file net.h.

◆ fDisconnect

std::atomic_bool CNode::fDisconnect {false}

Definition at line 463 of file net.h.

◆ fPauseRecv

std::atomic_bool CNode::fPauseRecv {false}

Definition at line 468 of file net.h.

◆ fPauseSend

std::atomic_bool CNode::fPauseSend {false}

Definition at line 469 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 460 of file net.h.

◆ grantOutbound

CSemaphoreGrant CNode::grantOutbound

Definition at line 464 of file net.h.

◆ id

const NodeId CNode::id
private

Definition at line 680 of file net.h.

◆ m_addr_local_mutex

Mutex CNode::m_addr_local_mutex
mutableprivate

Definition at line 706 of file net.h.

◆ m_addr_name

const std::string CNode::m_addr_name

Definition at line 443 of file net.h.

◆ m_bip152_highbandwidth_from

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

Definition at line 540 of file net.h.

◆ m_bip152_highbandwidth_to

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

Definition at line 538 of file net.h.

◆ m_conn_type

const ConnectionType CNode::m_conn_type
private

Definition at line 682 of file net.h.

◆ m_connected

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

Unix epoch time at peer connection.

Definition at line 437 of file net.h.

◆ m_deserializer

std::unique_ptr<TransportDeserializer> CNode::m_deserializer

Definition at line 400 of file net.h.

◆ m_greatest_common_version

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

Definition at line 683 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 445 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 576 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 585 of file net.h.

◆ m_last_recv

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

Definition at line 435 of file net.h.

◆ m_last_send

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

Definition at line 434 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 582 of file net.h.

◆ m_limited_node

bool CNode::m_limited_node {false}

Definition at line 458 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 589 of file net.h.

◆ m_permissionFlags

NetPermissionFlags CNode::m_permissionFlags {NetPermissionFlags::None}

Definition at line 403 of file net.h.

◆ m_prefer_evict

bool CNode::m_prefer_evict {false}

Definition at line 453 of file net.h.

◆ m_serializer

std::unique_ptr<TransportSerializer> CNode::m_serializer

Definition at line 401 of file net.h.

◆ m_sock_mutex

Mutex CNode::m_sock_mutex

Definition at line 423 of file net.h.

◆ m_subver_mutex

Mutex CNode::m_subver_mutex

Definition at line 447 of file net.h.

◆ m_tx_relay

std::unique_ptr<TxRelay> CNode::m_tx_relay

Definition at line 569 of file net.h.

◆ nKeyedNetGroup

const uint64_t CNode::nKeyedNetGroup

Definition at line 467 of file net.h.

◆ nLocalHostNonce

const uint64_t CNode::nLocalHostNonce
private

Definition at line 681 of file net.h.

◆ nLocalServices

const ServiceFlags CNode::nLocalServices
private

Services offered to this peer.

This is supplied by the parent CConnman during peer connection (CConnman::ConnectNode()) from its attribute of the same name.

This is const because there is no protocol defined for renegotiating services initially offered to a peer. The set of local services we offer should not change after initialization.

An interesting example of this is NODE_NETWORK and initial block download: a node which starts up from scratch doesn't have any blocks to serve, but still advertises NODE_NETWORK because it will eventually fulfill this role after IBD completes. P2P code is written in such a way that it can gracefully handle peers who don't make good on their service advertisements.

Definition at line 700 of file net.h.

◆ nProcessQueueSize

size_t CNode::nProcessQueueSize {0}

Definition at line 428 of file net.h.

◆ nRefCount

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

Definition at line 465 of file net.h.

◆ nServices

std::atomic<ServiceFlags> CNode::nServices {NODE_NONE}

Definition at line 404 of file net.h.

◆ nTimeOffset

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

Definition at line 438 of file net.h.

◆ nVersion

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

Definition at line 446 of file net.h.

◆ vRecvMsg

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

Definition at line 702 of file net.h.


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