Added checking for top_block_hash/hash.

This commit is contained in:
XMRig 2019-04-14 03:21:23 +07:00
parent 074b3869d2
commit a3b303e885
2 changed files with 43 additions and 9 deletions

View file

@ -50,8 +50,21 @@
#endif #endif
namespace xmrig {
static const char *kBlocktemplateBlob = "blocktemplate_blob";
static const char *kGetHeight = "/getheight";
static const char *kGetInfo = "/getinfo";
static const char *kHash = "hash";
static const char *kHeight = "height";
static const char *kJsonRPC = "/json_rpc";
}
xmrig::DaemonClient::DaemonClient(int id, IClientListener *listener) : xmrig::DaemonClient::DaemonClient(int id, IClientListener *listener) :
BaseClient(id, listener) BaseClient(id, listener),
m_monero(true)
{ {
m_timer = new Timer(this); m_timer = new Timer(this);
} }
@ -109,7 +122,7 @@ int64_t xmrig::DaemonClient::submit(const JobResult &result)
m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff()); m_results[m_sequence] = SubmitResult(m_sequence, result.diff, result.actualDiff());
# endif # endif
send(HTTP_POST, "/json_rpc", doc); send(HTTP_POST, kJsonRPC, doc);
return m_sequence++; return m_sequence++;
} }
@ -155,8 +168,19 @@ void xmrig::DaemonClient::onHttpData(const HttpData &data)
return retry(); return retry();
} }
if (data.method == HTTP_GET && data.url == "/getheight") { if (data.method == HTTP_GET) {
if (m_job.height() != Json::getUint64(doc, "height")) { if (data.url == kGetHeight) {
if (!doc.HasMember(kHash)) {
m_monero = false;
return send(HTTP_GET, kGetInfo);
}
if (isOutdated(Json::getUint64(doc, kHeight), Json::getString(doc, kHash))) {
getBlockTemplate();
}
}
else if (data.url == kGetInfo && isOutdated(Json::getUint64(doc, kHeight), Json::getString(doc, "top_block_hash"))) {
getBlockTemplate(); getBlockTemplate();
} }
@ -175,27 +199,34 @@ void xmrig::DaemonClient::onTimer(const Timer *)
getBlockTemplate(); getBlockTemplate();
} }
else if (m_state == ConnectedState) { else if (m_state == ConnectedState) {
send(HTTP_GET, "/getheight"); send(HTTP_GET, m_monero ? kGetHeight : kGetInfo);
} }
} }
bool xmrig::DaemonClient::isOutdated(uint64_t height, const char *hash) const
{
return m_job.height() != height || m_prevHash != hash;
}
bool xmrig::DaemonClient::parseJob(const rapidjson::Value &params, int *code) bool xmrig::DaemonClient::parseJob(const rapidjson::Value &params, int *code)
{ {
Job job(m_id, false, m_pool.algorithm(), String()); Job job(m_id, false, m_pool.algorithm(), String());
String blocktemplate = Json::getString(params, "blocktemplate_blob"); String blocktemplate = Json::getString(params, kBlocktemplateBlob);
if (blocktemplate.isNull() || !job.setBlob(Json::getString(params, "blockhashing_blob"))) { if (blocktemplate.isNull() || !job.setBlob(Json::getString(params, "blockhashing_blob"))) {
*code = 4; *code = 4;
return false; return false;
} }
job.setHeight(Json::getUint64(params, "height")); job.setHeight(Json::getUint64(params, kHeight));
job.setDiff(Json::getUint64(params, "difficulty")); job.setDiff(Json::getUint64(params, "difficulty"));
job.setId(blocktemplate.data() + blocktemplate.size() - 32); job.setId(blocktemplate.data() + blocktemplate.size() - 32);
m_job = std::move(job); m_job = std::move(job);
m_blocktemplate = std::move(blocktemplate); m_blocktemplate = std::move(blocktemplate);
m_prevHash = Json::getString(params, "prev_hash");
if (m_state == ConnectingState) { if (m_state == ConnectingState) {
setState(ConnectedState); setState(ConnectedState);
@ -227,7 +258,7 @@ bool xmrig::DaemonClient::parseResponse(int64_t id, const rapidjson::Value &resu
} }
int code = -1; int code = -1;
if (result.HasMember("blocktemplate_blob") && parseJob(result, &code)) { if (result.HasMember(kBlocktemplateBlob) && parseJob(result, &code)) {
return true; return true;
} }
@ -253,7 +284,7 @@ int64_t xmrig::DaemonClient::getBlockTemplate()
JsonRequest::create(doc, m_sequence, "getblocktemplate", params); JsonRequest::create(doc, m_sequence, "getblocktemplate", params);
send(HTTP_POST, "/json_rpc", doc); send(HTTP_POST, kJsonRPC, doc);
return m_sequence++; return m_sequence++;
} }

View file

@ -59,6 +59,7 @@ protected:
inline void tick(uint64_t) override {} inline void tick(uint64_t) override {}
private: private:
bool isOutdated(uint64_t height, const char *hash) const;
bool parseJob(const rapidjson::Value &params, int *code); bool parseJob(const rapidjson::Value &params, int *code);
bool parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error); bool parseResponse(int64_t id, const rapidjson::Value &result, const rapidjson::Value &error);
int64_t getBlockTemplate(); int64_t getBlockTemplate();
@ -67,7 +68,9 @@ private:
void send(int method, const char *url, const rapidjson::Document &doc); void send(int method, const char *url, const rapidjson::Document &doc);
void setState(SocketState state); void setState(SocketState state);
bool m_monero;
String m_blocktemplate; String m_blocktemplate;
String m_prevHash;
String m_tlsFingerprint; String m_tlsFingerprint;
String m_tlsVersion; String m_tlsVersion;
Timer *m_timer; Timer *m_timer;