Fix various coinbase assembly issues
This commit is contained in:
parent
db1b2b45a4
commit
72e6026052
@ -723,6 +723,8 @@ static int proxy_loop(proc_instance_t *pi, connsock_t *cs, proxy_instance_t *pro
|
||||
/* We're not subscribed and authorised so tell the stratifier to
|
||||
* retrieve the first subscription. */
|
||||
send_proc(ckp->stratifier, "subscribe");
|
||||
send_proc(ckp->stratifier, "notify");
|
||||
proxi->notified = false;
|
||||
|
||||
retry:
|
||||
sockd = accept(us->sockd, NULL, NULL);
|
||||
|
||||
@ -127,6 +127,7 @@ struct workbase {
|
||||
char *logdir;
|
||||
|
||||
ckpool_t *ckp;
|
||||
bool proxy;
|
||||
};
|
||||
|
||||
typedef struct workbase workbase_t;
|
||||
@ -182,6 +183,7 @@ struct stratum_instance {
|
||||
int id;
|
||||
|
||||
char enonce1[32];
|
||||
uchar enonce1bin[16];
|
||||
uint64_t enonce1_64;
|
||||
|
||||
int diff; /* Current diff */
|
||||
@ -500,9 +502,10 @@ static void update_notify(ckpool_t *ckp)
|
||||
|
||||
LOGDEBUG("Update notify: %s", buf);
|
||||
wb = ckzalloc(sizeof(workbase_t));
|
||||
wb->ckp = ckp;
|
||||
val = json_loads(buf, 0, NULL);
|
||||
dealloc(buf);
|
||||
wb->ckp = ckp;
|
||||
wb->proxy = true;
|
||||
|
||||
json_uint64cpy(&wb->id, val, "jobid");
|
||||
json_strcpy(wb->prevhash, val, "prevhash");
|
||||
@ -521,6 +524,7 @@ static void update_notify(ckpool_t *ckp)
|
||||
json_strcpy(wb->bbversion, val, "bbversion");
|
||||
json_strcpy(wb->nbit, val, "nbit");
|
||||
json_strcpy(wb->ntime, val, "ntime");
|
||||
sscanf(wb->ntime, "%x", &wb->ntime32);
|
||||
clean = json_is_true(json_object_get(val, "clean"));
|
||||
json_decref(val);
|
||||
wb->gentime = time(NULL);
|
||||
@ -535,7 +539,8 @@ static void update_notify(ckpool_t *ckp)
|
||||
|
||||
ck_rlock(&workbase_lock);
|
||||
strcpy(wb->enonce1const, proxy_base.enonce1);
|
||||
memcpy(wb->enonce1constbin, proxy_base.enonce1bin, proxy_base.enonce1constlen);
|
||||
wb->enonce1constlen = proxy_base.enonce1constlen;
|
||||
memcpy(wb->enonce1constbin, proxy_base.enonce1bin, wb->enonce1constlen);
|
||||
wb->enonce1varlen = wb->enonce2constlen = proxy_base.enonce2constlen;
|
||||
wb->enonce2varlen = proxy_base.enonce2varlen;
|
||||
wb->diff = proxy_base.diff;
|
||||
@ -846,12 +851,12 @@ static void *blockupdate(void *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static uint64_t new_enonce1(char *enonce1)
|
||||
static void new_enonce1(stratum_instance_t *client)
|
||||
{
|
||||
workbase_t *wb;
|
||||
uint64_t ret;
|
||||
|
||||
ck_wlock(&workbase_lock);
|
||||
client->enonce1_64 = enonce1_64;
|
||||
wb = current_workbase;
|
||||
if (wb->enonce1varlen == 8) {
|
||||
enonce1_64++;
|
||||
@ -864,11 +869,11 @@ static uint64_t new_enonce1(char *enonce1)
|
||||
|
||||
++(*enonce1_32);
|
||||
}
|
||||
sprintf(enonce1, "%s%0*lx", wb->enonce1const, wb->enonce1varlen, enonce1_64);
|
||||
ret = enonce1_64;
|
||||
if (wb->enonce1constlen)
|
||||
memcpy(client->enonce1bin, wb->enonce1constbin, wb->enonce1constlen);
|
||||
memcpy(client->enonce1bin + wb->enonce1constlen, &client->enonce1_64, wb->enonce1varlen);
|
||||
__bin2hex(client->enonce1, client->enonce1bin, wb->enonce1constlen + wb->enonce1varlen);
|
||||
ck_wunlock(&workbase_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Extranonce1 must be set here */
|
||||
@ -906,8 +911,7 @@ static json_t *parse_subscribe(int client_id, json_t *params_val)
|
||||
LOGDEBUG("Found old session id %s", buf);
|
||||
/* Add matching here */
|
||||
if (disconnected_sessionid_exists(buf, client_id)) {
|
||||
hex2bin(&client->enonce1_64, buf, 8);
|
||||
strcpy(client->enonce1, buf);
|
||||
sprintf(client->enonce1, "%016lx", client->enonce1_64);
|
||||
old_match = true;
|
||||
stats.reused_clients++;
|
||||
}
|
||||
@ -915,7 +919,7 @@ static json_t *parse_subscribe(int client_id, json_t *params_val)
|
||||
}
|
||||
if (!old_match) {
|
||||
/* Create a new extranonce1 based on a uint64_t pointer */
|
||||
client->enonce1_64 = new_enonce1(client->enonce1);
|
||||
new_enonce1(client);
|
||||
LOGINFO("Set new subscription %d to new enonce1 %s", client->id,
|
||||
client->enonce1);
|
||||
} else {
|
||||
@ -1139,8 +1143,8 @@ static double submission_diff(stratum_instance_t *client, workbase_t *wb, const
|
||||
|
||||
memcpy(coinbase, wb->coinb1bin, wb->coinb1len);
|
||||
cblen += wb->coinb1len;
|
||||
memcpy(coinbase + cblen, &client->enonce1_64, wb->enonce1varlen);
|
||||
cblen += wb->enonce1varlen;
|
||||
memcpy(coinbase + cblen, &client->enonce1bin, wb->enonce1constlen + wb->enonce1varlen);
|
||||
cblen += wb->enonce1constlen + wb->enonce1varlen;
|
||||
hex2bin(coinbase + cblen, nonce2, wb->enonce2varlen);
|
||||
cblen += wb->enonce2varlen;
|
||||
memcpy(coinbase + cblen, wb->coinb2bin, wb->coinb2len);
|
||||
@ -1181,7 +1185,8 @@ static double submission_diff(stratum_instance_t *client, workbase_t *wb, const
|
||||
ret = diff_from_target(hash);
|
||||
|
||||
/* Test we haven't solved a block regardless of share status */
|
||||
test_blocksolve(wb, swap, ret, coinbase, cblen);
|
||||
if (!wb->proxy)
|
||||
test_blocksolve(wb, swap, ret, coinbase, cblen);
|
||||
|
||||
/* FIXME: Log share here */
|
||||
return ret;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user