@ -4698,25 +4698,23 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
LOCK ( cs_vNodes ) ;
LOCK ( cs_vNodes ) ;
// Use deterministic randomness to send to the same nodes for 24 hours
// Use deterministic randomness to send to the same nodes for 24 hours
// at a time so the addrKnowns of the chosen nodes prevent repeats
// at a time so the addrKnowns of the chosen nodes prevent repeats
static uint256 hashSalt ;
static uint64_t salt0 = 0 , salt1 = 0 ;
if ( hashSalt . IsNull ( ) )
while ( salt0 = = 0 & & salt1 = = 0 ) {
hashSalt = GetRandHash ( ) ;
GetRandBytes ( ( unsigned char * ) & salt0 , sizeof ( salt0 ) ) ;
GetRandBytes ( ( unsigned char * ) & salt1 , sizeof ( salt1 ) ) ;
}
uint64_t hashAddr = addr . GetHash ( ) ;
uint64_t hashAddr = addr . GetHash ( ) ;
uint256 hashRand = ArithToUint256 ( UintToArith256 ( hashSalt ) ^ ( hashAddr < < 32 ) ^ ( ( GetTime ( ) + hashAddr ) / ( 24 * 60 * 60 ) ) ) ;
multimap < uint64_t , CNode * > mapMix ;
hashRand = Hash ( BEGIN ( hashRand ) , END ( hashRand ) ) ;
const CSipHasher hasher = CSipHasher ( salt0 , salt1 ) . Write ( hashAddr < < 32 ) . Write ( ( GetTime ( ) + hashAddr ) / ( 24 * 60 * 60 ) ) ;
multimap < uint256 , CNode * > mapMix ;
BOOST_FOREACH ( CNode * pnode , vNodes )
BOOST_FOREACH ( CNode * pnode , vNodes )
{
{
if ( pnode - > nVersion < CADDR_TIME_VERSION )
if ( pnode - > nVersion < CADDR_TIME_VERSION )
continue ;
continue ;
unsigned int nPointer ;
uint64_t hashKey = CSipHasher ( hasher ) . Write ( pnode - > id ) . Finalize ( ) ;
memcpy ( & nPointer , & pnode , sizeof ( nPointer ) ) ;
uint256 hashKey = ArithToUint256 ( UintToArith256 ( hashRand ) ^ nPointer ) ;
hashKey = Hash ( BEGIN ( hashKey ) , END ( hashKey ) ) ;
mapMix . insert ( make_pair ( hashKey , pnode ) ) ;
mapMix . insert ( make_pair ( hashKey , pnode ) ) ;
}
}
int nRelayNodes = fReachable ? 2 : 1 ; // limited relaying of addresses outside our network(s)
int nRelayNodes = fReachable ? 2 : 1 ; // limited relaying of addresses outside our network(s)
for ( multimap < uint256 , CNode * > : : iterator mi = mapMix . begin ( ) ; mi ! = mapMix . end ( ) & & nRelayNodes - - > 0 ; + + mi )
for ( multimap < uint64_t , CNode * > : : iterator mi = mapMix . begin ( ) ; mi ! = mapMix . end ( ) & & nRelayNodes - - > 0 ; + + mi )
( ( * mi ) . second ) - > PushAddress ( addr ) ;
( ( * mi ) . second ) - > PushAddress ( addr ) ;
}
}
}
}