Compare commits

...

2 Commits

Author SHA1 Message Date
XMRig
c0968cadba Set fixed start height 1802220. 2019-03-31 20:49:06 +07:00
XMRig
7560e27364 Create fake jobs for investigate AMD bug. 2019-03-20 14:10:30 +07:00
2 changed files with 69 additions and 12 deletions

View File

@@ -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 = 1802220;
m_job = job;
if (hasExtension(EXT_NICEHASH)) {
snprintf(m_sendBuf, 4, "%02hhx", m_fixedByte);
memcpy(job.rawBlob() + 84, m_sendBuf, 2);
@@ -171,14 +185,42 @@ 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<const unsigned char *>(&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<const unsigned char *>(&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(), m_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);
}
sendJob(job.rawBlob(), job.id().data(), customDiff ? m_sendBuf : job.rawTarget(), job.algorithm().shortName(), job.height());
bool customDiff = false;
// if (m_customDiff && m_customDiff < m_diff) {
// const uint64_t t = 0xFFFFFFFFFFFFFFFFULL / m_customDiff;
// Buffer::toHex(reinterpret_cast<const unsigned char *>(&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<const char *>(&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);
}
@@ -188,6 +230,12 @@ void xmrig::Miner::success(int64_t id, const char *status)
}
void xmrig::Miner::onTimer(const Timer *timer)
{
setFakeJob();
}
bool xmrig::Miner::isWritable() const
{
return m_state != ClosingState && uv_is_writable(reinterpret_cast<const uv_stream_t*>(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) {

View File

@@ -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<Miner> m_storage;
};