@ -75,8 +75,11 @@ static const unsigned int MAX_INV_SZ = 50000;
/** 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 . */
static constexpr int32_t MAX_PEER_TX_REQUEST_IN_FLIGHT = 100 ;
/** Maximum number of announced transactions from a peer */
static constexpr int32_t MAX_PEER_TX_ANNOUNCEMENTS = 2 * MAX_INV_SZ ;
/** 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 . */
static constexpr int32_t MAX_PEER_TX_ANNOUNCEMENTS = 5000 ;
/** How long to delay requesting transactions via txids, if we have wtxid-relaying peers */
static constexpr auto TXID_RELAY_DELAY = std : : chrono : : seconds { 2 } ;
/** How long to delay requesting transactions from non-preferred peers */
@ -754,7 +757,7 @@ void PeerManager::AddTxAnnouncement(const CNode& node, const GenTxid& gtxid, std
{
AssertLockHeld ( : : cs_main ) ; // For m_txrequest
NodeId nodeid = node . GetId ( ) ;
if ( m_txrequest . Count ( nodeid ) > = MAX_PEER_TX_ANNOUNCEMENTS ) {
if ( ! node . HasPermission ( PF_RELAY ) & & m_txrequest . Count ( nodeid ) > = MAX_PEER_TX_ANNOUNCEMENTS ) {
// Too many queued announcements from this peer
return ;
}
@ -766,12 +769,13 @@ void PeerManager::AddTxAnnouncement(const CNode& node, const GenTxid& gtxid, std
// - NONPREF_PEER_TX_DELAY for announcements from non-preferred connections
// - TXID_RELAY_DELAY for announcements from txid peers while wtxid peers are available
// - OVERLOADED_PEER_TX_DELAY for announcements from peers which have at least
// MAX_PEER_TX_REQUEST_IN_FLIGHT requests in flight .
// MAX_PEER_TX_REQUEST_IN_FLIGHT requests in flight (and don't have PF_RELAY) .
auto delay = std : : chrono : : microseconds { 0 } ;
const bool preferred = state - > fPreferredDownload ;
if ( ! preferred ) delay + = NONPREF_PEER_TX_DELAY ;
if ( ! state - > m_wtxid_relay & & g_wtxid_relay_peers > 0 ) delay + = TXID_RELAY_DELAY ;
const bool overloaded = m_txrequest . CountInFlight ( nodeid ) > = MAX_PEER_TX_REQUEST_IN_FLIGHT ;
const bool overloaded = ! node . HasPermission ( PF_RELAY ) & &
m_txrequest . CountInFlight ( nodeid ) > = MAX_PEER_TX_REQUEST_IN_FLIGHT ;
if ( overloaded ) delay + = OVERLOADED_PEER_TX_DELAY ;
m_txrequest . ReceivedInv ( nodeid , gtxid , preferred , current_time + delay ) ;
}