From c9faa92098d9307156ab92004632757d38321041 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Mon, 4 Oct 2021 15:51:28 +0200 Subject: [PATCH] StratumServer: fixed "bad share" ban logic --- src/stratum_server.cpp | 8 +++++++- src/stratum_server.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index 69d1fec..e24e9b0 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -336,6 +336,7 @@ bool StratumServer::on_submit(StratumClient* client, uint32_t id, const char* jo share->m_req.data = share; share->m_server = this; share->m_client = client; + share->m_clientAddr = client->m_addr; share->m_clientResetCounter = client->m_resetCounter.load(); share->m_rpcId = client->m_rpcId; share->m_id = id; @@ -672,6 +673,8 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) StratumClient* client = share->m_client; StratumServer* server = share->m_server; + const bool bad_share = (share->m_result == SubmittedShare::Result::LOW_DIFF) || (share->m_result == SubmittedShare::Result::INVALID_POW); + if ((client->m_resetCounter.load() == share->m_clientResetCounter) && (client->m_rpcId == share->m_rpcId)) { const bool result = server->send(client, [share](void* buf) @@ -697,7 +700,7 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) return s.m_pos; }); - if ((share->m_result == SubmittedShare::Result::LOW_DIFF) || (share->m_result == SubmittedShare::Result::INVALID_POW)) { + if (bad_share) { client->ban(DEFAULT_BAN_TIME); client->close(); } @@ -705,6 +708,9 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) client->close(); } } + else if (bad_share) { + server->ban(share->m_clientAddr, DEFAULT_BAN_TIME); + } } StratumServer::StratumClient::StratumClient() diff --git a/src/stratum_server.h b/src/stratum_server.h index 0b608eb..eed7bfc 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -112,6 +112,7 @@ private: uv_work_t m_req; StratumServer* m_server; StratumClient* m_client; + raw_ip m_clientAddr; uint32_t m_clientResetCounter; uint32_t m_rpcId; uint32_t m_id;