From e9c14ef3d018364e0f441a7aa404a40f9068e59f Mon Sep 17 00:00:00 2001 From: SChernykh <15806605+SChernykh@users.noreply.github.com> Date: Sun, 28 Sep 2025 15:33:58 +0200 Subject: [PATCH] Don't send the same Monero block broadcast to peers who sent it already --- src/p2p_server.cpp | 19 ++++++++++++------- src/p2p_server.h | 4 +++- src/p2pool.cpp | 6 +++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index b62489a..53dd20b 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -1712,13 +1712,19 @@ void P2PServer::broadcast_monero_block(const uint8_t* data, uint32_t data_size, return; } - if (!duplicate_check_done && !store_monero_block_broadcast(data + sizeof(MoneroBlockBroadcastHeader), data_size - sizeof(MoneroBlockBroadcastHeader))) { + hash digest; + sha256(data + sizeof(MoneroBlockBroadcastHeader), data_size - sizeof(MoneroBlockBroadcastHeader), digest.h); + + if (!duplicate_check_done && !store_monero_block_broadcast(digest)) { LOGINFO(6, "broadcast_monero_block: skipping duplicate broadcast"); return; } for (P2PClient* client = static_cast(m_connectedClientsList->m_next); client != m_connectedClientsList; client = static_cast(client->m_next)) { - if ((source && (client == source)) || !client->is_good() || (client->m_protocolVersion < PROTOCOL_VERSION_1_4)) { + if ((source && (client == source)) || + !client->is_good() || + (client->m_protocolVersion < PROTOCOL_VERSION_1_4) || + (client->m_lastMoneroBlockBroadcastDigest == digest)) { continue; } @@ -1749,11 +1755,8 @@ void P2PServer::broadcast_monero_block(const uint8_t* data, uint32_t data_size, } } -bool P2PServer::store_monero_block_broadcast(const uint8_t* data, uint32_t data_size) +bool P2PServer::store_monero_block_broadcast(const hash& digest) { - hash digest; - sha256(data, data_size, digest.h); - // Every message can be received from multiple peers, so broadcast it only once MutexLock lock(m_MoneroBlockBroadcastsLock); return m_MoneroBlockBroadcasts.emplace(*digest.u64(), seconds_since_epoch()).second; @@ -3069,8 +3072,10 @@ bool P2PServer::P2PClient::on_monero_block_broadcast(const uint8_t* buf, uint32_ return true; } + sha256(buf, size, m_lastMoneroBlockBroadcastDigest.h); + // Ignore repeated old messages - if (!server->store_monero_block_broadcast(buf, size)) { + if (!server->store_monero_block_broadcast(m_lastMoneroBlockBroadcastDigest)) { LOGINFO(6, "Repeated MONERO_BLOCK_BROADCAST - ignored"); return true; } diff --git a/src/p2p_server.h b/src/p2p_server.h index 0ed3b4d..9b5b7a4 100644 --- a/src/p2p_server.h +++ b/src/p2p_server.h @@ -162,6 +162,8 @@ public: hash m_broadcastedHashes[8]; uint32_t m_broadcastedHashesIndex; + hash m_lastMoneroBlockBroadcastDigest; + // log::Stream wrapper struct SoftwareDisplayName { @@ -220,7 +222,7 @@ public: void broadcast_monero_block_handler(); void broadcast_monero_block(const uint8_t* data, uint32_t data_size, const P2PClient* source, bool duplicate_check_done); - bool store_monero_block_broadcast(const uint8_t* data, uint32_t data_size); + bool store_monero_block_broadcast(const hash& digest); private: [[nodiscard]] const char* get_log_category() const override; diff --git a/src/p2pool.cpp b/src/p2pool.cpp index 2f87d88..0167e54 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -42,6 +42,7 @@ #include "keccak.h" #include "merkle.h" #include "merge_mining_client.h" +#include "sha256.h" #ifdef WITH_TLS #include @@ -1146,7 +1147,10 @@ void p2pool::submit_block() const } request.append("\"]}"); - m_p2pServer->store_monero_block_broadcast(blob.data(), static_cast(blob.size())); + hash digest; + sha256(blob.data(), static_cast(blob.size()), digest.h); + + m_p2pServer->store_monero_block_broadcast(digest); const Params::Host& host = current_host();