diff --git a/src/base/net/stratum/DaemonClient.cpp b/src/base/net/stratum/DaemonClient.cpp index 554ee8a8..07cc7360 100644 --- a/src/base/net/stratum/DaemonClient.cpp +++ b/src/base/net/stratum/DaemonClient.cpp @@ -179,12 +179,30 @@ void xmrig::DaemonClient::onHttpData(const HttpData &data) return send(kGetInfo); } - if (isOutdated(Json::getUint64(doc, kHeight), Json::getString(doc, kHash))) { - getBlockTemplate(); + const uint64_t height = Json::getUint64(doc, kHeight); + const String hash = Json::getString(doc, kHash); + + if (isOutdated(height, hash)) { + // Multiple /getheight responses can come at once resulting in multiple getBlockTemplate() calls + if ((height != m_blocktemplateRequestHeight) || (hash != m_blocktemplateRequestHash)) { + m_blocktemplateRequestHeight = height; + m_blocktemplateRequestHash = hash; + getBlockTemplate(); + } } } - else if (data.url == kGetInfo && isOutdated(Json::getUint64(doc, kHeight), Json::getString(doc, "top_block_hash"))) { - getBlockTemplate(); + else if (data.url == kGetInfo) { + const uint64_t height = Json::getUint64(doc, kHeight); + const String hash = Json::getString(doc, "top_block_hash"); + + if (isOutdated(height, hash)) { + // Multiple /getinfo responses can come at once resulting in multiple getBlockTemplate() calls + if ((height != m_blocktemplateRequestHeight) || (hash != m_blocktemplateRequestHash)) { + m_blocktemplateRequestHeight = height; + m_blocktemplateRequestHash = hash; + getBlockTemplate(); + } + } } return; diff --git a/src/base/net/stratum/DaemonClient.h b/src/base/net/stratum/DaemonClient.h index 94858b50..ff4f9e04 100644 --- a/src/base/net/stratum/DaemonClient.h +++ b/src/base/net/stratum/DaemonClient.h @@ -89,6 +89,8 @@ private: String m_tlsFingerprint; String m_tlsVersion; Timer *m_timer; + uint64_t m_blocktemplateRequestHeight = 0; + String m_blocktemplateRequestHash; };