bool std_work_decode( const json_t *val, struct work *work) { int i; int data_size = sizeof(work->data); int target_size = sizeof(work->target); int adata_sz = ARRAY_SIZE(work->data); int atarget_sz = ARRAY_SIZE(work->target); algo_gate.set_data_and_target_size( &data_size, &target_size, &adata_sz, &atarget_sz, &allow_mininginfo ); if (jsonrpc_2) return rpc2_job_decode(val, work); if (unlikely(!jobj_binary(val, "data", work->data, data_size))) { applog(LOG_ERR, "JSON invalid data"); return false; } if (unlikely(!jobj_binary(val, "target", work->target, target_size))) { applog(LOG_ERR, "JSON invalid target"); return false; } for (i = 0; i < adata_sz; i++) work->data[i] = le32dec(work->data + i); for (i = 0; i < atarget_sz; i++) work->target[i] = le32dec(work->target + i); return true; }
static bool stratum_2_job(struct stratum_ctx *sctx, json_t *params) { bool ret = false; pthread_mutex_lock(&sctx->work_lock); ret = rpc2_job_decode(params, &sctx->work); pthread_mutex_unlock(&sctx->work_lock); return ret; }
bool stratum_authorize(struct stratum_ctx *sctx, const char *user, const char *pass) { json_t *val = NULL, *res_val, *err_val; char *s, *sret; json_error_t err; bool ret = false; if(jsonrpc_2) { s = (char*)malloc(300 + strlen(user) + strlen(pass)); sprintf(s, "{\"method\": \"login\", \"params\": {\"login\": \"%s\", \"pass\": \"%s\", \"agent\": \"cpuminer-multi/0.1\"}, \"id\": 1}", user, pass); } else { s = (char*)malloc(80 + strlen(user) + strlen(pass)); sprintf(s, "{\"id\": 2, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}", user, pass); } if (!stratum_send_line(sctx, s)) goto out; while (1) { sret = stratum_recv_line(sctx); if (!sret) goto out; if (!stratum_handle_method(sctx, sret)) break; free(sret); } val = JSON_LOADS(sret, &err); free(sret); if (!val) { applog(LOG_ERR, "JSON decode failed(%d): %s", err.line, err.text); goto out; } res_val = json_object_get(val, "result"); err_val = json_object_get(val, "error"); if (!res_val || json_is_false(res_val) || (err_val && !json_is_null(err_val))) { applog(LOG_ERR, "Stratum authentication failed"); goto out; } if(jsonrpc_2) { rpc2_login_decode(val); json_t *job_val = json_object_get(res_val, "job"); pthread_mutex_lock(&sctx->work_lock); if(job_val) rpc2_job_decode(job_val, &sctx->work); pthread_mutex_unlock(&sctx->work_lock); } ret = true; out: free(s); if (val) json_decref(val); return ret; }