From b2f86a5f6bc2498b05830381c4867b4fac7e2a03 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Sat, 23 Apr 2022 11:29:17 +0200 Subject: [PATCH] Ban peers with stuck or lagging monerod --- src/p2p_server.cpp | 17 ++++++++++++++++- src/p2p_server.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/p2p_server.cpp b/src/p2p_server.cpp index 4aa49bb..51055a2 100644 --- a/src/p2p_server.cpp +++ b/src/p2p_server.cpp @@ -1030,6 +1030,7 @@ P2PServer::P2PClient::P2PClient() , m_peerListPendingRequests(0) , m_pingTime(0) , m_blockPendingRequests(0) + , m_chainTipBlockRequest(false) , m_lastAlive(0) , m_lastBroadcastTimestamp(0) , m_lastBlockrequestTimestamp(0) @@ -1059,6 +1060,7 @@ void P2PServer::P2PClient::reset() m_peerListPendingRequests = 0; m_pingTime = 0; m_blockPendingRequests = 0; + m_chainTipBlockRequest = false; m_lastAlive = 0; m_lastBroadcastTimestamp = 0; m_lastBlockrequestTimestamp = 0; @@ -1642,6 +1644,7 @@ void P2PServer::P2PClient::on_after_handshake(uint8_t* &p) p += HASH_SIZE; ++m_blockPendingRequests; + m_chainTipBlockRequest = true; m_lastBroadcastTimestamp = seconds_since_epoch(); } @@ -1714,6 +1717,18 @@ bool P2PServer::P2PClient::on_block_response(const uint8_t* buf, uint32_t size) return false; } + if (m_chainTipBlockRequest) { + m_chainTipBlockRequest = false; + + const uint64_t peer_height = server->m_block->m_txinGenHeight; + const uint64_t our_height = server->m_pool->miner_data().height; + + if (peer_height + 2 < our_height) { + LOGWARN(4, "peer " << static_cast(m_addrString) << " is mining on top of a stale block (mainchain height " << peer_height << ", expected >= " << our_height << ')'); + return false; + } + } + return handle_incoming_block_async(server->m_block); } @@ -1756,7 +1771,7 @@ bool P2PServer::P2PClient::on_block_broadcast(const uint8_t* buf, uint32_t size) } } else { - LOGWARN(5, "peer " << static_cast(m_addrString) << " broadcasted an unreasonably stale block (mainchain height " << peer_height << ", expected >= " << our_height << ')'); + LOGWARN(4, "peer " << static_cast(m_addrString) << " broadcasted an unreasonably stale block (mainchain height " << peer_height << ", expected >= " << our_height << ')'); return false; } } diff --git a/src/p2p_server.h b/src/p2p_server.h index 0bdb8f1..35cc3e0 100644 --- a/src/p2p_server.h +++ b/src/p2p_server.h @@ -117,6 +117,7 @@ public: int64_t m_pingTime; int m_blockPendingRequests; + bool m_chainTipBlockRequest; uint64_t m_lastAlive; uint64_t m_lastBroadcastTimestamp;