Browse Source

decred: prepare full stratum support

master
Tanguy Pruvot 9 years ago
parent
commit
4e769915d8
  1. 26
      ccminer.cpp

26
ccminer.cpp

@ -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;

Loading…
Cancel
Save