Invalidate workbases from old blocks and reject shares that don't have a matching workbase
This commit is contained in:
parent
328a85c1fe
commit
e383d6f736
@ -116,6 +116,7 @@ struct stratum_instance {
|
||||
UT_hash_handle hh;
|
||||
int id;
|
||||
char enonce1[20];
|
||||
char enonce1bin[8];
|
||||
double diff;
|
||||
bool authorised;
|
||||
bool disconnected;
|
||||
@ -316,6 +317,10 @@ static void update_base(ckpool_t *ckp)
|
||||
if (tmp->gentime < wb->gentime - 600) {
|
||||
HASH_DEL(workbases, tmp);
|
||||
clear_workbase(tmp);
|
||||
/* Remove all workbases from old blocks/orphans */
|
||||
} else if (strncmp(tmp->prevhash, lasthash, 64)) {
|
||||
HASH_DEL(workbases, tmp);
|
||||
clear_workbase(tmp);
|
||||
}
|
||||
}
|
||||
HASH_ADD_INT(workbases, id, wb);
|
||||
@ -338,8 +343,11 @@ static stratum_instance_t *__instance_by_id(int id)
|
||||
static stratum_instance_t *__stratum_add_instance(int id)
|
||||
{
|
||||
stratum_instance_t *instance = ckzalloc(sizeof(stratum_instance_t));
|
||||
uint64_t *u64;
|
||||
|
||||
sprintf(instance->enonce1, "%016lx", enonce1_64++);
|
||||
u64 = (uint64_t *)instance->enonce1bin;
|
||||
*u64 = htobe64(enonce1_64++);
|
||||
__bin2hex(instance->enonce1, instance->enonce1bin, 8);
|
||||
instance->id = id;
|
||||
instance->diff = 1.0;
|
||||
LOGDEBUG("Added instance %d with enonce1 %s", id, instance->enonce1);
|
||||
@ -627,7 +635,8 @@ static json_t *parse_submit(stratum_instance_t *client, json_t *params_val, json
|
||||
{
|
||||
const char *user, *job_id, *nonce2, *ntime, *nonce;
|
||||
bool ret = false;
|
||||
int wb_id;
|
||||
workbase_t *wb;
|
||||
int id;
|
||||
|
||||
if (unlikely(!json_is_array(params_val))) {
|
||||
*err_val = json_string("params not an array");
|
||||
@ -666,7 +675,15 @@ static json_t *parse_submit(stratum_instance_t *client, json_t *params_val, json
|
||||
*err_val = json_string("Worker mismatch");
|
||||
goto out;
|
||||
}
|
||||
sscanf(job_id, "%08x", &wb_id);
|
||||
sscanf(job_id, "%08x", &id);
|
||||
|
||||
ck_rlock(&workbase_lock);
|
||||
HASH_FIND_INT(workbases, &id, wb);
|
||||
if (unlikely(!wb)) {
|
||||
ck_runlock(&workbase_lock);
|
||||
goto out;
|
||||
}
|
||||
ck_runlock(&workbase_lock);
|
||||
|
||||
ret = true;
|
||||
out:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user