![]() |
Bitcoin Core
21.99.0
P2P Digital Currency
|
#include <net_processing.h>
#include <addrman.h>
#include <banman.h>
#include <blockencodings.h>
#include <blockfilter.h>
#include <chainparams.h>
#include <consensus/validation.h>
#include <hash.h>
#include <index/blockfilterindex.h>
#include <merkleblock.h>
#include <netbase.h>
#include <netmessagemaker.h>
#include <policy/fees.h>
#include <policy/policy.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
#include <random.h>
#include <reverse_iterator.h>
#include <scheduler.h>
#include <streams.h>
#include <tinyformat.h>
#include <txmempool.h>
#include <txrequest.h>
#include <util/check.h>
#include <util/strencodings.h>
#include <util/system.h>
#include <validation.h>
#include <memory>
#include <typeinfo>
Go to the source code of this file.
Classes | |
struct | COrphanTx |
class | CNetProcessingCleanup |
Functions | |
std::map< uint256, COrphanTx > mapOrphanTransactions | GUARDED_BY (g_cs_orphans) |
Map from txid to orphan transaction record. More... | |
void | EraseOrphansFor (NodeId peer) |
void | UpdateLastBlockAnnounceTime (NodeId node, int64_t time_in_seconds) |
static void | AddToCompactExtraTransactions (const CTransactionRef &tx) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans) |
bool | AddOrphanTx (const CTransactionRef &tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans) |
static int | EraseOrphanTx (uint256 hash) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans) |
unsigned int | LimitOrphanTxSize (unsigned int nMaxOrphans) |
static bool | BlockRequestAllowed (const CBlockIndex *pindex, const Consensus::Params &consensusParams) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
static std::shared_ptr< const CBlock > most_recent_block | GUARDED_BY (cs_most_recent_block) |
static bool | AlreadyHaveTx (const GenTxid >xid, const CTxMemPool &mempool) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
static bool | AlreadyHaveBlock (const uint256 &block_hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
void | RelayTransaction (const uint256 &txid, const uint256 &wtxid, const CConnman &connman) |
Relay transaction to every node. More... | |
static void | RelayAddress (const CNode &originator, const CAddress &addr, bool fReachable, const CConnman &connman) |
Relay (gossip) an address to a few randomly chosen nodes. More... | |
static void | ProcessGetBlockData (CNode &pfrom, Peer &peer, const CChainParams &chainparams, const CInv &inv, CConnman &connman) |
static CTransactionRef | FindTxForGetData (const CTxMemPool &mempool, const CNode &peer, const GenTxid >xid, const std::chrono::seconds mempool_req, const std::chrono::seconds now) LOCKS_EXCLUDED(cs_main) |
Determine whether or not a peer can request a transaction, and return it (or nullptr if not found or not allowed). More... | |
static void | ProcessGetData (CNode &pfrom, Peer &peer, const CChainParams &chainparams, CConnman &connman, CTxMemPool &mempool, const std::atomic< bool > &interruptMsgProc) EXCLUSIVE_LOCKS_REQUIRED(!cs_main |
const CNetMsgMaker | msgMaker (pfrom.GetCommonVersion()) |
while (it !=peer.m_getdata_requests.end() &&it->IsGenTxMsg()) | |
if (it !=peer.m_getdata_requests.end() &&!pfrom.fPauseSend) | |
peer m_getdata_requests | erase (peer.m_getdata_requests.begin(), it) |
if (!vNotFound.empty()) | |
static uint32_t | GetFetchFlags (const CNode &pfrom) EXCLUSIVE_LOCKS_REQUIRED(cs_main) |
static bool | PrepareBlockFilterRequest (CNode &peer, const CChainParams &chain_params, BlockFilterType filter_type, uint32_t start_height, const uint256 &stop_hash, uint32_t max_height_diff, const CBlockIndex *&stop_index, BlockFilterIndex *&filter_index) |
Validation logic for compact filters request handling. More... | |
static void | ProcessGetCFilters (CNode &peer, CDataStream &vRecv, const CChainParams &chain_params, CConnman &connman) |
Handle a cfilters request. More... | |
static void | ProcessGetCFHeaders (CNode &peer, CDataStream &vRecv, const CChainParams &chain_params, CConnman &connman) |
Handle a cfheaders request. More... | |
static void | ProcessGetCFCheckPt (CNode &peer, CDataStream &vRecv, const CChainParams &chain_params, CConnman &connman) |
Handle a getcfcheckpt request. More... | |
Variables | |
static constexpr int64_t | ORPHAN_TX_EXPIRE_TIME = 20 * 60 |
Expiration time for orphan transactions in seconds. More... | |
static constexpr int64_t | ORPHAN_TX_EXPIRE_INTERVAL = 5 * 60 |
Minimum time between orphan transactions expire time checks in seconds. More... | |
static constexpr std::chrono::seconds | RELAY_TX_CACHE_TIME = std::chrono::minutes{15} |
How long to cache transactions in mapRelay for normal relay. More... | |
static constexpr std::chrono::seconds | UNCONDITIONAL_RELAY_DELAY = std::chrono::minutes{2} |
How long a transaction has to be in the mempool before it can unconditionally be relayed (even when not in mapRelay). More... | |
static constexpr int64_t | HEADERS_DOWNLOAD_TIMEOUT_BASE = 15 * 60 * 1000000 |
Headers download timeout expressed in microseconds Timeout = base + per_header * (expected number of headers) More... | |
static constexpr int64_t | HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER = 1000 |
static constexpr int32_t | MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT = 4 |
Protect at least this many outbound peers from disconnection due to slow/ behind headers chain. More... | |
static constexpr int64_t | CHAIN_SYNC_TIMEOUT = 20 * 60 |
Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds. More... | |
static constexpr int64_t | STALE_CHECK_INTERVAL = 10 * 60 |
How frequently to check for stale tips, in seconds. More... | |
static constexpr int64_t | EXTRA_PEER_CHECK_INTERVAL = 45 |
How frequently to check for extra outbound peers and disconnect, in seconds. More... | |
static constexpr int64_t | MINIMUM_CONNECT_TIME = 30 |
Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds. More... | |
static constexpr uint64_t | RANDOMIZER_ID_ADDRESS_RELAY = 0x3cac0035b5866b90ULL |
SHA256("main address relay")[0:8]. More... | |
static constexpr int | STALE_RELAY_AGE_LIMIT = 30 * 24 * 60 * 60 |
Age after which a stale block will no longer be served if requested as protection against fingerprinting. More... | |
static constexpr int | HISTORICAL_BLOCK_AGE = 7 * 24 * 60 * 60 |
Age after which a block is considered historical for purposes of rate limiting block relay. More... | |
static constexpr std::chrono::minutes | PING_INTERVAL {2} |
Time between pings automatically sent out for latency probing and keepalive. More... | |
static const unsigned int | MAX_LOCATOR_SZ = 101 |
The maximum number of entries in a locator. More... | |
static const unsigned int | MAX_INV_SZ = 50000 |
The maximum number of entries in an 'inv' protocol message. More... | |
static constexpr int32_t | MAX_PEER_TX_REQUEST_IN_FLIGHT = 100 |
Maximum number of in-flight transaction requests from a peer. More... | |
static constexpr int32_t | MAX_PEER_TX_ANNOUNCEMENTS = 5000 |
Maximum number of transactions to consider for requesting, per peer. More... | |
static constexpr auto | TXID_RELAY_DELAY = std::chrono::seconds{2} |
How long to delay requesting transactions via txids, if we have wtxid-relaying peers. More... | |
static constexpr auto | NONPREF_PEER_TX_DELAY = std::chrono::seconds{2} |
How long to delay requesting transactions from non-preferred peers. More... | |
static constexpr auto | OVERLOADED_PEER_TX_DELAY = std::chrono::seconds{2} |
How long to delay requesting transactions from overloaded peers (see MAX_PEER_TX_REQUEST_IN_FLIGHT). More... | |
static constexpr std::chrono::microseconds | GETDATA_TX_INTERVAL {std::chrono::seconds{60}} |
How long to wait (in microseconds) before downloading a transaction from an additional peer. More... | |
static const unsigned int | MAX_GETDATA_SZ = 1000 |
Limit to avoid sending big packets. More... | |
static const int | MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16 |
Number of blocks that can be requested at any given time from a single peer. More... | |
static const unsigned int | BLOCK_STALLING_TIMEOUT = 2 |
Timeout in seconds during which a peer must stall block download progress before being disconnected. More... | |
static const unsigned int | MAX_HEADERS_RESULTS = 2000 |
Number of headers sent in one getheaders result. More... | |
static const int | MAX_CMPCTBLOCK_DEPTH = 5 |
Maximum depth of blocks we're willing to serve as compact blocks to peers when requested. More... | |
static const int | MAX_BLOCKTXN_DEPTH = 10 |
Maximum depth of blocks we're willing to respond to GETBLOCKTXN requests for. More... | |
static const unsigned int | BLOCK_DOWNLOAD_WINDOW = 1024 |
Size of the "block download window": how far ahead of our current height do we fetch? Larger windows tolerate larger download speed differences between peer, but increase the potential degree of disordering of blocks on disk (which make reindexing and pruning harder). More... | |
static const int64_t | BLOCK_DOWNLOAD_TIMEOUT_BASE = 1000000 |
Block download timeout base, expressed in millionths of the block interval (i.e. More... | |
static const int64_t | BLOCK_DOWNLOAD_TIMEOUT_PER_PEER = 500000 |
Additional block download timeout per parallel downloading peer (i.e. More... | |
static const unsigned int | MAX_BLOCKS_TO_ANNOUNCE = 8 |
Maximum number of headers to announce when relaying blocks with headers message. More... | |
static const int | MAX_UNCONNECTING_HEADERS = 10 |
Maximum number of unconnecting headers announcements before DoS score. More... | |
static const unsigned int | NODE_NETWORK_LIMITED_MIN_BLOCKS = 288 |
Minimum blocks required to signal NODE_NETWORK_LIMITED. More... | |
static constexpr std::chrono::hours | AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL {24} |
Average delay between local address broadcasts. More... | |
static constexpr std::chrono::seconds | AVG_ADDRESS_BROADCAST_INTERVAL {30} |
Average delay between peer address broadcasts. More... | |
static const unsigned int | INVENTORY_BROADCAST_INTERVAL = 5 |
Average delay between trickled inventory transmissions in seconds. More... | |
static constexpr unsigned int | INVENTORY_BROADCAST_PER_SECOND = 7 |
Maximum rate of inventory items to send per second. More... | |
static constexpr unsigned int | INVENTORY_BROADCAST_MAX = INVENTORY_BROADCAST_PER_SECOND * INVENTORY_BROADCAST_INTERVAL |
Maximum number of inventory items to send per transmission. More... | |
static constexpr unsigned int | INVENTORY_MAX_RECENT_RELAY = 3500 |
The number of most recently announced transactions a peer can request. More... | |
static constexpr unsigned int | AVG_FEEFILTER_BROADCAST_INTERVAL = 10 * 60 |
Verify that INVENTORY_MAX_RECENT_RELAY is enough to cache everything typically relayed before unconditional relay from the mempool kicks in. More... | |
static constexpr unsigned int | MAX_FEEFILTER_CHANGE_DELAY = 5 * 60 |
Maximum feefilter broadcast delay after significant change. More... | |
static constexpr uint32_t | MAX_GETCFILTERS_SIZE = 1000 |
Maximum number of compact filters that may be requested with one getcfilters. More... | |
static constexpr uint32_t | MAX_GETCFHEADERS_SIZE = 2000 |
Maximum number of cf hashes that may be requested with one getcfheaders. More... | |
static constexpr size_t | MAX_PCT_ADDR_TO_SEND = 23 |
the maximum percentage of addresses from our addrman to return in response to a getaddr message. More... | |
RecursiveMutex | g_cs_orphans |
Guards orphan transactions and extra txs for compact blocks. More... | |
static RecursiveMutex | cs_most_recent_block |
static void peer | m_getdata_requests_mutex |
std::deque< CInv >::iterator | it = peer.m_getdata_requests.begin() |
std::vector< CInv > | vNotFound |
const std::chrono::seconds | now = GetTime<std::chrono::seconds>() |
const std::chrono::seconds | mempool_req |
static CNetProcessingCleanup | instance_of_cnetprocessingcleanup |
bool AddOrphanTx | ( | const CTransactionRef & | tx, |
NodeId | peer | ||
) |
Definition at line 1082 of file net_processing.cpp.
|
static |
Definition at line 1071 of file net_processing.cpp.
|
static |
Definition at line 1596 of file net_processing.cpp.
|
static |
Definition at line 1565 of file net_processing.cpp.
|
static |
Definition at line 1307 of file net_processing.cpp.
peer m_getdata_requests erase | ( | peer.m_getdata_requests. | begin(), |
it | |||
) |
void EraseOrphansFor | ( | NodeId | peer | ) |
Definition at line 1149 of file net_processing.cpp.
|
static |
Definition at line 1118 of file net_processing.cpp.
|
static |
Determine whether or not a peer can request a transaction, and return it (or nullptr if not found or not allowed).
Definition at line 1828 of file net_processing.cpp.
|
static |
Definition at line 1949 of file net_processing.cpp.
std::map< uint256, std::map< uint256, COrphanTx >::iterator > g_orphans_by_wtxid GUARDED_BY | ( | g_cs_orphans | ) |
Map from txid to orphan transaction record.
Index from wtxid into the mapOrphanTransactions to lookup orphan transactions using their witness ids.
Limited by -maxorphantx/DEFAULT_MAX_ORPHAN_TRANSACTIONS
|
static |
if | ( | it ! | = peer.m_getdata_requests.end() && !pfrom.fPauseSend | ) |
Definition at line 1919 of file net_processing.cpp.
if | ( | !vNotFound. | empty() | ) |
unsigned int LimitOrphanTxSize | ( | unsigned int | nMaxOrphans | ) |
Definition at line 1166 of file net_processing.cpp.
const CNetMsgMaker msgMaker | ( | pfrom. | GetCommonVersion() | ) |
|
static |
Validation logic for compact filters request handling.
May disconnect from the peer in the case of a bad request.
[in] | peer | The peer that we received the request from |
[in] | chain_params | Chain parameters |
[in] | filter_type | The filter type the request is for. Must be basic filters. |
[in] | start_height | The start height for the request |
[in] | stop_hash | The stop_hash for the request |
[in] | max_height_diff | The maximum number of items permitted to request, as specified in BIP 157 |
[out] | stop_index | The CBlockIndex for the stop_hash block, if the request can be serviced. |
[out] | filter_index | The filter index, if the request can be serviced. |
Definition at line 2263 of file net_processing.cpp.
|
static |
Definition at line 1671 of file net_processing.cpp.
|
static |
Handle a getcfcheckpt request.
May disconnect from the peer in the case of a bad request.
[in] | peer | The peer that we received the request from |
[in] | vRecv | The raw message received |
[in] | chain_params | Chain parameters |
[in] | connman | Pointer to the connection manager |
Definition at line 2423 of file net_processing.cpp.
|
static |
Handle a cfheaders request.
May disconnect from the peer in the case of a bad request.
[in] | peer | The peer that we received the request from |
[in] | vRecv | The raw message received |
[in] | chain_params | Chain parameters |
[in] | connman | Pointer to the connection manager |
Definition at line 2368 of file net_processing.cpp.
|
static |
Handle a cfilters request.
May disconnect from the peer in the case of a bad request.
[in] | peer | The peer that we received the request from |
[in] | vRecv | The raw message received |
[in] | chain_params | Chain parameters |
[in] | connman | Pointer to the connection manager |
Definition at line 2326 of file net_processing.cpp.
|
static |
|
static |
Relay (gossip) an address to a few randomly chosen nodes.
We choose the same nodes within a given 24h window (if the list of connected nodes does not change) and we don't relay to nodes that already know an address. So within 24h we will likely relay a given address once. This is to prevent a peer from unjustly giving their address better propagation by sending it to us repeatedly.
[in] | originator | The peer that sent us the address. We don't want to relay it back. |
[in] | addr | Address to relay. |
[in] | fReachable | Whether the address' network is reachable. We relay unreachable addresses less. |
[in] | connman | Connection manager to choose nodes to relay to. |
Definition at line 1629 of file net_processing.cpp.
Relay transaction to every node.
Definition at line 1601 of file net_processing.cpp.
void UpdateLastBlockAnnounceTime | ( | NodeId | node, |
int64_t | time_in_seconds | ||
) |
|
static |
Average delay between peer address broadcasts.
Definition at line 124 of file net_processing.cpp.
|
static |
Verify that INVENTORY_MAX_RECENT_RELAY is enough to cache everything typically relayed before unconditional relay from the mempool kicks in.
This is only a lower bound, and it should be larger to account for higher inv rate to outbound peers, and random variations in the broadcast mechanism. Average delay between feefilter broadcasts in seconds.
Definition at line 141 of file net_processing.cpp.
|
static |
Average delay between local address broadcasts.
Definition at line 122 of file net_processing.cpp.
|
static |
Block download timeout base, expressed in millionths of the block interval (i.e.
10 min)
Definition at line 112 of file net_processing.cpp.
|
static |
Additional block download timeout per parallel downloading peer (i.e.
5 min)
Definition at line 114 of file net_processing.cpp.
|
static |
Size of the "block download window": how far ahead of our current height do we fetch? Larger windows tolerate larger download speed differences between peer, but increase the potential degree of disordering of blocks on disk (which make reindexing and pruning harder).
We'll probably want to make this a per-peer adaptive value at some point.
Definition at line 110 of file net_processing.cpp.
|
static |
Timeout in seconds during which a peer must stall block download progress before being disconnected.
Definition at line 97 of file net_processing.cpp.
|
static |
Timeout for (unprotected) outbound peers to sync to our chainwork, in seconds.
Definition at line 55 of file net_processing.cpp.
|
static |
Definition at line 1431 of file net_processing.cpp.
|
static |
How frequently to check for extra outbound peers and disconnect, in seconds.
Definition at line 59 of file net_processing.cpp.
RecursiveMutex g_cs_orphans |
Guards orphan transactions and extra txs for compact blocks.
Definition at line 160 of file net_processing.cpp.
|
static |
How long to wait (in microseconds) before downloading a transaction from an additional peer.
Definition at line 91 of file net_processing.cpp.
|
static |
Headers download timeout expressed in microseconds Timeout = base + per_header * (expected number of headers)
Definition at line 48 of file net_processing.cpp.
|
static |
Definition at line 49 of file net_processing.cpp.
|
static |
Age after which a block is considered historical for purposes of rate limiting block relay.
Set to one week, denominated in seconds.
Definition at line 69 of file net_processing.cpp.
|
static |
Definition at line 4860 of file net_processing.cpp.
|
static |
Average delay between trickled inventory transmissions in seconds.
Blocks and peers with noban permission bypass this, outbound peers get half this delay.
Definition at line 127 of file net_processing.cpp.
|
static |
Maximum number of inventory items to send per transmission.
Definition at line 132 of file net_processing.cpp.
|
static |
Maximum rate of inventory items to send per second.
Limits the impact of low-fee transaction floods.
Definition at line 130 of file net_processing.cpp.
|
static |
The number of most recently announced transactions a peer can request.
Definition at line 134 of file net_processing.cpp.
std::deque<CInv>::iterator it = peer.m_getdata_requests.begin() |
Definition at line 1859 of file net_processing.cpp.
void peer m_getdata_requests_mutex |
Definition at line 1856 of file net_processing.cpp.
|
static |
Number of blocks that can be requested at any given time from a single peer.
Definition at line 95 of file net_processing.cpp.
|
static |
Maximum number of headers to announce when relaying blocks with headers message.
Definition at line 116 of file net_processing.cpp.
|
static |
Maximum depth of blocks we're willing to respond to GETBLOCKTXN requests for.
Definition at line 105 of file net_processing.cpp.
|
static |
Maximum depth of blocks we're willing to serve as compact blocks to peers when requested.
For older blocks, a regular BLOCK response will be sent.
Definition at line 103 of file net_processing.cpp.
|
static |
Maximum feefilter broadcast delay after significant change.
Definition at line 143 of file net_processing.cpp.
|
static |
Maximum number of cf hashes that may be requested with one getcfheaders.
See BIP 157.
Definition at line 147 of file net_processing.cpp.
|
static |
Maximum number of compact filters that may be requested with one getcfilters.
See BIP 157.
Definition at line 145 of file net_processing.cpp.
|
static |
Limit to avoid sending big packets.
Not used in processing incoming GETDATA for compatibility
Definition at line 93 of file net_processing.cpp.
|
static |
Number of headers sent in one getheaders result.
We rely on the assumption that if a peer sends less than this number, we reached its tip. Changing this value is a protocol upgrade.
Definition at line 100 of file net_processing.cpp.
|
static |
The maximum number of entries in an 'inv' protocol message.
Definition at line 75 of file net_processing.cpp.
|
static |
The maximum number of entries in a locator.
Definition at line 73 of file net_processing.cpp.
|
static |
Protect at least this many outbound peers from disconnection due to slow/ behind headers chain.
Definition at line 53 of file net_processing.cpp.
|
static |
the maximum percentage of addresses from our addrman to return in response to a getaddr message.
Definition at line 149 of file net_processing.cpp.
|
static |
Maximum number of transactions to consider for requesting, per peer.
It provides a reasonable DoS limit to per-peer memory usage spent on announcements, while covering peers continuously sending INVs at the maximum rate (by our own policy, see INVENTORY_BROADCAST_PER_SECOND) for several minutes, while not receiving the actual transaction (from any peer) in response to requests for them.
Definition at line 83 of file net_processing.cpp.
|
static |
Maximum number of in-flight transaction requests from a peer.
It is not a hard limit, but the threshold at which point the OVERLOADED_PEER_TX_DELAY kicks in.
Definition at line 78 of file net_processing.cpp.
|
static |
Maximum number of unconnecting headers announcements before DoS score.
Definition at line 118 of file net_processing.cpp.
const std::chrono::seconds mempool_req |
Definition at line 1865 of file net_processing.cpp.
|
static |
Minimum time an outbound-peer-eviction candidate must be connected for, in order to evict, in seconds.
Definition at line 61 of file net_processing.cpp.
|
static |
Minimum blocks required to signal NODE_NETWORK_LIMITED.
Definition at line 120 of file net_processing.cpp.
|
static |
How long to delay requesting transactions from non-preferred peers.
Definition at line 87 of file net_processing.cpp.
const std::chrono::seconds now = GetTime<std::chrono::seconds>() |
Definition at line 1863 of file net_processing.cpp.
|
static |
Minimum time between orphan transactions expire time checks in seconds.
Definition at line 41 of file net_processing.cpp.
|
static |
Expiration time for orphan transactions in seconds.
Definition at line 39 of file net_processing.cpp.
|
static |
How long to delay requesting transactions from overloaded peers (see MAX_PEER_TX_REQUEST_IN_FLIGHT).
Definition at line 89 of file net_processing.cpp.
|
static |
Time between pings automatically sent out for latency probing and keepalive.
Definition at line 71 of file net_processing.cpp.
|
static |
SHA256("main address relay")[0:8].
Definition at line 63 of file net_processing.cpp.
|
static |
How long to cache transactions in mapRelay for normal relay.
Definition at line 43 of file net_processing.cpp.
|
static |
How frequently to check for stale tips, in seconds.
Definition at line 57 of file net_processing.cpp.
|
static |
Age after which a stale block will no longer be served if requested as protection against fingerprinting.
Set to one month, denominated in seconds.
Definition at line 66 of file net_processing.cpp.
|
static |
How long to delay requesting transactions via txids, if we have wtxid-relaying peers.
Definition at line 85 of file net_processing.cpp.
|
static |
How long a transaction has to be in the mempool before it can unconditionally be relayed (even when not in mapRelay).
Definition at line 45 of file net_processing.cpp.
std::vector<CInv> vNotFound |
Definition at line 1860 of file net_processing.cpp.