Make ban time of stratum clients configurable via '--stratum-ban-time' option

This commit is contained in:
WHR
2025-06-10 18:17:48 +08:00
parent 3ac7c0c243
commit 6c4520481b
6 changed files with 30 additions and 6 deletions

View File

@@ -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

View File

@@ -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<uint32_t>(p2pool::DEFAULT_STRATUM_BAN_TIME),
p2pool::log::MAX_GLOBAL_LOG_LEVEL,
p2pool::DEFAULT_P2P_PORT,
p2pool::DEFAULT_P2P_PORT_MINI,

View File

@@ -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

View File

@@ -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

View File

@@ -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<char*>(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<size_t>(m_stratumReadBufBytes) + size > STRATUM_BUF_SIZE) {
LOGWARN(4, "client " << static_cast<const char*>(m_addrString) << " sent too long Stratum message");
ban(DEFAULT_BAN_TIME);
ban(static_cast<StratumServer*>(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<uint32_t>(c - line_start))) {
ban(DEFAULT_BAN_TIME);
ban(static_cast<StratumServer*>(m_owner)->m_banTime);
return false;
}

View File

@@ -205,6 +205,8 @@ private:
uint32_t m_totalFailedSidechainShares;
uint64_t m_totalStratumShares;
uint64_t m_banTime;
std::atomic<uint64_t> m_apiLastUpdateTime;
std::deque<SubmittedShare*> m_pendingShareChecks;