diff --git a/src/net.cpp b/src/net.cpp index ae61ea51b..868413c7f 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -118,6 +118,9 @@ extern void StartShutdown(); vector vNodes; CCriticalSection cs_vNodes; +vector vRelayNodes; +CCriticalSection cs_vRelayNodes; + map mapRelay; deque > 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); diff --git a/src/net.h b/src/net.h index d55d500e1..3e436a867 100644 --- a/src/net.h +++ b/src/net.h @@ -179,6 +179,9 @@ extern int nMaxConnections; extern std::vector vNodes; extern CCriticalSection cs_vNodes; +extern std::vector vRelayNodes; +extern CCriticalSection cs_vRelayNodes; + extern std::map mapRelay; extern std::deque > vRelayExpiration; extern CCriticalSection cs_mapRelay;