diff options
Diffstat (limited to 'xmrstak/net/jpsock.cpp')
-rw-r--r-- | xmrstak/net/jpsock.cpp | 79 |
1 files changed, 72 insertions, 7 deletions
diff --git a/xmrstak/net/jpsock.cpp b/xmrstak/net/jpsock.cpp index cb586d2..5769448 100644 --- a/xmrstak/net/jpsock.cpp +++ b/xmrstak/net/jpsock.cpp @@ -23,6 +23,7 @@ #include <stdarg.h> #include <assert.h> +#include <algorithm> #include "jpsock.hpp" #include "socks.hpp" @@ -33,9 +34,6 @@ #include "xmrstak/misc/jext.hpp" #include "xmrstak/version.hpp" - -#define AGENTID_STR XMR_STAK_NAME "/" XMR_STAK_VERSION - using namespace rapidjson; struct jpsock::call_rsp @@ -366,10 +364,11 @@ bool jpsock::process_pool_job(const opq_json_val* params) if (!params->val->IsObject()) return set_socket_error("PARSE error: Job error 1"); - const Value * blob, *jobid, *target; + const Value *blob, *jobid, *target, *motd; jobid = GetObjectMember(*params->val, "job_id"); blob = GetObjectMember(*params->val, "blob"); target = GetObjectMember(*params->val, "target"); + motd = GetObjectMember(*params->val, "motd"); if (jobid == nullptr || blob == nullptr || target == nullptr || !jobid->IsString() || !blob->IsString() || !target->IsString()) @@ -415,6 +414,19 @@ bool jpsock::process_pool_job(const opq_json_val* params) else return set_socket_error("PARSE error: Job error 5"); + if(motd != nullptr && motd->IsString() && (motd->GetStringLength() & 0x01) == 0) + { + std::unique_lock<std::mutex>(motd_mutex); + if(motd->GetStringLength() > 0) + { + pool_motd.resize(motd->GetStringLength()/2 + 1); + if(!hex2bin(motd->GetString(), motd->GetStringLength(), (unsigned char*)&pool_motd.front())) + pool_motd.clear(); + } + else + pool_motd.clear(); + } + iJobDiff = t64_to_diff(oPoolJob.iTarget); executor::inst()->push_event(ex_event(oPoolJob, pool_id)); @@ -426,6 +438,7 @@ bool jpsock::process_pool_job(const opq_json_val* params) bool jpsock::connect(std::string& sConnectError) { + ext_algo = ext_backend = ext_hashcount = ext_motd = false; bHaveSocketError = false; sSocketError.clear(); iJobDiff = 0; @@ -527,6 +540,7 @@ bool jpsock::cmd_login() const Value* id = GetObjectMember(*oResult.val, "id"); const Value* job = GetObjectMember(*oResult.val, "job"); + const Value* ext = GetObjectMember(*oResult.val, "extensions"); if (id == nullptr || job == nullptr || !id->IsString()) { @@ -545,6 +559,29 @@ bool jpsock::cmd_login() memset(sMinerId, 0, sizeof(sMinerId)); memcpy(sMinerId, id->GetString(), id->GetStringLength()); + if(ext != nullptr && ext->IsArray()) + { + for(size_t i=0; i < ext->Size(); i++) + { + const Value& jextname = ext->GetArray()[i]; + + if(!jextname.IsString()) + continue; + + std::string tmp(jextname.GetString()); + std::transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower); + + if(tmp == "algo") + ext_algo = true; + else if(tmp == "backend") + ext_backend = true; + else if(tmp == "hashcount") + ext_hashcount = true; + else if(tmp == "motd") + ext_motd = true; + } + } + opq_json_val v(job); if(!process_pool_job(&v)) { @@ -558,20 +595,33 @@ bool jpsock::cmd_login() return true; } -bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult) +bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bResult, xmrstak::iBackend* bend, bool algo_full_cn) { char cmd_buffer[1024]; char sNonce[9]; char sResult[65]; + /*Extensions*/ + char sAlgo[64] = {0}; + char sBackend[64] = {0}; + char sHashcount[64] = {0}; + if(ext_backend) + snprintf(sBackend, sizeof(sBackend), ",\"backend\":\"%s\"", xmrstak::iBackend::getName(bend->backendType)); + + if(ext_hashcount) + snprintf(sHashcount, sizeof(sHashcount), ",\"hashcount\":%llu", int_port(bend->iHashCount.load(std::memory_order_relaxed))); + + if(ext_algo) + snprintf(sAlgo, sizeof(sAlgo), ",\"algo\":\"%s\"", algo_full_cn ? "cryptonight" : "cryptonight-lite"); + bin2hex((unsigned char*)&iNonce, 4, sNonce); sNonce[8] = '\0'; bin2hex(bResult, 32, sResult); sResult[64] = '\0'; - snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"},\"id\":1}\n", - sMinerId, sJobId, sNonce, sResult); + snprintf(cmd_buffer, sizeof(cmd_buffer), "{\"method\":\"submit\",\"params\":{\"id\":\"%s\",\"job_id\":\"%s\",\"nonce\":\"%s\",\"result\":\"%s\"%s%s%s},\"id\":1}\n", + sMinerId, sJobId, sNonce, sResult, sBackend, sHashcount, sAlgo); opq_json_val oResult(nullptr); return cmd_ret_wait(cmd_buffer, oResult); @@ -594,6 +644,21 @@ bool jpsock::get_current_job(pool_job& job) return true; } +bool jpsock::get_pool_motd(std::string& strin) +{ + if(!ext_motd) + return false; + + std::unique_lock<std::mutex>(motd_mutex); + if(pool_motd.size() > 0) + { + strin.assign(pool_motd); + return true; + } + + return false; +} + inline unsigned char hf_hex2bin(char c, bool &err) { if (c >= '0' && c <= '9') |