From 9bb9af49b2914e8fc2e8574b93699c7830cbb966 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 12 Feb 2016 14:45:54 +0100 Subject: [PATCH] decred: stratum tests with extranonce field This implementation doesnt compute the merkle root, but allow to mine on yiimp with the help of decred extradata fields. Signed-off-by: Tanguy Pruvot --- ccminer.cpp | 71 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/ccminer.cpp b/ccminer.cpp index aba7fe1..ca4744e 100644 --- a/ccminer.cpp +++ b/ccminer.cpp @@ -792,6 +792,8 @@ static bool submit_upstream_work(CURL *curl, struct work *work) be32enc(&nonce, work->data[19]); break; case ALGO_DECRED: + be32enc(&ntime, work->data[34]); + be32enc(&nonce, work->data[35]); break; case ALGO_BLAKE: case ALGO_BLAKECOIN: @@ -821,7 +823,12 @@ static bool submit_upstream_work(CURL *curl, struct work *work) } ntimestr = bin2hex((const uchar*)(&ntime), 4); - xnonce2str = bin2hex(work->xnonce2, work->xnonce2_len); + + if (opt_algo == ALGO_DECRED) { + xnonce2str = bin2hex((const uchar*)&work->data[36], stratum.xnonce1_size); + } else { + xnonce2str = bin2hex(work->xnonce2, work->xnonce2_len); + } // store to keep/display the solved ratio/diff stratum.sharediff = work->sharediff; @@ -833,17 +840,19 @@ static bool submit_upstream_work(CURL *curl, struct work *work) applog(LOG_DEBUG, "share diff: %.5f (x %.1f)", stratum.sharediff, work->shareratio); - if (opt_algo == ALGO_HEAVY) { + switch (opt_algo) { + case ALGO_HEAVY: be16enc(&nvote, *((uint16_t*)&work->data[20])); nvotestr = bin2hex((const uchar*)(&nvote), 2); - sprintf(s, - "{\"method\": \"mining.submit\", \"params\": [\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"], \"id\":4}", - pool->user, work->job_id + 8, xnonce2str, ntimestr, noncestr, nvotestr); + sprintf(s, "{\"method\": \"mining.submit\", \"params\": [" + "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"], \"id\":4}", + pool->user, work->job_id + 8, xnonce2str, ntimestr, noncestr, nvotestr); free(nvotestr); - } else { - sprintf(s, - "{\"method\": \"mining.submit\", \"params\": [\"%s\", \"%s\", \"%s\", \"%s\", \"%s\"], \"id\":4}", - pool->user, work->job_id + 8, xnonce2str, ntimestr, noncestr); + break; + default: + sprintf(s, "{\"method\": \"mining.submit\", \"params\": [" + "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\"], \"id\":4}", + pool->user, work->job_id + 8, xnonce2str, ntimestr, noncestr); } free(xnonce2str); free(ntimestr); @@ -1311,7 +1320,8 @@ err_out: static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) { uchar merkle_root[64]; - int i; + uchar extraheader[256] = { 0 }; + int i, headersize = 0; if (!sctx->job.job_id) { // applog(LOG_WARNING, "stratum_gen_work: job not yet retrieved"); @@ -1333,6 +1343,11 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) /* Generate merkle root */ switch (opt_algo) { + case ALGO_DECRED: + memcpy(merkle_root, sctx->job.coinbase, 32); + memcpy(extraheader, &sctx->job.coinbase[32], (int)sctx->job.coinbase_size - 32); + headersize = (int)sctx->job.coinbase_size - 32; + break; case ALGO_HEAVY: case ALGO_MJOLLNIR: heavycoin_hash(merkle_root, sctx->job.coinbase, (int)sctx->job.coinbase_size); @@ -1353,7 +1368,7 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) memcpy(merkle_root + 32, sctx->job.merkle[i], 32); if (opt_algo == ALGO_HEAVY || opt_algo == ALGO_MJOLLNIR) heavycoin_hash(merkle_root, merkle_root, 64); - else + else if (opt_algo != ALGO_DECRED) sha256d(merkle_root, merkle_root, 64); } @@ -1367,8 +1382,25 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) work->data[1 + i] = le32dec((uint32_t *)sctx->job.prevhash + i); for (i = 0; i < 8; i++) work->data[9 + i] = be32dec((uint32_t *)merkle_root + i); - work->data[17] = le32dec(sctx->job.ntime); - work->data[18] = le32dec(sctx->job.nbits); + + if (opt_algo == ALGO_DECRED) { + uint32_t* extradata = (uint32_t*) sctx->xnonce1; + for (i = 0; i < 8; i++) + work->data[1 + i] = swab32(work->data[1 + i]); + for (i = 0; i < 8; i++) + work->data[9 + i] = swab32(work->data[9 + i]); + for (i = 0; i < headersize/4; i++) + work->data[17 + i] = le32dec((uint32_t*)extraheader + i); + for (i = 0; i < sctx->xnonce1_size/4; i++) + work->data[36 + i] = extradata[i]; + work->data[37] = (rand()*4) << 8; + for (int i=39; i < 45; i++) + work->data[i] = 0; + applog_hex(work->data, 180); + } else { + work->data[17] = le32dec(sctx->job.ntime); + work->data[18] = le32dec(sctx->job.nbits); + } if (opt_showdiff || opt_max_diff > 0.) calc_network_diff(work); @@ -1878,6 +1910,8 @@ static void *miner_thread(void *userdata) rc = scanhash_c11(thr_id, &work, max_nonce, &hashes_done); break; case ALGO_DECRED: + if (opt_debug) applog(LOG_BLUE, "version %x, nbits %x, ntime %x extra %x", + work.data[0], work.data[29], work.data[34], work.data[38]); rc = scanhash_decred(thr_id, &work, max_nonce, &hashes_done); break; case ALGO_DEEP: @@ -2086,9 +2120,9 @@ static void *miner_thread(void *userdata) continue; } - // second nonce found, submit too (on pool only!) + // second nonce found, submit too (on pool only!) todo: work.nonces if (rc > 1 && work.data[21]) { - work.data[19] = work.data[21]; + work.data[19] = work.data[21]; // nonceptr[0] work.data[21] = 0; if (opt_algo == ALGO_ZR5) { // todo: use + 4..6 index for pok to allow multiple nonces @@ -3220,13 +3254,6 @@ int main(int argc, char *argv[]) cur_pooln = pool_get_first_valid(0); pool_switch(-1, cur_pooln); - if (opt_algo == ALGO_DECRED) { - allow_gbt = false; - want_stratum = have_stratum = false; - allow_mininginfo = false; - want_longpoll = true; - } - flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) ? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) : CURL_GLOBAL_ALL;