void hodl_set_target( struct work* work, double diff ) { diff_to_target(work->target, diff / 8388608.0 ); }
bool client_submit(YAAMP_CLIENT *client, json_value *json_params) { // submit(worker_name, jobid, extranonce2, ntime, nonce): if(json_params->u.array.length<5) { debuglog("%s - %s bad message\n", client->username, client->sock->ip); client->submit_bad++; return false; } // char name[1024]; char extranonce2[32]; char ntime[32]; char nonce[32]; memset(extranonce2, 0, 32); memset(ntime, 0, 32); memset(nonce, 0, 32); int jobid = htoi(json_params->u.array.values[1]->u.string.ptr); strncpy(extranonce2, json_params->u.array.values[2]->u.string.ptr, 31); strncpy(ntime, json_params->u.array.values[3]->u.string.ptr, 31); strncpy(nonce, json_params->u.array.values[4]->u.string.ptr, 31); // debuglog("submit %s %d, %s, %s, %s\n", client->sock->ip, jobid, extranonce2, ntime, nonce); string_lower(extranonce2); string_lower(ntime); string_lower(nonce); YAAMP_JOB *job = (YAAMP_JOB *)object_find(&g_list_job, jobid, true); if(!job) { client_submit_error(client, NULL, 21, "Invalid job id", extranonce2, ntime, nonce); return true; } if(job->deleted) { client_send_result(client, "true"); object_unlock(job); return true; } YAAMP_JOB_TEMPLATE *templ = job->templ; // dump_submit_debug(client, job, extranonce2, ntime, nonce); if(strlen(nonce) != YAAMP_NONCE_SIZE*2) { client_submit_error(client, job, 20, "Invalid nonce size", extranonce2, ntime, nonce); return true; } // if(strcmp(ntime, templ->ntime)) // { // client_submit_error(client, job, 23, "Invalid time rolling", extranonce2, ntime, nonce); // return true; // } YAAMP_SHARE *share = share_find(job->id, extranonce2, ntime, nonce, client->extranonce1); if(share) { client_submit_error(client, job, 22, "Duplicate share", extranonce2, ntime, nonce); return true; } if(strlen(extranonce2) != client->extranonce2size*2) { client_submit_error(client, job, 24, "Invalid extranonce2 size", extranonce2, ntime, nonce); return true; } /////////////////////////////////////////////////////////////////////////////////////////// YAAMP_JOB_VALUES submitvalues; memset(&submitvalues, 0, sizeof(submitvalues)); build_submit_values(&submitvalues, templ, client->extranonce1, extranonce2, ntime, nonce); if(submitvalues.hash_bin[30] || submitvalues.hash_bin[31]) { client_submit_error(client, job, 25, "Invalid share", extranonce2, ntime, nonce); return true; } uint64_t hash_int = get_hash_difficulty(submitvalues.hash_bin); uint64_t user_target = diff_to_target(client->difficulty_actual); uint64_t coin_target = decode_compact(templ->nbits); // debuglog("%016llx actual\n", hash_int); // debuglog("%016llx target\n", user_target); // debuglog("%016llx coin\n", coin_target); if(hash_int > user_target && hash_int > coin_target) { client_submit_error(client, job, 26, "Low difficulty share", extranonce2, ntime, nonce); return true; } if(job->coind) client_do_submit(client, job, &submitvalues, extranonce2, ntime, nonce); else remote_submit(client, job, &submitvalues, extranonce2, ntime, nonce); client_send_result(client, "true"); client_record_difficulty(client); client->submit_bad = 0; share_add(client, job, true, extranonce2, ntime, nonce, 0); object_unlock(job); return true; }