Browse Source

Abstract out share diff / hash calculation for reuse

master
Con Kolivas 9 years ago
parent
commit
8dfc0b8e44
  1. 52
      src/stratifier.c

52
src/stratifier.c

@ -4702,28 +4702,27 @@ test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uc
ckdbq_add(ckp, ID_BLOCK, val); ckdbq_add(ckp, ID_BLOCK, val);
} }
/* Needs to be entered with client holding a ref count. */ /* Calculate share diff and fill in hash and swap */
static double submission_diff(const stratum_instance_t *client, const workbase_t *wb, const char *nonce2, static double
const uint32_t ntime32, const char *nonce, uchar *hash) share_diff(char *coinbase, const uchar *enonce1bin, const workbase_t *wb, const char *nonce2,
const uint32_t ntime32, const char *nonce, uchar *hash, uchar *swap, int *cblen)
{ {
unsigned char merkle_root[32], merkle_sha[64]; unsigned char merkle_root[32], merkle_sha[64];
uint32_t *data32, *swap32, benonce32; uint32_t *data32, *swap32, benonce32;
char *coinbase, data[80]; uchar hash1[32];
uchar swap[80], hash1[32]; char data[80];
int cblen, i; int i;
double ret;
coinbase = alloca(wb->coinb1len + wb->enonce1constlen + wb->enonce1varlen + wb->enonce2varlen + wb->coinb2len);
memcpy(coinbase, wb->coinb1bin, wb->coinb1len); memcpy(coinbase, wb->coinb1bin, wb->coinb1len);
cblen = wb->coinb1len; *cblen = wb->coinb1len;
memcpy(coinbase + cblen, &client->enonce1bin, wb->enonce1constlen + wb->enonce1varlen); memcpy(coinbase + *cblen, enonce1bin, wb->enonce1constlen + wb->enonce1varlen);
cblen += wb->enonce1constlen + wb->enonce1varlen; *cblen += wb->enonce1constlen + wb->enonce1varlen;
hex2bin(coinbase + cblen, nonce2, wb->enonce2varlen); hex2bin(coinbase + *cblen, nonce2, wb->enonce2varlen);
cblen += wb->enonce2varlen; *cblen += wb->enonce2varlen;
memcpy(coinbase + cblen, wb->coinb2bin, wb->coinb2len); memcpy(coinbase + *cblen, wb->coinb2bin, wb->coinb2len);
cblen += wb->coinb2len; *cblen += wb->coinb2len;
gen_hash((uchar *)coinbase, merkle_root, cblen); gen_hash((uchar *)coinbase, merkle_root, *cblen);
memcpy(merkle_sha, merkle_root, 32); memcpy(merkle_sha, merkle_root, 32);
for (i = 0; i < wb->merkles; i++) { for (i = 0; i < wb->merkles; i++) {
memcpy(merkle_sha + 32, &wb->merklebin[i], 32); memcpy(merkle_sha + 32, &wb->merklebin[i], 32);
@ -4755,11 +4754,28 @@ static double submission_diff(const stratum_instance_t *client, const workbase_t
sha256(hash1, 32, hash); sha256(hash1, 32, hash);
/* Calculate the diff of the share here */ /* Calculate the diff of the share here */
ret = diff_from_target(hash); return diff_from_target(hash);
}
/* Needs to be entered with client holding a ref count. */
static double submission_diff(const stratum_instance_t *client, const workbase_t *wb, const char *nonce2,
const uint32_t ntime32, const char *nonce, uchar *hash)
{
char *coinbase;
uchar swap[80];
double ret;
int cblen;
coinbase = ckalloc(wb->coinb1len + wb->enonce1constlen + wb->enonce1varlen + wb->enonce2varlen + wb->coinb2len);
/* Calculate the diff of the share here */
ret = share_diff(coinbase, client->enonce1bin, wb, nonce2, ntime32, nonce, hash, swap, &cblen);
/* Test we haven't solved a block regardless of share status */ /* Test we haven't solved a block regardless of share status */
test_blocksolve(client, wb, swap, hash, ret, coinbase, cblen, nonce2, nonce); test_blocksolve(client, wb, swap, hash, ret, coinbase, cblen, nonce2, nonce);
free(coinbase);
return ret; return ret;
} }

Loading…
Cancel
Save