mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-11 15:27:53 +00:00
Move to storing the nonce1 in the work struct instead of the sessionid for the now defunct first draft mining.resume protocol.
This commit is contained in:
parent
7f595ca04b
commit
68d691093c
15
cgminer.c
15
cgminer.c
@ -1380,7 +1380,7 @@ void clean_work(struct work *work)
|
|||||||
free(work->nonce2);
|
free(work->nonce2);
|
||||||
free(work->ntime);
|
free(work->ntime);
|
||||||
free(work->gbt_coinbase);
|
free(work->gbt_coinbase);
|
||||||
free(work->sessionid);
|
free(work->nonce1);
|
||||||
memset(work, 0, sizeof(struct work));
|
memset(work, 0, sizeof(struct work));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2946,12 +2946,12 @@ void __copy_work(struct work *work, struct work *base_work)
|
|||||||
work->id = id;
|
work->id = id;
|
||||||
if (base_work->job_id)
|
if (base_work->job_id)
|
||||||
work->job_id = strdup(base_work->job_id);
|
work->job_id = strdup(base_work->job_id);
|
||||||
|
if (base_work->nonce1)
|
||||||
|
work->nonce1 = strdup(base_work->nonce1);
|
||||||
if (base_work->nonce2)
|
if (base_work->nonce2)
|
||||||
work->nonce2 = strdup(base_work->nonce2);
|
work->nonce2 = strdup(base_work->nonce2);
|
||||||
if (base_work->ntime)
|
if (base_work->ntime)
|
||||||
work->ntime = strdup(base_work->ntime);
|
work->ntime = strdup(base_work->ntime);
|
||||||
if (base_work->sessionid)
|
|
||||||
work->sessionid = strdup(base_work->sessionid);
|
|
||||||
if (base_work->gbt_coinbase)
|
if (base_work->gbt_coinbase)
|
||||||
work->gbt_coinbase = strdup(base_work->gbt_coinbase);
|
work->gbt_coinbase = strdup(base_work->gbt_coinbase);
|
||||||
}
|
}
|
||||||
@ -3172,8 +3172,8 @@ static void *submit_work_thread(void *userdata)
|
|||||||
applog(LOG_INFO, "Submitting share %08lx to pool %d", hash32[6], pool->pool_no);
|
applog(LOG_INFO, "Submitting share %08lx to pool %d", hash32[6], pool->pool_no);
|
||||||
|
|
||||||
/* Try resubmitting for up to 2 minutes if we fail to submit
|
/* Try resubmitting for up to 2 minutes if we fail to submit
|
||||||
* once and the stratum pool supports sessionid for mining
|
* once and the stratum pool nonce1 still matches suggesting
|
||||||
* resume. */
|
* we may be able to resume. */
|
||||||
while (time(NULL) < sshare->sshare_time + 120) {
|
while (time(NULL) < sshare->sshare_time + 120) {
|
||||||
bool sessionid_match;
|
bool sessionid_match;
|
||||||
|
|
||||||
@ -3194,7 +3194,7 @@ static void *submit_work_thread(void *userdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&pool->pool_lock);
|
mutex_lock(&pool->pool_lock);
|
||||||
sessionid_match = pool->sessionid && work->sessionid && !strcmp(pool->sessionid, work->sessionid);
|
sessionid_match = !strcmp(work->nonce1, pool->nonce1);
|
||||||
mutex_unlock(&pool->pool_lock);
|
mutex_unlock(&pool->pool_lock);
|
||||||
|
|
||||||
if (!sessionid_match) {
|
if (!sessionid_match) {
|
||||||
@ -5202,9 +5202,8 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
|
|||||||
|
|
||||||
/* Copy parameters required for share submission */
|
/* Copy parameters required for share submission */
|
||||||
work->job_id = strdup(pool->swork.job_id);
|
work->job_id = strdup(pool->swork.job_id);
|
||||||
|
work->nonce1 = strdup(pool->nonce1);
|
||||||
work->ntime = strdup(pool->swork.ntime);
|
work->ntime = strdup(pool->swork.ntime);
|
||||||
if (pool->sessionid)
|
|
||||||
work->sessionid = strdup(pool->sessionid);
|
|
||||||
mutex_unlock(&pool->pool_lock);
|
mutex_unlock(&pool->pool_lock);
|
||||||
|
|
||||||
applog(LOG_DEBUG, "Generated stratum merkle %s", merkle_hash);
|
applog(LOG_DEBUG, "Generated stratum merkle %s", merkle_hash);
|
||||||
|
2
miner.h
2
miner.h
@ -1007,7 +1007,7 @@ struct work {
|
|||||||
char *nonce2;
|
char *nonce2;
|
||||||
char *ntime;
|
char *ntime;
|
||||||
double sdiff;
|
double sdiff;
|
||||||
char *sessionid;
|
char *nonce1;
|
||||||
|
|
||||||
bool gbt;
|
bool gbt;
|
||||||
char *gbt_coinbase;
|
char *gbt_coinbase;
|
||||||
|
100
util.c
100
util.c
@ -1434,6 +1434,9 @@ bool initiate_stratum(struct pool *pool)
|
|||||||
if (!setup_stratum_curl(pool))
|
if (!setup_stratum_curl(pool))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
if (pool->sessionid)
|
||||||
|
sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": [\"%s\"]}", swork_id++, pool->sessionid);
|
||||||
|
else
|
||||||
sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++);
|
sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": []}", swork_id++);
|
||||||
|
|
||||||
if (!__stratum_send(pool, s, strlen(s))) {
|
if (!__stratum_send(pool, s, strlen(s))) {
|
||||||
@ -1487,7 +1490,7 @@ bool initiate_stratum(struct pool *pool)
|
|||||||
applog(LOG_INFO, "Failed to get n2size in initiate_stratum");
|
applog(LOG_INFO, "Failed to get n2size in initiate_stratum");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
pool->sessionid = json_array_string(res_val, 3);
|
//pool->sessionid = json_array_string(res_val, 3);
|
||||||
if (pool->sessionid)
|
if (pool->sessionid)
|
||||||
applog(LOG_DEBUG, "Pool %d stratum session id: %s", pool->pool_no, pool->sessionid);
|
applog(LOG_DEBUG, "Pool %d stratum session id: %s", pool->pool_no, pool->sessionid);
|
||||||
else
|
else
|
||||||
@ -1513,105 +1516,10 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset_sessionid(struct pool *pool)
|
|
||||||
{
|
|
||||||
mutex_lock(&pool->pool_lock);
|
|
||||||
free(pool->sessionid);
|
|
||||||
pool->sessionid = NULL;
|
|
||||||
mutex_unlock(&pool->pool_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Placeholder for real resume function in the future */
|
|
||||||
static bool resume_stratum(struct pool *pool)
|
|
||||||
{
|
|
||||||
json_t *val = NULL, *err_val, *res_val;
|
|
||||||
char s[RBUFSIZE], *sret = NULL;
|
|
||||||
json_error_t err;
|
|
||||||
bool ret = false;
|
|
||||||
|
|
||||||
if (!setup_stratum_curl(pool))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
mutex_lock(&pool->pool_lock);
|
|
||||||
sprintf(s, "{\"id\": %d, \"method\": \"mining.resume\", \"params\": [\"%s\"]}", swork_id++, pool->sessionid);
|
|
||||||
mutex_unlock(&pool->pool_lock);
|
|
||||||
|
|
||||||
if (!__stratum_send(pool, s, strlen(s))) {
|
|
||||||
applog(LOG_DEBUG, "Failed to send s in resume_stratum");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!socket_full(pool, true)) {
|
|
||||||
applog(LOG_DEBUG, "Timed out waiting for response in resume_stratum");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
sret = recv_line(pool);
|
|
||||||
if (!sret)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
val = JSON_LOADS(sret, &err);
|
|
||||||
free(sret);
|
|
||||||
if (!val) {
|
|
||||||
applog(LOG_INFO, "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 there is an error, assume resume support is not there or broken */
|
|
||||||
if (!res_val || json_is_null(res_val) ||
|
|
||||||
(err_val && !json_is_null(err_val))) {
|
|
||||||
char *ss;
|
|
||||||
|
|
||||||
if (err_val)
|
|
||||||
ss = json_dumps(err_val, JSON_INDENT(3));
|
|
||||||
else
|
|
||||||
ss = strdup("(unknown reason)");
|
|
||||||
|
|
||||||
applog(LOG_INFO, "JSON-RPC decode failed: %s", ss);
|
|
||||||
|
|
||||||
free(ss);
|
|
||||||
|
|
||||||
reset_sessionid(pool);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (json_is_true(res_val)) {
|
|
||||||
applog(LOG_NOTICE, "Resumed stratum connection to pool %d", pool->pool_no);
|
|
||||||
pool->stratum_active = true;
|
|
||||||
ret = true;
|
|
||||||
} else {
|
|
||||||
applog(LOG_NOTICE, "Unable to resume old stratum connection to pool %d", pool->pool_no);
|
|
||||||
reset_sessionid(pool);
|
|
||||||
clear_stratum_shares(pool);
|
|
||||||
json_decref(val);
|
|
||||||
|
|
||||||
return initiate_stratum(pool);
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
if (val)
|
|
||||||
json_decref(val);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool restart_stratum(struct pool *pool)
|
bool restart_stratum(struct pool *pool)
|
||||||
{
|
{
|
||||||
bool resume;
|
|
||||||
|
|
||||||
mutex_lock(&pool->pool_lock);
|
|
||||||
resume = pool->sessionid != NULL;
|
|
||||||
mutex_unlock(&pool->pool_lock);
|
|
||||||
|
|
||||||
if (resume) {
|
|
||||||
if (!resume_stratum(pool))
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if (!initiate_stratum(pool))
|
if (!initiate_stratum(pool))
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
if (!auth_stratum(pool))
|
if (!auth_stratum(pool))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user