Browse Source

Put bloc height extraction in a function

master
Tanguy Pruvot 10 years ago
parent
commit
31f77b6524
  1. 36
      util.c

36
util.c

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

Loading…
Cancel
Save