|
|
@ -1012,6 +1012,36 @@ out: |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* Extract bloc height L H... here len=3, height=0x1333e8 |
|
|
|
|
|
|
|
* "...0000000000ffffffff2703e83313062f503253482f043d61105408" |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
static uint32_t getblocheight(struct stratum_ctx *sctx) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
uint32_t height = 0; |
|
|
|
|
|
|
|
uint8_t hlen = 0, *p, *m; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// find 0xffff tag
|
|
|
|
|
|
|
|
p = (uint8_t*) sctx->job.coinbase + 32; |
|
|
|
|
|
|
|
m = p + 128; |
|
|
|
|
|
|
|
while (*p != 0xff && p < m) p++; |
|
|
|
|
|
|
|
while (*p == 0xff && p < m) p++; |
|
|
|
|
|
|
|
if (*(p-1) == 0xff && *(p-2) == 0xff) { |
|
|
|
|
|
|
|
p++; hlen = *p; |
|
|
|
|
|
|
|
p++; height = le16dec(p); |
|
|
|
|
|
|
|
p += 2; |
|
|
|
|
|
|
|
switch (hlen) { |
|
|
|
|
|
|
|
case 4: |
|
|
|
|
|
|
|
height += 0x10000UL * le16dec(p); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 3: |
|
|
|
|
|
|
|
height += 0x10000UL * (*p); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return height; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) |
|
|
|
static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const char *job_id, *prevhash, *coinb1, *coinb2, *version, *nbits, *stime, *nreward; |
|
|
|
const char *job_id, *prevhash, *coinb1, *coinb2, *version, *nbits, *stime, *nreward; |
|
|
@ -1020,7 +1050,7 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) |
|
|
|
int merkle_count, i; |
|
|
|
int merkle_count, i; |
|
|
|
json_t *merkle_arr; |
|
|
|
json_t *merkle_arr; |
|
|
|
unsigned char **merkle; |
|
|
|
unsigned char **merkle; |
|
|
|
int ntime, hoffset; |
|
|
|
int ntime; |
|
|
|
|
|
|
|
|
|
|
|
job_id = json_string_value(json_array_get(params, 0)); |
|
|
|
job_id = json_string_value(json_array_get(params, 0)); |
|
|
|
prevhash = json_string_value(json_array_get(params, 1)); |
|
|
|
prevhash = json_string_value(json_array_get(params, 1)); |
|
|
@ -1078,8 +1108,6 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) |
|
|
|
hex2bin(sctx->job.coinbase, coinb1, coinb1_size); |
|
|
|
hex2bin(sctx->job.coinbase, coinb1, coinb1_size); |
|
|
|
memcpy(sctx->job.coinbase + coinb1_size, sctx->xnonce1, sctx->xnonce1_size); |
|
|
|
memcpy(sctx->job.coinbase + coinb1_size, sctx->xnonce1, sctx->xnonce1_size); |
|
|
|
|
|
|
|
|
|
|
|
hoffset = coinb1_size - 15; // 43;
|
|
|
|
|
|
|
|
sctx->bloc_height = le16dec((uint8_t*) sctx->job.coinbase + hoffset); |
|
|
|
|
|
|
|
if (!sctx->job.job_id || strcmp(sctx->job.job_id, job_id)) |
|
|
|
if (!sctx->job.job_id || strcmp(sctx->job.job_id, job_id)) |
|
|
|
memset(sctx->job.xnonce2, 0, sctx->xnonce2_size); |
|
|
|
memset(sctx->job.xnonce2, 0, sctx->xnonce2_size); |
|
|
|
hex2bin(sctx->job.xnonce2 + sctx->xnonce2_size, coinb2, coinb2_size); |
|
|
|
hex2bin(sctx->job.xnonce2 + sctx->xnonce2_size, coinb2, coinb2_size); |
|
|
@ -1088,6 +1116,8 @@ static bool stratum_notify(struct stratum_ctx *sctx, json_t *params) |
|
|
|
sctx->job.job_id = strdup(job_id); |
|
|
|
sctx->job.job_id = strdup(job_id); |
|
|
|
hex2bin(sctx->job.prevhash, prevhash, 32); |
|
|
|
hex2bin(sctx->job.prevhash, prevhash, 32); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sctx->bloc_height = getblocheight(sctx); |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < sctx->job.merkle_count; i++) |
|
|
|
for (i = 0; i < sctx->job.merkle_count; i++) |
|
|
|
free(sctx->job.merkle[i]); |
|
|
|
free(sctx->job.merkle[i]); |
|
|
|
free(sctx->job.merkle); |
|
|
|
free(sctx->job.merkle); |
|
|
|