Browse Source

Invalidate workbases from old blocks and reject shares that don't have a matching workbase

master
Con Kolivas 11 years ago
parent
commit
e383d6f736
  1. 23
      src/stratifier.c

23
src/stratifier.c

@ -116,6 +116,7 @@ struct stratum_instance {
UT_hash_handle hh; UT_hash_handle hh;
int id; int id;
char enonce1[20]; char enonce1[20];
char enonce1bin[8];
double diff; double diff;
bool authorised; bool authorised;
bool disconnected; bool disconnected;
@ -316,6 +317,10 @@ static void update_base(ckpool_t *ckp)
if (tmp->gentime < wb->gentime - 600) { if (tmp->gentime < wb->gentime - 600) {
HASH_DEL(workbases, tmp); HASH_DEL(workbases, tmp);
clear_workbase(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); 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) static stratum_instance_t *__stratum_add_instance(int id)
{ {
stratum_instance_t *instance = ckzalloc(sizeof(stratum_instance_t)); 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->id = id;
instance->diff = 1.0; instance->diff = 1.0;
LOGDEBUG("Added instance %d with enonce1 %s", id, instance->enonce1); 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; const char *user, *job_id, *nonce2, *ntime, *nonce;
bool ret = false; bool ret = false;
int wb_id; workbase_t *wb;
int id;
if (unlikely(!json_is_array(params_val))) { if (unlikely(!json_is_array(params_val))) {
*err_val = json_string("params not an array"); *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"); *err_val = json_string("Worker mismatch");
goto out; 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; ret = true;
out: out:

Loading…
Cancel
Save