@ -118,6 +118,9 @@ extern void StartShutdown();
vector < CNode * > vNodes ;
CCriticalSection cs_vNodes ;
vector < CNode * > vRelayNodes ;
CCriticalSection cs_vRelayNodes ;
map < CInv , CDataStream > mapRelay ;
deque < pair < int64_t , CInv > > vRelayExpiration ;
CCriticalSection cs_mapRelay ;
@ -2110,9 +2113,11 @@ void RelayTransaction(const CTransaction& tx, const CDataStream& ss)
mapRelay . insert ( std : : make_pair ( inv , ss ) ) ;
vRelayExpiration . push_back ( std : : make_pair ( GetTime ( ) + 15 * 60 , inv ) ) ;
}
LOCK ( cs_vNodes ) ;
auto vRelayNodes = vNodes ;
LOCK2 ( cs_vNodes , cs_vRelayNodes ) ;
// make a copy of our full node list so we can choose a subset to relay to
vRelayNodes = vNodes ;
// We always round down, except when we have only 1 connection
auto newSize = ( vNodes . size ( ) / 2 ) = = 0 ? 1 : ( vNodes . size ( ) / 2 ) ;
@ -2120,11 +2125,17 @@ void RelayTransaction(const CTransaction& tx, const CDataStream& ss)
random_shuffle ( vRelayNodes . begin ( ) , vRelayNodes . end ( ) , GetRandInt ) ;
vRelayNodes . resize ( newSize ) ;
// We do not log this to debug.log because it leaks metadata about how many
// peers this node had at a certain timestamp
fprintf ( stderr , " %s: Relaying to %lu of %lu peers \n " , __func__ , newSize , vNodes . size ( ) ) ;
// Only relay to randomly chosen 50% of peers
BOOST_FOREACH ( CNode * pnode , vRelayNodes )
{
if ( ! pnode ) {
LogPrintf ( " %s: invalid relay node found, ignoring \n " , __func__ ) ;
continue ;
}
if ( ! pnode - > fRelayTxes )
continue ;
LOCK ( pnode - > cs_filter ) ;