diff --git a/.gitignore b/.gitignore index 3db117d4..61033553 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,9 @@ scripts/deps /CMakeLists.txt.user /.idea /src/backend/opencl/cl/cn/cryptonight_gen.cl +*.a +CMakeCache.txt +CMakeFiles/ +Makefile +cmake_install.cmake +/xmrig \ No newline at end of file diff --git a/src/base/net/stratum/SelfSelectClient.cpp b/src/base/net/stratum/SelfSelectClient.cpp index 2dca057a..ff10a9ea 100644 --- a/src/base/net/stratum/SelfSelectClient.cpp +++ b/src/base/net/stratum/SelfSelectClient.cpp @@ -46,6 +46,8 @@ static const char *kJobId = "job_id"; static const char *kNextSeedHash = "next_seed_hash"; static const char *kPrevHash = "prev_hash"; static const char *kSeedHash = "seed_hash"; +static const char *kStatus = "status"; +static const char *kStatusOk = "OK"; static const char * const required_fields[] = { kBlocktemplateBlob, kBlockhashingBlob, kHeight, kDifficulty, kPrevHash }; @@ -56,8 +58,9 @@ xmrig::SelfSelectClient::SelfSelectClient(int id, const char *agent, IClientList m_submitToOrigin(submitToOrigin), m_listener(listener) { - m_httpListener = std::make_shared(this); - m_client = new Client(id, agent, this); + m_httpListener = std::make_shared(this); + m_client = new Client(id, agent, this); + m_last_submit_req_id = -1; } @@ -123,6 +126,20 @@ bool xmrig::SelfSelectClient::parseResponse(int64_t id, rapidjson::Value &result return false; } + if (isSubmitBlockResponse(id)) { + xmrig::String submit_status = Json::getString(result, kStatus); + submit_status.toUpper(); + if (submit_status == kStatusOk) { + // Ensure that the latest block template is available after block submission + getBlockTemplate(); + return true; + } + + LOG_ERR("[%s] " RED_BOLD("block not submitted to origin. status = \"%s\""), pool().daemon().url().data(), submit_status.data()); + return false; + } + + for (auto field : required_fields) { if (!result.HasMember(field)) { LOG_ERR("[%s] required field " RED_BOLD("\"%s\"") RED_S " not found", pool().daemon().url().data(), field); @@ -147,6 +164,10 @@ bool xmrig::SelfSelectClient::parseResponse(int64_t id, rapidjson::Value &result return true; } +bool xmrig::SelfSelectClient::isSubmitBlockResponse(int64_t id) +{ + return m_last_submit_req_id > -1 && id == m_last_submit_req_id; +} void xmrig::SelfSelectClient::getBlockTemplate() { @@ -271,8 +292,8 @@ void xmrig::SelfSelectClient::submitOriginDaemon(const JobResult& result) Value params(kArrayType); params.PushBack(m_blocktemplate.toJSON(), doc.GetAllocator()); - JsonRequest::create(doc, m_sequence, "submitblock", params); - m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff(), 0, result.backend); + m_last_submit_req_id = m_sequence; + JsonRequest::create(doc, m_sequence++, "submitblock", params); FetchRequest req(HTTP_POST, pool().daemon().host(), pool().daemon().port(), "/json_rpc", doc, pool().daemon().isTLS(), isQuiet()); fetch(tag(), std::move(req), m_httpListener); @@ -282,8 +303,6 @@ void xmrig::SelfSelectClient::submitOriginDaemon(const JobResult& result) " diff " WHITE("%" PRIu64) " vs. " WHITE("%" PRIu64), Tags::origin(), m_originSubmitted, m_originNotSubmitted, m_blockDiff, result.actualDiff(), result.diff); - // Ensure that the latest block template is available after block submission - getBlockTemplate(); } void xmrig::SelfSelectClient::onHttpData(const HttpData &data) diff --git a/src/base/net/stratum/SelfSelectClient.h b/src/base/net/stratum/SelfSelectClient.h index c73198a5..ba3f35f0 100644 --- a/src/base/net/stratum/SelfSelectClient.h +++ b/src/base/net/stratum/SelfSelectClient.h @@ -99,6 +99,7 @@ private: void getBlockTemplate(); void retry(); void setState(State state); + bool isSubmitBlockResponse(int64_t id); void submitBlockTemplate(rapidjson::Value &result); void submitOriginDaemon(const JobResult &result); @@ -112,8 +113,8 @@ private: int64_t m_sequence = 1; Job m_job; State m_state = IdleState; - std::map m_results; - std::shared_ptr m_httpListener; + int64_t m_last_submit_req_id; + std::shared_ptr m_httpListener; String m_blocktemplate; uint64_t m_blockDiff = 0; uint64_t m_originNotSubmitted = 0;