@ -1530,7 +1530,6 @@ static void RelayAddress(const CNode& originator,
void PeerManagerImpl : : ProcessGetBlockData ( CNode & pfrom , Peer & peer , const CInv & inv )
{
bool send = false ;
std : : shared_ptr < const CBlock > a_recent_block ;
std : : shared_ptr < const CBlockHeaderAndShortTxIDs > a_recent_compact_block ;
bool fWitnessesPresentInARecentCompactBlock ;
@ -1566,35 +1565,37 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
LOCK ( cs_main ) ;
const CBlockIndex * pindex = m_chainman . m_blockman . LookupBlockIndex ( inv . hash ) ;
if ( pindex ) {
send = BlockRequestAllowed ( pindex ) ;
if ( ! send ) {
LogPrint ( BCLog : : NET , " %s: ignoring request from peer=%i for old block that isn't in the main chain \n " , __func__ , pfrom . GetId ( ) ) ;
}
if ( ! pindex ) {
return ;
}
if ( ! BlockRequestAllowed ( pindex ) ) {
LogPrint ( BCLog : : NET , " %s: ignoring request from peer=%i for old block that isn't in the main chain \n " , __func__ , pfrom . GetId ( ) ) ;
return ;
}
const CNetMsgMaker msgMaker ( pfrom . GetCommonVersion ( ) ) ;
// disconnect node in case we have reached the outbound limit for serving historical blocks
if ( send & &
m_connman . OutboundTargetReached ( true ) & &
if ( m_connman . OutboundTargetReached ( true ) & &
( ( ( pindexBestHeader ! = nullptr ) & & ( pindexBestHeader - > GetBlockTime ( ) - pindex - > GetBlockTime ( ) > HISTORICAL_BLOCK_AGE ) ) | | inv . IsMsgFilteredBlk ( ) ) & &
! pfrom . HasPermission ( PF_DOWNLOAD ) // nodes with the download permission may exceed target
) {
LogPrint ( BCLog : : NET , " historical block serving limit reached, disconnect peer=%d \n " , pfrom . GetId ( ) ) ;
pfrom . fDisconnect = true ;
send = false ;
return ;
}
// Avoid leaking prune-height by never sending blocks below the NODE_NETWORK_LIMITED threshold
if ( send & & ! pfrom . HasPermission ( PF_NOBAN ) & & (
if ( ! pfrom . HasPermission ( PF_NOBAN ) & & (
( ( ( pfrom . GetLocalServices ( ) & NODE_NETWORK_LIMITED ) = = NODE_NETWORK_LIMITED ) & & ( ( pfrom . GetLocalServices ( ) & NODE_NETWORK ) ! = NODE_NETWORK ) & & ( m_chainman . ActiveChain ( ) . Tip ( ) - > nHeight - pindex - > nHeight > ( int ) NODE_NETWORK_LIMITED_MIN_BLOCKS + 2 /* add two blocks buffer extension for possible races */ ) )
) ) {
LogPrint ( BCLog : : NET , " Ignore block request below NODE_NETWORK_LIMITED threshold, disconnect peer=%d \n " , pfrom . GetId ( ) ) ;
//disconnect node and prevent it from stalling (would otherwise wait for the missing block)
pfrom . fDisconnect = true ;
send = false ;
return ;
}
// Pruned nodes may have deleted the block, so check whether
// it's available before trying to send.
if ( send & & ( pindex - > nStatus & BLOCK_HAVE_DATA ) )
if ( ! ( pindex - > nStatus & BLOCK_HAVE_DATA ) ) {
return ;
}
{
std : : shared_ptr < const CBlock > pblock ;
if ( a_recent_block & & a_recent_block - > GetHash ( ) = = pindex - > GetBlockHash ( ) ) {