|
|
@ -1344,9 +1344,16 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) |
|
|
|
/* Generate merkle root */ |
|
|
|
/* Generate merkle root */ |
|
|
|
switch (opt_algo) { |
|
|
|
switch (opt_algo) { |
|
|
|
case ALGO_DECRED: |
|
|
|
case ALGO_DECRED: |
|
|
|
|
|
|
|
//applog(LOG_BLUE, "block version %x", le32dec(sctx->job.version));
|
|
|
|
|
|
|
|
if (le32dec(sctx->job.version) & 0xFF) { |
|
|
|
|
|
|
|
// getwork over stratum
|
|
|
|
memcpy(merkle_root, sctx->job.coinbase, 32); |
|
|
|
memcpy(merkle_root, sctx->job.coinbase, 32); |
|
|
|
memcpy(extraheader, &sctx->job.coinbase[32], (int)sctx->job.coinbase_size - 32); |
|
|
|
memcpy(extraheader, &sctx->job.coinbase[32], (int)sctx->job.coinbase_size - 32); |
|
|
|
headersize = (int)sctx->job.coinbase_size - 32; |
|
|
|
headersize = (int)sctx->job.coinbase_size - 32; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
// future stratum with coinbase
|
|
|
|
|
|
|
|
sha256d(merkle_root, sctx->job.coinbase, (int)sctx->job.coinbase_size); |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case ALGO_HEAVY: |
|
|
|
case ALGO_HEAVY: |
|
|
|
case ALGO_MJOLLNIR: |
|
|
|
case ALGO_MJOLLNIR: |
|
|
@ -1368,7 +1375,7 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) |
|
|
|
memcpy(merkle_root + 32, sctx->job.merkle[i], 32); |
|
|
|
memcpy(merkle_root + 32, sctx->job.merkle[i], 32); |
|
|
|
if (opt_algo == ALGO_HEAVY || opt_algo == ALGO_MJOLLNIR) |
|
|
|
if (opt_algo == ALGO_HEAVY || opt_algo == ALGO_MJOLLNIR) |
|
|
|
heavycoin_hash(merkle_root, merkle_root, 64); |
|
|
|
heavycoin_hash(merkle_root, merkle_root, 64); |
|
|
|
else if (opt_algo != ALGO_DECRED) |
|
|
|
else if (!headersize) |
|
|
|
sha256d(merkle_root, merkle_root, 64); |
|
|
|
sha256d(merkle_root, merkle_root, 64); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -1384,13 +1391,25 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) |
|
|
|
work->data[9 + i] = be32dec((uint32_t *)merkle_root + i); |
|
|
|
work->data[9 + i] = be32dec((uint32_t *)merkle_root + i); |
|
|
|
|
|
|
|
|
|
|
|
if (opt_algo == ALGO_DECRED) { |
|
|
|
if (opt_algo == ALGO_DECRED) { |
|
|
|
|
|
|
|
// all is reversed to keep same endian as ocminer getwork pool (same as ZR5)
|
|
|
|
uint32_t* extradata = (uint32_t*) sctx->xnonce1; |
|
|
|
uint32_t* extradata = (uint32_t*) sctx->xnonce1; |
|
|
|
|
|
|
|
if (headersize) { |
|
|
|
|
|
|
|
// getwork over stratum
|
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
work->data[1 + i] = swab32(work->data[1 + i]); |
|
|
|
work->data[1 + i] = swab32(work->data[1 + i]); |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
work->data[9 + i] = swab32(work->data[9 + i]); |
|
|
|
work->data[9 + i] = swab32(work->data[9 + i]); |
|
|
|
for (i = 0; i < headersize/4; i++) |
|
|
|
for (i = 0; i < headersize/4; i++) |
|
|
|
work->data[17 + i] = le32dec((uint32_t*)extraheader + i); |
|
|
|
work->data[17 + i] = le32dec((uint32_t*)extraheader + i); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
work->data[0] = swab32(work->data[0]); |
|
|
|
|
|
|
|
for (i = 0; i < 8; i++) |
|
|
|
|
|
|
|
work->data[9 + i] = swab32(work->data[9 + i]); |
|
|
|
|
|
|
|
// todo work->data[17..33], but how ? :p
|
|
|
|
|
|
|
|
work->data[29] = be32dec(sctx->job.nbits); |
|
|
|
|
|
|
|
work->data[32] = sctx->job.height; |
|
|
|
|
|
|
|
work->data[34] = be32dec(sctx->job.ntime); |
|
|
|
|
|
|
|
} |
|
|
|
for (i = 0; i < sctx->xnonce1_size/4; i++) |
|
|
|
for (i = 0; i < sctx->xnonce1_size/4; i++) |
|
|
|
work->data[36 + i] = extradata[i]; |
|
|
|
work->data[36 + i] = extradata[i]; |
|
|
|
work->data[37] = (rand()*4) << 8; |
|
|
|
work->data[37] = (rand()*4) << 8; |
|
|
@ -1398,6 +1417,7 @@ static bool stratum_gen_work(struct stratum_ctx *sctx, struct work *work) |
|
|
|
work->data[i] = 0; |
|
|
|
work->data[i] = 0; |
|
|
|
sctx->job.height = work->data[32]; |
|
|
|
sctx->job.height = work->data[32]; |
|
|
|
//applog_hex(work->data, 180);
|
|
|
|
//applog_hex(work->data, 180);
|
|
|
|
|
|
|
|
//applog_hex(&work->data[17], 64);
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
work->data[17] = le32dec(sctx->job.ntime); |
|
|
|
work->data[17] = le32dec(sctx->job.ntime); |
|
|
|
work->data[18] = le32dec(sctx->job.nbits); |
|
|
|
work->data[18] = le32dec(sctx->job.nbits); |
|
|
@ -3259,6 +3279,10 @@ int main(int argc, char *argv[]) |
|
|
|
cur_pooln = pool_get_first_valid(0); |
|
|
|
cur_pooln = pool_get_first_valid(0); |
|
|
|
pool_switch(-1, cur_pooln); |
|
|
|
pool_switch(-1, cur_pooln); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (opt_algo == ALGO_DECRED) { |
|
|
|
|
|
|
|
allow_gbt = false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) |
|
|
|
flags = !opt_benchmark && strncmp(rpc_url, "https:", 6) |
|
|
|
? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) |
|
|
|
? (CURL_GLOBAL_ALL & ~CURL_GLOBAL_SSL) |
|
|
|
: CURL_GLOBAL_ALL; |
|
|
|
: CURL_GLOBAL_ALL; |
|
|
|