From 7560e27364fc419573c80f504f1ad9bc52b297cb Mon Sep 17 00:00:00 2001 From: XMRig Date: Wed, 20 Mar 2019 14:10:30 +0700 Subject: [PATCH] Create fake jobs for investigate AMD bug. --- src/proxy/Miner.cpp | 68 +++++++++++++++++++++++++++++++++++++-------- src/proxy/Miner.h | 13 ++++++++- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/proxy/Miner.cpp b/src/proxy/Miner.cpp index 5546767..12cb3c0 100644 --- a/src/proxy/Miner.cpp +++ b/src/proxy/Miner.cpp @@ -47,6 +47,7 @@ #include "rapidjson/error/en.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h" +#include "base/tools/Timer.h" #ifndef XMRIG_NO_TLS @@ -78,12 +79,15 @@ xmrig::Miner::Miner(const TlsContext *ctx, bool ipv6, uint16_t port) : m_rx(0), m_timestamp(Chrono::currentMSecsSinceEpoch()), m_tx(0), - m_fixedByte(0) + m_fixedByte(0), + m_height(0) { m_key = m_storage.add(this); Uuid::create(m_rpcId, sizeof(m_rpcId)); + m_timer = new Timer(this); + m_socket = new uv_tcp_t; m_socket->data = m_storage.ptr(m_key); uv_tcp_init(uv_default_loop(), m_socket); @@ -103,6 +107,7 @@ xmrig::Miner::Miner(const TlsContext *ctx, bool ipv6, uint16_t port) : xmrig::Miner::~Miner() { + delete m_timer; Handle::close(m_socket); # ifndef XMRIG_NO_TLS @@ -161,8 +166,17 @@ void xmrig::Miner::replyWithError(int64_t id, const char *message) void xmrig::Miner::setJob(Job &job) { + m_timer->start(m_customDiff, m_customDiff); + using namespace rapidjson; + if (m_job.isValid()) { + return; + } + + m_height = job.height(); + m_job = job; + if (hasExtension(EXT_NICEHASH)) { snprintf(m_sendBuf, 4, "%02hhx", m_fixedByte); memcpy(job.rawBlob() + 84, m_sendBuf, 2); @@ -171,23 +185,57 @@ void xmrig::Miner::setJob(Job &job) m_diff = job.diff(); bool customDiff = false; - if (m_customDiff && m_customDiff < m_diff) { - const uint64_t t = 0xFFFFFFFFFFFFFFFFULL / m_customDiff; - Buffer::toHex(reinterpret_cast(&t) + 4, 4, m_sendBuf); - m_sendBuf[8] = '\0'; - customDiff = true; - } +// if (m_customDiff && m_customDiff < m_diff) { +// const uint64_t t = 0xFFFFFFFFFFFFFFFFULL / m_customDiff; +// Buffer::toHex(reinterpret_cast(&t) + 4, 4, m_sendBuf); +// m_sendBuf[8] = '\0'; +// customDiff = true; +// } sendJob(job.rawBlob(), job.id().data(), customDiff ? m_sendBuf : job.rawTarget(), job.algorithm().shortName(), job.height()); } +void xmrig::Miner::setFakeJob() +{ + m_height++; + if (hasExtension(EXT_NICEHASH)) { + snprintf(m_sendBuf, 4, "%02hhx", m_fixedByte); + memcpy(m_job.rawBlob() + 84, m_sendBuf, 2); + } + + bool customDiff = false; + +// if (m_customDiff && m_customDiff < m_diff) { +// const uint64_t t = 0xFFFFFFFFFFFFFFFFULL / m_customDiff; +// Buffer::toHex(reinterpret_cast(&t) + 4, 4, m_sendBuf); +// m_sendBuf[8] = '\0'; +// customDiff = true; +// } + + char buf[37]; + Uuid::create(buf, sizeof(buf)); + m_job.setId(buf); + + Buffer::toHex(reinterpret_cast(&m_height), 8, buf); + memcpy(m_job.rawBlob() + 96, buf, 16); + + sendJob(m_job.rawBlob(), m_job.id().data(), customDiff ? m_sendBuf : m_job.rawTarget(), m_job.algorithm().shortName(), m_height); +} + + void xmrig::Miner::success(int64_t id, const char *status) { send(snprintf(m_sendBuf, sizeof(m_sendBuf), "{\"id\":%" PRId64 ",\"jsonrpc\":\"2.0\",\"error\":null,\"result\":{\"status\":\"%s\"}}\n", id, status)); } +void xmrig::Miner::onTimer(const Timer *timer) +{ + setFakeJob(); +} + + bool xmrig::Miner::isWritable() const { return m_state != ClosingState && uv_is_writable(reinterpret_cast(m_socket)) == 1; @@ -265,11 +313,9 @@ bool xmrig::Miner::parseRequest(int64_t id, const char *method, const rapidjson: return true; } - if (!event->start()) { - replyWithError(id, event->message()); - } + success(id, "OK"); - return event->error() != Error::InvalidNonce; + return true; } if (strcmp(method, "keepalived") == 0) { diff --git a/src/proxy/Miner.h b/src/proxy/Miner.h index 568828e..1607023 100644 --- a/src/proxy/Miner.h +++ b/src/proxy/Miner.h @@ -34,6 +34,8 @@ #include "base/net/tools/Storage.h" #include "base/tools/String.h" #include "rapidjson/fwd.h" +#include "base/net/stratum/Job.h" +#include "base/kernel/interfaces/ITimerListener.h" typedef struct bio_st BIO; @@ -44,9 +46,10 @@ namespace xmrig { class Job; class TlsContext; +class Timer; -class Miner +class Miner : public ITimerListener { public: enum State { @@ -69,6 +72,7 @@ public: void forwardJob(const Job &job, const char *algo); void replyWithError(int64_t id, const char *message); void setJob(Job &job); + void setFakeJob(); void success(int64_t id, const char *status); inline bool hasExtension(Extension ext) const noexcept { return m_extensions.test(ext); } @@ -96,6 +100,9 @@ public: inline void setMapperId(ssize_t mapperId) { m_mapperId = mapperId; } inline void setRouteId(int32_t id) { m_routeId = id; } +protected: + void onTimer(const Timer *timer); + private: class Tls; @@ -151,6 +158,10 @@ private: uv_buf_t m_recvBuf; uv_tcp_t *m_socket; + uint64_t m_height; + Job m_job; + Timer *m_timer; + static char m_sendBuf[2048]; static Storage m_storage; };