diff --git a/cgminer.c b/cgminer.c index ef7bf3b6..ae976b1b 100644 --- a/cgminer.c +++ b/cgminer.c @@ -5086,30 +5086,26 @@ static void set_work_target(struct work *work, double diff) static void gen_stratum_work(struct pool *pool, struct work *work) { unsigned char *coinbase, merkle_root[32], merkle_sha[64]; - int len, cb1_len, n1_len, cb2_len, i; char *header, *merkle_hash; uint32_t *data32, *swap32; size_t alloc_len; + int i; mutex_lock(&pool->pool_lock); /* Generate coinbase */ work->nonce2 = bin2hex((const unsigned char *)&pool->nonce2, pool->n2size); pool->nonce2++; - cb1_len = strlen(pool->swork.coinbase1) / 2; - n1_len = strlen(pool->nonce1) / 2; - cb2_len = strlen(pool->swork.coinbase2) / 2; - len = cb1_len + n1_len + pool->n2size + cb2_len; - alloc_len = len; + alloc_len = pool->swork.cb_len; align_len(&alloc_len); coinbase = calloc(alloc_len, 1); - hex2bin(coinbase, pool->swork.coinbase1, cb1_len); - hex2bin(coinbase + cb1_len, pool->nonce1, n1_len); - hex2bin(coinbase + cb1_len + n1_len, work->nonce2, pool->n2size); - hex2bin(coinbase + cb1_len + n1_len + pool->n2size, pool->swork.coinbase2, cb2_len); + hex2bin(coinbase, pool->swork.coinbase1, pool->swork.cb1_len); + hex2bin(coinbase + pool->swork.cb1_len, pool->nonce1, pool->n1_len); + hex2bin(coinbase + pool->swork.cb1_len + pool->n1_len, work->nonce2, pool->n2size); + hex2bin(coinbase + pool->swork.cb1_len + pool->n1_len + pool->n2size, pool->swork.coinbase2, pool->swork.cb2_len); /* Generate merkle root */ - gen_hash(coinbase, merkle_root, len); + gen_hash(coinbase, merkle_root, pool->swork.cb_len); free(coinbase); memcpy(merkle_sha, merkle_root, 32); for (i = 0; i < pool->swork.merkles; i++) { diff --git a/miner.h b/miner.h index 8dbffa5e..e9982b7a 100644 --- a/miner.h +++ b/miner.h @@ -855,6 +855,10 @@ struct stratum_work { char *ntime; bool clean; + size_t cb1_len; + size_t cb2_len; + size_t cb_len; + size_t header_len; int merkles; double diff; @@ -934,6 +938,7 @@ struct pool { size_t sockbuf_size; char *sockaddr_url; /* stripped url used for sockaddr */ char *nonce1; + size_t n1_len; uint32_t nonce2; int n2size; bool has_stratum; diff --git a/util.c b/util.c index dd99e1b1..7e84c537 100644 --- a/util.c +++ b/util.c @@ -1131,11 +1131,15 @@ static bool parse_notify(struct pool *pool, json_t *val) pool->swork.job_id = job_id; pool->swork.prev_hash = prev_hash; pool->swork.coinbase1 = coinbase1; + pool->swork.cb1_len = strlen(coinbase1) / 2; pool->swork.coinbase2 = coinbase2; + pool->swork.cb2_len = strlen(coinbase2) / 2; pool->swork.bbversion = bbversion; pool->swork.nbit = nbit; pool->swork.ntime = ntime; pool->swork.clean = clean; + pool->swork.cb_len = pool->swork.cb1_len + pool->n1_len + pool->n2size + pool->swork.cb2_len; + for (i = 0; i < pool->swork.merkles; i++) free(pool->swork.merkle[i]); if (merkles) { @@ -1468,6 +1472,7 @@ bool initiate_stratum(struct pool *pool) applog(LOG_INFO, "Failed to get nonce1 in initiate_stratum"); goto out; } + pool->n1_len = strlen(pool->nonce1) / 2; pool->n2size = json_integer_value(json_array_get(res_val, 2)); if (!pool->n2size) { applog(LOG_INFO, "Failed to get n2size in initiate_stratum");