diff --git a/README.txt b/README.txt index 8e608f8977..bbc0469b6a 100644 --- a/README.txt +++ b/README.txt @@ -1,5 +1,5 @@ -ccMiner release 1.4.6-tpruvot (Oct 26th 2014) - "S3" +ccMiner release 1.4.7-tpruvot (Nov 2014) - "Blake update" --------------------------------------------------------------- *************************************************************** @@ -153,6 +153,10 @@ features. >>> RELEASE HISTORY <<< + Nov 2014 v1.4.7 + Rewrite blake algo + Update windows prebuilt curl to 7.38.0 + Oct. 26th 2014 v1.4.6 Add S3 algo reusing existing code (onecoin) Small X11 (simd512) enhancement diff --git a/blake32.cu b/blake32.cu index 6ea133acdd..dd3747ea4e 100644 --- a/blake32.cu +++ b/blake32.cu @@ -8,8 +8,6 @@ #include "miner.h" -typedef unsigned char uchar; - extern "C" { #include "sph/sph_blake.h" #include diff --git a/cpu-miner.c b/cpu-miner.c index ed03e6af95..b2691f5757 100644 --- a/cpu-miner.c +++ b/cpu-miner.c @@ -225,6 +225,7 @@ struct thr_info *thr_info; static int work_thr_id; int longpoll_thr_id = -1; int stratum_thr_id = -1; +bool stratum_need_reset = false; struct work_restart *work_restart = NULL; static struct stratum_ctx stratum; @@ -370,7 +371,7 @@ struct work { char job_id[128]; size_t xnonce2_len; - unsigned char xnonce2[32]; + uchar xnonce2[32]; union { uint32_t u32[2]; @@ -411,7 +412,7 @@ static bool jobj_binary(const json_t *obj, const char *key, applog(LOG_ERR, "JSON key '%s' is not a string", key); return false; } - if (!hex2bin((unsigned char*)buf, hexstr, buflen)) + if (!hex2bin((uchar*)buf, hexstr, buflen)) return false; return true; @@ -445,7 +446,7 @@ static bool work_decode(const json_t *val, struct work *work) const char * hexstr = json_string_value(jr); if (likely(hexstr)) { // never seen yet... - hex2bin((unsigned char*)work->noncerange.u64, hexstr, 8); + hex2bin((uchar*)work->noncerange.u64, hexstr, 8); applog(LOG_DEBUG, "received noncerange: %08x-%08x", work->noncerange.u32[0], work->noncerange.u32[1]); } } @@ -517,7 +518,6 @@ static int share_result(int result, const char *reason) static bool submit_upstream_work(CURL *curl, struct work *work) { - char *str = NULL; json_t *val, *res, *reason; char s[345]; int i; @@ -528,7 +528,7 @@ static bool submit_upstream_work(CURL *curl, struct work *work) if (memcmp(work->data + 1, g_work.data + 1, 32)) { pthread_mutex_unlock(&g_work_lock); if (opt_debug) - applog(LOG_DEBUG, "DEBUG: stale work detected, discarding"); + applog(LOG_DEBUG, "stale work detected, discarding"); return true; } calc_diff(work, 0); @@ -544,39 +544,44 @@ static bool submit_upstream_work(CURL *curl, struct work *work) le32enc(&nonce, work->data[19]); be16enc(&nvote, *((uint16_t*)&work->data[20])); - ntimestr = bin2hex((const unsigned char *)(&ntime), 4); - noncestr = bin2hex((const unsigned char *)(&nonce), 4); - xnonce2str = bin2hex(work->xnonce2, work->xnonce2_len); - nvotestr = bin2hex((const unsigned char *)(&nvote), 2); + noncestr = bin2hex((const uchar*)(&nonce), 4); sent = hashlog_already_submittted(work->job_id, nonce); if (sent > 0) { sent = (uint32_t) time(NULL) - sent; if (!opt_quiet) { - applog(LOG_WARNING, "skip submit, nonce %s was already sent %u seconds ago", noncestr, sent); + applog(LOG_WARNING, "nonce %s was already sent %u seconds ago", noncestr, sent); hashlog_dump_job(work->job_id); } - rc = true; - goto out; + free(noncestr); + // prevent useless computing on some pools + stratum_need_reset = true; + for (int i = 0; i < opt_n_threads; i++) + work_restart[i].restart = 1; + return true; } + ntimestr = bin2hex((const uchar*)(&ntime), 4); + xnonce2str = bin2hex(work->xnonce2, work->xnonce2_len); + if (opt_algo == ALGO_HEAVY) { + nvotestr = bin2hex((const uchar*)(&nvote), 2); sprintf(s, "{\"method\": \"mining.submit\", \"params\": [\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"], \"id\":4}", rpc_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}", rpc_user, work->job_id + 8, xnonce2str, ntimestr, noncestr); } + free(xnonce2str); free(ntimestr); free(noncestr); - free(xnonce2str); - free(nvotestr); if (unlikely(!stratum_send_line(&stratum, s))) { applog(LOG_ERR, "submit_upstream_work stratum_send_line failed"); - goto out; + return false; } hashlog_remember_submit(work->job_id, nonce, work->scanned_from); @@ -584,15 +589,16 @@ static bool submit_upstream_work(CURL *curl, struct work *work) } else { /* build hex string */ + char *str = NULL; if (opt_algo != ALGO_HEAVY && opt_algo != ALGO_MJOLLNIR) { for (i = 0; i < ARRAY_SIZE(work->data); i++) le32enc(work->data + i, work->data[i]); - } - str = bin2hex((unsigned char *)work->data, sizeof(work->data)); - if (unlikely(!str)) { - applog(LOG_ERR, "submit_upstream_work OOM"); - goto out; + } + str = bin2hex((uchar*)work->data, sizeof(work->data)); + if (unlikely(!str)) { + applog(LOG_ERR, "submit_upstream_work OOM"); + return false; } /* build JSON-RPC request */ @@ -604,7 +610,7 @@ static bool submit_upstream_work(CURL *curl, struct work *work) val = json_rpc_call(curl, rpc_url, rpc_userpass, s, false, false, NULL); if (unlikely(!val)) { applog(LOG_ERR, "submit_upstream_work json_rpc_call failed"); - goto out; + return false; } res = json_object_get(val, "result"); @@ -613,13 +619,11 @@ static bool submit_upstream_work(CURL *curl, struct work *work) hashlog_purge_job(work->job_id); json_decref(val); - } - rc = true; + free(str); + } -out: - free(str); - return rc; + return true; } static const char *rpc_req = @@ -842,7 +846,7 @@ static bool submit_work(struct thr_info *thr, const struct work *work_in) static void stratum_gen_work(struct stratum_ctx *sctx, struct work *work) { - unsigned char merkle_root[64]; + uchar merkle_root[64]; int i; if (!sctx->job.job_id) { @@ -1475,6 +1479,12 @@ static void *stratum_thread(void *userdata) while (1) { int failures = 0; + if (stratum_need_reset) { + stratum_need_reset = false; + stratum_disconnect(&stratum); + applog(LOG_DEBUG, "stratum connection reset"); + } + while (!stratum.curl) { pthread_mutex_lock(&g_work_lock); g_work_time = 0; @@ -1503,11 +1513,11 @@ static void *stratum_thread(void *userdata) time(&g_work_time); if (stratum.job.clean) { if (!opt_quiet) - applog(LOG_BLUE, "%s sent %s block %d", short_url, algo_names[opt_algo], + applog(LOG_BLUE, "%s %s block %d", short_url, algo_names[opt_algo], stratum.bloc_height); restart_threads(); hashlog_purge_old(); - } else if (!opt_quiet) { + } else if (opt_debug && !opt_quiet) { applog(LOG_BLUE, "%s asks job %d for block %d", short_url, strtoul(stratum.job.job_id, NULL, 16), stratum.bloc_height); } @@ -1902,18 +1912,17 @@ int main(int argc, char *argv[]) long flags; int i; - printf("*** ccMiner for nVidia GPUs by Christian Buchner and Christian H. ***\n"); - printf("\t This is the forked version "PROGRAM_VERSION" (tpruvot@github)\n"); + printf("*** ccminer " PROGRAM_VERSION " for nVidia GPUs by tpruvot@github ***\n"); #ifdef WIN32 - printf("\t Built with VC++ 2013 and nVidia CUDA SDK 6.5\n\n"); + printf("\tBuilt with VC++ 2013 and nVidia CUDA SDK 6.5\n\n"); #else - printf("\t Built with the nVidia CUDA SDK 6.5\n\n"); + printf("\tBuilt with the nVidia CUDA SDK 6.5\n\n"); #endif - printf("\t based on pooler-cpuminer 2.3.2 (c) 2010 Jeff Garzik, 2012 pooler\n"); - printf("\t and HVC extension from http://hvc.1gh.com/" "\n\n"); - printf("\tCuda additions Copyright 2014 Christian Buchner, Christian H.\n\n"); - printf("\tInclude some of djm34 additions, cleaned by Tanguy Pruvot\n"); - printf("\t BTC donation address: 1AJdfCpLWPNoAMDfHF1wD5y8VgKSSTHxPo\n\n"); + printf(" Based on pooler cpuminer 2.3.2\n"); + printf(" CUDA support by Christian Buchner and Christian H.\n"); + printf(" Include some of djm34 additions\n\n"); + + printf("BTC donation address: 1AJdfCpLWPNoAMDfHF1wD5y8VgKSSTHxPo\n\n"); rpc_user = strdup(""); rpc_pass = strdup(""); @@ -2028,6 +2037,7 @@ int main(int argc, char *argv[]) return 1; } } + if (want_stratum) { /* init stratum thread info */ stratum_thr_id = opt_n_threads + 2; diff --git a/miner.h b/miner.h index 60a6a3927c..fa9307d458 100644 --- a/miner.h +++ b/miner.h @@ -74,6 +74,8 @@ enum { }; #endif +typedef unsigned char uchar; + #undef unlikely #undef likely #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__) diff --git a/util.c b/util.c index 350665ff2d..aef2ecf59c 100644 --- a/util.c +++ b/util.c @@ -163,7 +163,7 @@ static size_t all_data_cb(const void *ptr, size_t size, size_t nmemb, size_t len = size * nmemb; size_t oldlen, newlen; void *newmem; - static const unsigned char zero = 0; + static const uchar zero = 0; oldlen = db->len; newlen = oldlen + len; @@ -517,7 +517,7 @@ void cbin2hex(char *out, const char *in, size_t len) } } -char *bin2hex(const unsigned char *in, size_t len) +char *bin2hex(const uchar *in, size_t len) { char *s = (char*)malloc((len * 2) + 1); if (!s) @@ -528,7 +528,7 @@ char *bin2hex(const unsigned char *in, size_t len) return s; } -bool hex2bin(unsigned char *p, const char *hexstr, size_t len) +bool hex2bin(uchar *p, const char *hexstr, size_t len) { char hex_byte[3]; char *ep; @@ -542,7 +542,7 @@ bool hex2bin(unsigned char *p, const char *hexstr, size_t len) } hex_byte[0] = hexstr[0]; hex_byte[1] = hexstr[1]; - *p = (unsigned char) strtol(hex_byte, &ep, 16); + *p = (uchar) strtol(hex_byte, &ep, 16); if (*ep) { applog(LOG_ERR, "hex2bin failed on '%s'", hex_byte); return false; @@ -609,8 +609,8 @@ bool fulltest(const uint32_t *hash, const uint32_t *target) be32enc(hash_be + i, hash[7 - i]); be32enc(target_be + i, target[7 - i]); } - hash_str = bin2hex((unsigned char *)hash_be, 32); - target_str = bin2hex((unsigned char *)target_be, 32); + hash_str = bin2hex((uchar *)hash_be, 32); + target_str = bin2hex((uchar *)target_be, 32); applog(LOG_DEBUG, "DEBUG: %s\nHash: %s\nTarget: %s", rc ? "hash <= target" @@ -976,7 +976,7 @@ bool stratum_subscribe(struct stratum_ctx *sctx) free(sctx->xnonce1); sctx->session_id = sid ? strdup(sid) : NULL; sctx->xnonce1_size = strlen(xnonce1) / 2; - sctx->xnonce1 = (unsigned char*)malloc(sctx->xnonce1_size); + sctx->xnonce1 = (uchar*) malloc(sctx->xnonce1_size); hex2bin(sctx->xnonce1, xnonce1, sctx->xnonce1_size); sctx->xnonce2_size = xn2_size; sctx->next_diff = 1.0; @@ -1088,7 +1088,7 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) bool clean, ret = false; int merkle_count, i; json_t *merkle_arr; - unsigned char **merkle; + uchar **merkle; int ntime; job_id = json_string_value(json_array_get(params, 0)); @@ -1113,15 +1113,15 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) } /* store stratum server time diff */ - hex2bin((unsigned char *)&ntime, stime, 4); + hex2bin((uchar *)&ntime, stime, 4); ntime = swab32(ntime) - (uint32_t) time(0); if (ntime > sctx->srvtime_diff) { sctx->srvtime_diff = ntime; - if (!opt_quiet) + if (!opt_quiet && ntime > 20) applog(LOG_DEBUG, "stratum time is at least %ds in the future", ntime); } - merkle = (unsigned char**)malloc(merkle_count * sizeof(char *)); + merkle = (uchar**) malloc(merkle_count * sizeof(char *)); for (i = 0; i < merkle_count; i++) { const char *s = json_string_value(json_array_get(merkle_arr, i)); if (!s || strlen(s) != 64) { @@ -1131,7 +1131,7 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) applog(LOG_ERR, "Stratum notify: invalid Merkle branch"); goto out; } - merkle[i] = (unsigned char*)malloc(32); + merkle[i] = (uchar*) malloc(32); hex2bin(merkle[i], s, 32); } @@ -1142,7 +1142,7 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) sctx->job.coinbase_size = coinb1_size + sctx->xnonce1_size + sctx->xnonce2_size + coinb2_size; - sctx->job.coinbase = (unsigned char*)realloc(sctx->job.coinbase, sctx->job.coinbase_size); + sctx->job.coinbase = (uchar*) realloc(sctx->job.coinbase, sctx->job.coinbase_size); sctx->job.xnonce2 = sctx->job.coinbase + coinb1_size + sctx->xnonce1_size; hex2bin(sctx->job.coinbase, coinb1, coinb1_size); memcpy(sctx->job.coinbase + coinb1_size, sctx->xnonce1, sctx->xnonce1_size); @@ -1456,7 +1456,7 @@ char* atime2str(time_t timer) } /* sprintf can be used in applog */ -static char* format_hash(char* buf, unsigned char *hash) +static char* format_hash(char* buf, uchar *hash) { int len = 0; for (int i=0; i < 32; i += 4) { @@ -1467,7 +1467,7 @@ static char* format_hash(char* buf, unsigned char *hash) } /* to debug diff in data */ -extern void applog_compare_hash(unsigned char *hash, unsigned char *hash2) +extern void applog_compare_hash(uchar *hash, uchar *hash2) { char s[256] = ""; int len = 0; @@ -1480,7 +1480,7 @@ extern void applog_compare_hash(unsigned char *hash, unsigned char *hash2) applog(LOG_DEBUG, "%s", s); } -extern void applog_hash(unsigned char *hash) +extern void applog_hash(uchar *hash) { char s[128] = {'\0'}; applog(LOG_DEBUG, "%s", format_hash(s, hash)); @@ -1495,15 +1495,19 @@ void do_gpu_tests(void) #ifdef _DEBUG unsigned long done; char s[128] = { '\0' }; - unsigned char buf[128], hash[128]; + uchar buf[128], hash[128]; uint32_t tgt[8] = { 0 }; + memset(buf, 0, sizeof buf); buf[0] = 1; buf[64] = 2; + opt_tracegpu = true; work_restart = (struct work_restart*) malloc(sizeof(struct work_restart)); work_restart[0].restart = 1; tgt[6] = 0xffff; + scanhash_blake256(0, (uint32_t*)buf, tgt, 1, &done, 14); + free(work_restart); work_restart = NULL; opt_tracegpu = false; @@ -1513,9 +1517,9 @@ void do_gpu_tests(void) void print_hash_tests(void) { char s[128] = {'\0'}; - unsigned char buf[128], hash[128]; + uchar buf[128], hash[128]; memset(buf, 0, sizeof buf); - // buf[0] = 1; buf[64] = 2; + // buf[0] = 1; buf[64] = 2; // for endian tests printf(CL_WHT "CPU HASH ON EMPTY BUFFER RESULTS:" CL_N "\n"); @@ -1531,8 +1535,6 @@ void print_hash_tests(void) blake256hash(&hash[0], &buf[0], 14); printpfx("blake", hash); - do_gpu_tests(); - memset(hash, 0, sizeof hash); deephash(&hash[0], &buf[0]); printpfx("deep", hash); @@ -1614,4 +1616,6 @@ void print_hash_tests(void) printpfx("X17", hash); printf("\n"); + + do_gpu_tests(); }