diff --git a/docs/COMMAND_LINE.MD b/docs/COMMAND_LINE.MD index 20193e8..eda2d88 100644 --- a/docs/COMMAND_LINE.MD +++ b/docs/COMMAND_LINE.MD @@ -8,6 +8,7 @@ --stratum Comma-separated list of IP:port for stratum server to listen on --p2p Comma-separated list of IP:port for p2p server to listen on --addpeers Comma-separated list of IP:port of other p2pool nodes to connect to +--stratum-ban-time N Number of seconds to ban misbehaving stratum client, default is 600 --light-mode Don't allocate RandomX dataset, saves 2GB of RAM --loglevel Verbosity of the log, integer number between 0 and 6 --data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory diff --git a/src/main.cpp b/src/main.cpp index 3f8eed5..d294780 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,6 +62,7 @@ void p2pool_usage() "--stratum Comma-separated list of IP:port for stratum server to listen on\n" "--p2p Comma-separated list of IP:port for p2p server to listen on\n" "--addpeers Comma-separated list of IP:port of other p2pool nodes to connect to\n" + "--stratum-ban-time N Number of seconds to ban misbehaving stratum client, default is %u\n" "--light-mode Don't allocate RandomX dataset, saves 2GB of RAM\n" "--loglevel Verbosity of the log, integer number between 0 and %d\n" "--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory\n" @@ -102,6 +103,7 @@ void p2pool_usage() "Example command line:\n\n" "%s --host 127.0.0.1 --rpc-port 18081 --zmq-port 18083 --wallet YOUR_WALLET_ADDRESS --stratum 0.0.0.0:%d --p2p 0.0.0.0:%d\n\n", p2pool::VERSION, + static_cast(p2pool::DEFAULT_STRATUM_BAN_TIME), p2pool::log::MAX_GLOBAL_LOG_LEVEL, p2pool::DEFAULT_P2P_PORT, p2pool::DEFAULT_P2P_PORT_MINI, diff --git a/src/params.cpp b/src/params.cpp index 247d350..f839d0c 100644 --- a/src/params.cpp +++ b/src/params.cpp @@ -26,6 +26,9 @@ void p2pool_usage(); namespace p2pool { +static constexpr uint64_t MIN_STRATUM_BAN_TIME = UINT64_C(1); +static constexpr uint64_t MAX_STRATUM_BAN_TIME = (UINT64_C(1) << 34) - 1; + Params::Params(int argc, char* const argv[]) { for (int i = 1; i < argc; ++i) { @@ -79,6 +82,11 @@ Params::Params(int argc, char* const argv[]) ok = true; } + if ((strcmp(argv[i], "--stratum-ban-time") == 0) && (i + 1 < argc)) { + m_stratumBanTime = strtoull(argv[++i], nullptr, 10); + ok = true; + } + if ((strcmp(argv[i], "--p2p") == 0) && (i + 1 < argc)) { m_p2pAddresses = argv[++i]; ok = true; @@ -284,6 +292,14 @@ Params::Params(int argc, char* const argv[]) m_stratumAddresses = buf; } + + if(m_stratumBanTime < MIN_STRATUM_BAN_TIME) { + LOGWARN(1, "Value for --stratum-ban-time is too low, adjusting to " << MIN_STRATUM_BAN_TIME); + m_stratumBanTime = MIN_STRATUM_BAN_TIME; + } else if(m_stratumBanTime > MAX_STRATUM_BAN_TIME) { + LOGWARN(1, "Value for --stratum-ban-time is too high, adjusting to " << MAX_STRATUM_BAN_TIME); + m_stratumBanTime = MAX_STRATUM_BAN_TIME; + } } bool Params::valid() const diff --git a/src/params.h b/src/params.h index e8c8a84..4d6fe33 100644 --- a/src/params.h +++ b/src/params.h @@ -21,6 +21,8 @@ namespace p2pool { +static constexpr uint64_t DEFAULT_STRATUM_BAN_TIME = 600; + struct Params { Params(int argc, char* const argv[]); @@ -74,6 +76,7 @@ struct Params std::string m_p2pPeerList; std::string m_sidechainConfig; std::string m_apiPath; + uint64_t m_stratumBanTime = DEFAULT_STRATUM_BAN_TIME; bool m_localStats = false; bool m_blockCache = true; #ifdef WITH_RANDOMX diff --git a/src/stratum_server.cpp b/src/stratum_server.cpp index d305cda..6077e0d 100644 --- a/src/stratum_server.cpp +++ b/src/stratum_server.cpp @@ -29,7 +29,6 @@ LOG_CATEGORY(StratumServer) static constexpr int DEFAULT_BACKLOG = 128; -static constexpr uint64_t DEFAULT_BAN_TIME = 600; static constexpr uint64_t MIN_DIFF = 1000; static constexpr uint64_t AUTO_DIFF_TARGET_TIME = 30; @@ -84,6 +83,7 @@ StratumServer::StratumServer(p2pool* pool) m_showWorkersAsync.data = this; const Params& params = pool->params(); + m_banTime = params.m_stratumBanTime; start_listening(params.m_stratumAddresses, params.m_upnp && params.m_upnpStratum); } @@ -791,7 +791,7 @@ void StratumServer::on_blobs_ready() // Not logged in yet, on_login() will send the job to this client. Also close inactive connections. if (cur_time >= client->m_connectedTime + 10) { LOGWARN(4, "client " << static_cast(client->m_addrString) << " didn't send login data"); - client->ban(DEFAULT_BAN_TIME); + client->ban(m_banTime); client->close(); } continue; @@ -1106,7 +1106,7 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) client->m_score += share->m_score; if (bad_share && (client->m_score <= BAN_THRESHOLD_POINTS)) { - client->ban(DEFAULT_BAN_TIME); + client->ban(server->m_banTime); client->close(); } else if (!result) { @@ -1114,7 +1114,7 @@ void StratumServer::on_after_share_found(uv_work_t* req, int /*status*/) } } else if (bad_share) { - server->ban(share->m_clientIPv6, share->m_clientAddr, DEFAULT_BAN_TIME); + server->ban(share->m_clientIPv6, share->m_clientAddr, server->m_banTime); } if (share->m_allocated) { @@ -1224,7 +1224,7 @@ bool StratumServer::StratumClient::on_read(const char* data, uint32_t size) auto on_parse = [this](const char* data, uint32_t size) { if (static_cast(m_stratumReadBufBytes) + size > STRATUM_BUF_SIZE) { LOGWARN(4, "client " << static_cast(m_addrString) << " sent too long Stratum message"); - ban(DEFAULT_BAN_TIME); + ban(static_cast(m_owner)->m_banTime); return false; } @@ -1252,7 +1252,7 @@ bool StratumServer::StratumClient::on_read(const char* data, uint32_t size) *c = '\0'; if (!process_request(line_start, static_cast(c - line_start))) { - ban(DEFAULT_BAN_TIME); + ban(static_cast(m_owner)->m_banTime); return false; } diff --git a/src/stratum_server.h b/src/stratum_server.h index 463ab9f..d1a6d7e 100644 --- a/src/stratum_server.h +++ b/src/stratum_server.h @@ -205,6 +205,8 @@ private: uint32_t m_totalFailedSidechainShares; uint64_t m_totalStratumShares; + uint64_t m_banTime; + std::atomic m_apiLastUpdateTime; std::deque m_pendingShareChecks;