From 799b230af259c97a185b6b335d253a25091e1330 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Sun, 28 Sep 2014 15:16:18 +0200 Subject: [PATCH] enhance solo mining, update http headers and prepare next version... --- ccminer.vcxproj.filters | 20 ++++++++++---------- configure.ac | 2 +- cpu-miner.c | 22 +++++++++++++++++++--- cpuminer-config.h | 6 +++--- miner.h | 3 ++- quark/animecoin.cu | 27 +++++++++++++++------------ util.c | 25 ++++++++++++++++--------- 7 files changed, 66 insertions(+), 39 deletions(-) diff --git a/ccminer.vcxproj.filters b/ccminer.vcxproj.filters index 1391df5..5161ec5 100644 --- a/ccminer.vcxproj.filters +++ b/ccminer.vcxproj.filters @@ -31,9 +31,6 @@ {fe39ded0-754b-415f-a284-038a15a0aa55} - - {17b56151-79ec-4a32-bac3-9d94ae7f68fe} - {d8f2e173-a0a5-455b-8efc-42511b585156} @@ -67,25 +64,28 @@ {85dfae6a-66ca-4332-8cec-98ee70cbdf2f} + + {17b56151-79ec-4a32-bac3-9d94ae7f68fe} + - Source Files\CUDA\jansson + Source Files\jansson - Source Files\CUDA\jansson + Source Files\jansson - Source Files\CUDA\jansson + Source Files\jansson - Source Files\CUDA\jansson + Source Files\jansson - Source Files\CUDA\jansson + Source Files\jansson - Source Files\CUDA\jansson + Source Files\jansson Source Files\getopt @@ -464,4 +464,4 @@ Source Files\CUDA - + \ No newline at end of file diff --git a/configure.ac b/configure.ac index 3710824..50f5881 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([ccminer], [2014.09.11]) +AC_INIT([ccminer], [2014.09.28]) AC_PREREQ([2.59c]) AC_CANONICAL_SYSTEM diff --git a/cpu-miner.c b/cpu-miner.c index 37d8ec2..9d48b1f 100644 --- a/cpu-miner.c +++ b/cpu-miner.c @@ -362,6 +362,10 @@ struct work { uint32_t scanned_from; uint32_t scanned_to; + + /* deprecated, but maybe useful + for some 256-bit algos */ + uint32_t midstate[8]; }; static struct work g_work; @@ -421,6 +425,13 @@ static bool work_decode(const json_t *val, struct work *work) for (i = 0; i < ARRAY_SIZE(work->target); i++) work->target[i] = le32dec(work->target + i); + if (opt_algo == ALGO_ANIME || opt_algo == ALGO_BLAKE /* || opt_algo == ALGO_SHA256D || opt_algo == ALGO_SCRYPT */) { + jobj_binary(val, "midstate", work->midstate, sizeof(work->midstate)); + } + + /* use work ntime as job id (solo-mining) */ + cbin2hex(work->job_id, (const char*)&work->data[17], 4); + return true; err_out: @@ -594,8 +605,13 @@ static bool get_upstream_work(CURL *curl, struct work *work) if (opt_debug && rc) { timeval_subtract(&diff, &tv_end, &tv_start); - applog(LOG_DEBUG, "DEBUG: got new work in %u µs", - diff.tv_sec * 1000000 + diff.tv_usec); + /* anime : {"error":null,"result":{ + "target": "0000000000000000000000000000000000000000000000000000331a07000000", + "midstate":"57049c1d01d724567a1eb1886c5142cb79e7048f2ef206bee32441a90f3ec49e", + "hash1":"00000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000010000", + "data":"000000701bfd5bf1745a10bde7cab641e90b196146410b2b28d60d57b90f0b3d0000000454b7169957e174da9575c67bc4da6ba9d204ca04c8ff5ef05cb06c2cd38e92065427a8331d071a3300000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000080020000"}, + "id":0} */ + applog(LOG_DEBUG, "got new work %s", work->job_id); } json_decref(val); @@ -1459,7 +1475,7 @@ out: return NULL; } -#define PROGRAM_VERSION "1.4.4" +#define PROGRAM_VERSION "1.4.5" static void show_version_and_exit(void) { printf("%s v%s\n" diff --git a/cpuminer-config.h b/cpuminer-config.h index 4681e46..6979b65 100644 --- a/cpuminer-config.h +++ b/cpuminer-config.h @@ -156,7 +156,7 @@ #define PACKAGE_NAME "ccminer" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "ccminer 2014.09.11" +#define PACKAGE_STRING "ccminer 2014.09.28" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "ccminer" @@ -165,7 +165,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "2014.09.11" +#define PACKAGE_VERSION "1.4" /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be @@ -188,7 +188,7 @@ #define USE_XOP 1 /* Version number of package */ -#define VERSION "2014.09.11" +#define VERSION "2014.09.28" /* Define curl_free() as free() if our version of curl lacks curl_free. */ /* #undef curl_free */ diff --git a/miner.h b/miner.h index 7357978..e939473 100644 --- a/miner.h +++ b/miner.h @@ -352,7 +352,8 @@ extern uint16_t opt_vote; extern void applog(int prio, const char *fmt, ...); extern json_t *json_rpc_call(CURL *curl, const char *url, const char *userpass, const char *rpc_req, bool, bool, int *); -extern char *bin2hex(const unsigned char *p, size_t len); +extern void cbin2hex(char *out, const char *in, size_t len); +extern char *bin2hex(const unsigned char *in, size_t len); extern bool hex2bin(unsigned char *p, const char *hexstr, size_t len); extern int timeval_subtract(struct timeval *result, struct timeval *x, struct timeval *y); diff --git a/quark/animecoin.cu b/quark/animecoin.cu index 0d7466a..bb4f7da 100644 --- a/quark/animecoin.cu +++ b/quark/animecoin.cu @@ -140,7 +140,7 @@ extern "C" void animehash(void *state, const void *input) memcpy(state, hash, 32); } - +/* struct HashPredicate { HashPredicate(uint32_t *hashes, uint32_t startNonce) : @@ -158,7 +158,7 @@ struct HashPredicate uint32_t *m_hashes; uint32_t m_startNonce; }; - +*/ extern "C" int scanhash_anime(int thr_id, uint32_t *pdata, const uint32_t *ptarget, uint32_t max_nonce, @@ -170,7 +170,6 @@ extern "C" int scanhash_anime(int thr_id, uint32_t *pdata, ((uint32_t*)ptarget)[7] = 0x00000f; const uint32_t Htarg = ptarget[7]; - const int throughput = 256*2048; // 100; static bool init[8] = {0,0,0,0,0,0,0,0}; @@ -178,8 +177,7 @@ extern "C" int scanhash_anime(int thr_id, uint32_t *pdata, { cudaSetDevice(device_map[thr_id]); - // Konstanten kopieren, Speicher belegen - cudaMalloc(&d_hash[thr_id], 16 * sizeof(uint32_t) * throughput); + CUDA_SAFE_CALL(cudaMalloc(&d_hash[thr_id], 16 * sizeof(uint32_t) * throughput)); quark_blake512_cpu_init(thr_id, throughput); quark_groestl512_cpu_init(thr_id, throughput); @@ -190,10 +188,10 @@ extern "C" int scanhash_anime(int thr_id, uint32_t *pdata, cuda_check_cpu_init(thr_id, throughput); quark_compactTest_cpu_init(thr_id, throughput); - cudaMalloc(&d_animeNonces[thr_id], sizeof(uint32_t)*throughput); - cudaMalloc(&d_branch1Nonces[thr_id], sizeof(uint32_t)*throughput); - cudaMalloc(&d_branch2Nonces[thr_id], sizeof(uint32_t)*throughput); - cudaMalloc(&d_branch3Nonces[thr_id], sizeof(uint32_t)*throughput); + CUDA_SAFE_CALL(cudaMalloc(&d_animeNonces[thr_id], sizeof(uint32_t)*throughput)); + CUDA_SAFE_CALL(cudaMalloc(&d_branch1Nonces[thr_id], sizeof(uint32_t)*throughput)); + CUDA_SAFE_CALL(cudaMalloc(&d_branch2Nonces[thr_id], sizeof(uint32_t)*throughput)); + CUDA_SAFE_CALL(cudaMalloc(&d_branch3Nonces[thr_id], sizeof(uint32_t)*throughput)); init[thr_id] = true; } @@ -269,17 +267,22 @@ extern "C" int scanhash_anime(int thr_id, uint32_t *pdata, if ((vhash64[7]<=Htarg) && fulltest(vhash64, ptarget)) { pdata[19] = foundNonce; - *hashes_done = (foundNonce - first_nonce + 1)/2; + *hashes_done = foundNonce - first_nonce + 1; return 1; } else { applog(LOG_INFO, "GPU #%d: result for nonce $%08X does not validate on CPU!", thr_id, foundNonce); } } + if ((uint64_t)pdata[19] + throughput > (uint64_t)max_nonce) { + pdata[19] = max_nonce; + break; + } + pdata[19] += throughput; - } while (pdata[19] < max_nonce && !work_restart[thr_id].restart); + } while (!work_restart[thr_id].restart); - *hashes_done = (pdata[19] - first_nonce + 1)/2; + *hashes_done = pdata[19] - first_nonce + 1; return 0; } diff --git a/util.c b/util.c index 1c8cdb8..d6710bb 100644 --- a/util.c +++ b/util.c @@ -257,12 +257,12 @@ static size_t resp_hdr_cb(void *ptr, size_t size, size_t nmemb, void *user_data) goto out; if (!strcasecmp("X-Long-Polling", key)) { - hi->lp_path = val; /* steal memory reference */ + hi->lp_path = val; /* X-Mining-Extensions: longpoll */ val = NULL; } if (!strcasecmp("X-Reject-Reason", key)) { - hi->reason = val; /* steal memory reference */ + hi->reason = val; /* X-Mining-Extensions: reject-reason */ val = NULL; } @@ -389,7 +389,7 @@ json_t *json_rpc_call(CURL *curl, const char *url, headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, len_hdr); headers = curl_slist_append(headers, "User-Agent: " USER_AGENT); - headers = curl_slist_append(headers, "X-Mining-Extensions: midstate"); + headers = curl_slist_append(headers, "X-Mining-Extensions: longpoll midstate reject-reason"); headers = curl_slist_append(headers, "Accept:"); /* disable Accept hdr*/ headers = curl_slist_append(headers, "Expect:"); /* disable Expect hdr*/ @@ -433,7 +433,7 @@ json_t *json_rpc_call(CURL *curl, const char *url, if (opt_protocol) { char *s = json_dumps(val, JSON_INDENT(3)); - applog(LOG_DEBUG, "JSON protocol response:\n%s", s); + applog(LOG_DEBUG, "JSON protocol response:\n%s\n", s); free(s); } @@ -476,15 +476,22 @@ err_out: return NULL; } -char *bin2hex(const unsigned char *p, size_t len) +void cbin2hex(char *out, const char *in, size_t len) +{ + if (out) { + unsigned int i; + for (i = 0; i < len; i++) + sprintf(out + (i * 2), "%02x", (uint8_t)in[i]); + } +} + +char *bin2hex(const unsigned char *in, size_t len) { - unsigned int i; char *s = (char*)malloc((len * 2) + 1); if (!s) return NULL; - for (i = 0; i < len; i++) - sprintf(s + (i * 2), "%02x", (unsigned int) p[i]); + cbin2hex(s, (const char *) in, len); return s; } @@ -1433,7 +1440,7 @@ extern void applog_compare_hash(unsigned char *hash, unsigned char *hash2) char s[256] = ""; int len = 0; for (int i=0; i < 32; i += 4) { - char *color = memcmp(hash+i, hash2+i, 4) ? CL_RED : CL_GRY; + char *color = memcmp(hash+i, hash2+i, 4) ? CL_WHT : CL_GRY; len += sprintf(s+len, "%s%02x%02x%02x%02x " CL_GRY, color, hash[i], hash[i+1], hash[i+2], hash[i+3]); s[len] = '\0';