diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cc2f555..8c19c125 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,7 @@ set(HEADERS src/net/Job.h src/net/JobResult.h src/net/Network.h + src/net/SubmitResult.h src/net/Url.h src/net/strategies/DonateStrategy.h src/net/strategies/FailoverStrategy.h diff --git a/src/interfaces/IClientListener.h b/src/interfaces/IClientListener.h index 7a5743d2..8911e043 100644 --- a/src/interfaces/IClientListener.h +++ b/src/interfaces/IClientListener.h @@ -25,6 +25,9 @@ #define __ICLIENTLISTENER_H__ +#include + + class Client; class Job; @@ -34,9 +37,10 @@ class IClientListener public: virtual ~IClientListener() {} - virtual void onClose(Client *client, int failures) = 0; - virtual void onJobReceived(Client *client, const Job &job) = 0; - virtual void onLoginSuccess(Client *client) = 0; + virtual void onClose(Client *client, int failures) = 0; + virtual void onJobReceived(Client *client, const Job &job) = 0; + virtual void onLoginSuccess(Client *client) = 0; + virtual void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) = 0; }; diff --git a/src/interfaces/IStrategyListener.h b/src/interfaces/IStrategyListener.h index 5fbc78c5..9fff223d 100644 --- a/src/interfaces/IStrategyListener.h +++ b/src/interfaces/IStrategyListener.h @@ -25,6 +25,9 @@ #define __ISTRATEGYLISTENER_H__ +#include + + class Client; class IStrategy; class Job; @@ -35,9 +38,10 @@ class IStrategyListener public: virtual ~IStrategyListener() {} - virtual void onActive(Client *client) = 0; - virtual void onJob(Client *client, const Job &job) = 0; - virtual void onPause(IStrategy *strategy) = 0; + virtual void onActive(Client *client) = 0; + virtual void onJob(Client *client, const Job &job) = 0; + virtual void onPause(IStrategy *strategy) = 0; + virtual void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) = 0; }; diff --git a/src/net/Client.cpp b/src/net/Client.cpp index f709245a..4a9f379d 100644 --- a/src/net/Client.cpp +++ b/src/net/Client.cpp @@ -22,6 +22,7 @@ */ +#include #include @@ -155,6 +156,7 @@ void Client::submit(const JobResult &result) snprintf(req, 345, "{\"id\":%llu,\"jsonrpc\":\"2.0\",\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"}}\n", m_sequence, m_rpcId, result.jobId, nonce, data); + m_results[m_sequence] = SubmitResult(result.diff); send(req); } @@ -264,6 +266,7 @@ void Client::connect(struct sockaddr *addr) void Client::login() { m_sequence = 1; + m_results.clear(); const size_t size = 96 + strlen(m_url.user()) + strlen(m_url.password()) + strlen(m_agent); char *req = static_cast(malloc(size)); @@ -334,7 +337,12 @@ void Client::parseResponse(int64_t id, const json_t *result, const json_t *error if (json_is_object(error)) { const char *message = json_string_value(json_object_get(error, "message")); - if (!m_quiet) { + auto it = m_results.find(id); + if (it != m_results.end()) { + m_listener->onResultAccepted(this, it->second.diff, it->second.elapsed(), message); + m_results.erase(it); + } + else if (!m_quiet) { LOG_ERR("[%s:%u] error: \"%s\", code: %lld", m_url.host(), m_url.port(), message, json_integer_value(json_object_get(error, "code"))); } @@ -364,6 +372,12 @@ void Client::parseResponse(int64_t id, const json_t *result, const json_t *error m_listener->onJobReceived(this, m_job); return; } + + auto it = m_results.find(id); + if (it != m_results.end()) { + m_listener->onResultAccepted(this, it->second.diff, it->second.elapsed(), nullptr); + m_results.erase(it); + } } diff --git a/src/net/Client.h b/src/net/Client.h index d8bb785a..a9777435 100644 --- a/src/net/Client.h +++ b/src/net/Client.h @@ -26,10 +26,12 @@ #include +#include #include #include "net/Job.h" +#include "net/SubmitResult.h" #include "net/Url.h" @@ -108,6 +110,7 @@ private: Job m_job; size_t m_recvBufPos; SocketState m_state; + std::map m_results; struct addrinfo m_hints; Url m_url; uv_buf_t m_recvBuf; diff --git a/src/net/JobResult.h b/src/net/JobResult.h index 87e3a645..0279b8be 100644 --- a/src/net/JobResult.h +++ b/src/net/JobResult.h @@ -32,8 +32,8 @@ class JobResult { public: - inline JobResult() : poolId(0), nonce(0) {} - inline JobResult(int poolId, const char *jobId, uint32_t nonce, const uint8_t *result) : poolId(poolId), nonce(nonce) + inline JobResult() : poolId(0), diff(0), nonce(0) {} + inline JobResult(int poolId, const char *jobId, uint32_t nonce, const uint8_t *result, uint32_t diff) : poolId(poolId), diff(diff), nonce(nonce) { memcpy(this->jobId, jobId, sizeof(this->jobId)); memcpy(this->result, result, sizeof(this->result)); @@ -41,6 +41,7 @@ public: char jobId[64]; int poolId; + uint32_t diff; uint32_t nonce; uint8_t result[32]; }; diff --git a/src/net/Network.cpp b/src/net/Network.cpp index 5b204734..0fcac1be 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -39,7 +39,9 @@ Network::Network(const Options *options) : m_donateActive(false), m_options(options), - m_donate(nullptr) + m_donate(nullptr), + m_accepted(0), + m_rejected(0) { Workers::setListener(this); m_agent = userAgent(); @@ -94,8 +96,6 @@ void Network::onJob(Client *client, const Job &job) void Network::onJobResult(const JobResult &result) { - LOG_NOTICE(m_options->colors() ? "\x1B[01;32mSHARE FOUND" : "SHARE FOUND"); - if (result.poolId == -1 && m_donate) { return m_donate->submit(result); } @@ -118,6 +118,21 @@ void Network::onPause(IStrategy *strategy) } +void Network::onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) +{ + if (error) { + m_rejected++; + + LOG_INFO(m_options->colors() ? "\x1B[01;31mrejected\x1B[0m (%lld/%lld) diff \x1B[01;37m%u\x1B[0m \x1B[31m\"%s\"\x1B[0m \x1B[01;30m(%llu ms)" : "accepted (%lld/%lld) diff %u \"%s\" (%llu ms)", m_accepted, m_rejected, diff, error, ms); + } + else { + m_accepted++; + + LOG_INFO(m_options->colors() ? "\x1B[01;32maccepted\x1B[0m (%lld/%lld) diff \x1B[01;37m%u\x1B[0m \x1B[01;30m(%llu ms)" : "accepted (%lld/%lld) diff %u (%llu ms)", m_accepted, m_rejected, diff, ms); + } +} + + void Network::setJob(Client *client, const Job &job) { if (m_options->colors()) { diff --git a/src/net/Network.h b/src/net/Network.h index 4eb86cc3..6cf6260d 100644 --- a/src/net/Network.h +++ b/src/net/Network.h @@ -54,6 +54,7 @@ protected: void onJob(Client *client, const Job &job) override; void onJobResult(const JobResult &result) override; void onPause(IStrategy *strategy) override; + void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) override; private: void addPool(const Url *url); @@ -66,6 +67,8 @@ private: const Options *m_options; IStrategy *m_donate; IStrategy *m_strategy; + uint64_t m_accepted; + uint64_t m_rejected; }; diff --git a/src/net/SubmitResult.h b/src/net/SubmitResult.h new file mode 100644 index 00000000..eb49bd02 --- /dev/null +++ b/src/net/SubmitResult.h @@ -0,0 +1,47 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2016-2017 XMRig + * + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __SUBMITRESULT_H__ +#define __SUBMITRESULT_H__ + + +#include + + +class SubmitResult +{ +public: + inline SubmitResult() : diff(0), start(0) {} + inline SubmitResult(uint32_t diff) : + diff(diff) + { + start = uv_hrtime(); + } + + inline uint64_t elapsed() const { return (uv_hrtime() - start) / 1000000; } + + uint32_t diff; + uint64_t start; +}; + +#endif /* __SUBMITRESULT_H__ */ diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index a3c595ed..fb7b6a67 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -84,6 +84,12 @@ void DonateStrategy::onLoginSuccess(Client *client) } +void DonateStrategy::onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) +{ + m_listener->onResultAccepted(client, diff, ms, error); +} + + void DonateStrategy::idle() { uv_timer_start(&m_timer, DonateStrategy::onTimer, m_idleTime, 0); diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index 33cdf536..b2c889bc 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -53,6 +53,7 @@ protected: void onClose(Client *client, int failures) override; void onJobReceived(Client *client, const Job &job) override; void onLoginSuccess(Client *client) override; + void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) override; private: void idle(); diff --git a/src/net/strategies/FailoverStrategy.cpp b/src/net/strategies/FailoverStrategy.cpp index 07eabcde..7f2aa2a8 100644 --- a/src/net/strategies/FailoverStrategy.cpp +++ b/src/net/strategies/FailoverStrategy.cpp @@ -111,6 +111,12 @@ void FailoverStrategy::onLoginSuccess(Client *client) } +void FailoverStrategy::onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) +{ + m_listener->onResultAccepted(client, diff, ms, error); +} + + void FailoverStrategy::add(const Url *url, const char *agent) { Client *client = new Client(m_pools.size(), agent, this); diff --git a/src/net/strategies/FailoverStrategy.h b/src/net/strategies/FailoverStrategy.h index 456ddc66..86545d81 100644 --- a/src/net/strategies/FailoverStrategy.h +++ b/src/net/strategies/FailoverStrategy.h @@ -53,6 +53,7 @@ protected: void onClose(Client *client, int failures) override; void onJobReceived(Client *client, const Job &job) override; void onLoginSuccess(Client *client) override; + void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) override; private: void add(const Url *url, const char *agent); diff --git a/src/net/strategies/SinglePoolStrategy.cpp b/src/net/strategies/SinglePoolStrategy.cpp index c1d1a08f..87d21077 100644 --- a/src/net/strategies/SinglePoolStrategy.cpp +++ b/src/net/strategies/SinglePoolStrategy.cpp @@ -82,3 +82,9 @@ void SinglePoolStrategy::onLoginSuccess(Client *client) m_active = true; m_listener->onActive(client); } + + +void SinglePoolStrategy::onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) +{ + m_listener->onResultAccepted(client, diff, ms, error); +} diff --git a/src/net/strategies/SinglePoolStrategy.h b/src/net/strategies/SinglePoolStrategy.h index b5939859..dbf96aa1 100644 --- a/src/net/strategies/SinglePoolStrategy.h +++ b/src/net/strategies/SinglePoolStrategy.h @@ -50,6 +50,7 @@ protected: void onClose(Client *client, int failures) override; void onJobReceived(Client *client, const Job &job) override; void onLoginSuccess(Client *client) override; + void onResultAccepted(Client *client, uint32_t diff, uint64_t ms, const char *error) override; private: bool m_active; diff --git a/src/workers/DoubleWorker.cpp b/src/workers/DoubleWorker.cpp index 90fbf2b3..86dbd13d 100644 --- a/src/workers/DoubleWorker.cpp +++ b/src/workers/DoubleWorker.cpp @@ -62,11 +62,11 @@ void DoubleWorker::start() CryptoNight::hash(m_blob, m_job.size(), m_hash, m_ctx); if (*reinterpret_cast(m_hash + 24) < m_job.target()) { - Workers::submit(JobResult(m_job.poolId(), m_job.id(), m_nonce1, m_hash)); + Workers::submit(JobResult(m_job.poolId(), m_job.id(), m_nonce1, m_hash, m_job.diff())); } if (*reinterpret_cast(m_hash + 32 + 24) < m_job.target()) { - Workers::submit(JobResult(m_job.poolId(), m_job.id(), m_nonce2, m_hash + 32)); + Workers::submit(JobResult(m_job.poolId(), m_job.id(), m_nonce2, m_hash + 32, m_job.diff())); } std::this_thread::yield(); diff --git a/src/workers/SingleWorker.cpp b/src/workers/SingleWorker.cpp index 477694eb..68ff21b7 100644 --- a/src/workers/SingleWorker.cpp +++ b/src/workers/SingleWorker.cpp @@ -76,6 +76,7 @@ void SingleWorker::consumeJob() memcpy(m_result.jobId, m_job.id(), sizeof(m_result.jobId)); m_result.poolId = m_job.poolId(); + m_result.diff = m_job.diff(); if (m_job.isNicehash()) { m_result.nonce = (*m_job.nonce() & 0xff000000U) + (0xffffffU / m_threads * m_id);