Skip to content
This repository has been archived by the owner on Jan 9, 2021. It is now read-only.

Commit

Permalink
Merge pull request #1 from hyperwang/master
Browse files Browse the repository at this point in the history
Send extranonce and parse #xnsub in pool url tail.
  • Loading branch information
kenshirothefist committed Nov 7, 2014
2 parents feb5ada + 405a775 commit fd23ce7
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 0 deletions.
2 changes: 2 additions & 0 deletions cgminer.c
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,7 @@ static char *set_rr(enum pool_strategy *strategy)
* stratum+tcp or by detecting a stratum server response */
bool detect_stratum(struct pool *pool, char *url)
{
check_extranonce_option(pool, url);
if (!extract_sockaddr(url, &pool->sockaddr_url, &pool->stratum_port))
return false;

Expand Down Expand Up @@ -6465,6 +6466,7 @@ static void *longpoll_thread(void *userdata);
static bool stratum_works(struct pool *pool)
{
applog(LOG_INFO, "Testing pool %d stratum %s", pool->pool_no, pool->stratum_url);
check_extranonce_option(pool, pool->stratum_url);
if (!extract_sockaddr(pool->stratum_url, &pool->sockaddr_url, &pool->stratum_port))
return false;

Expand Down
1 change: 1 addition & 0 deletions miner.h
Original file line number Diff line number Diff line change
Expand Up @@ -1264,6 +1264,7 @@ struct pool {

/* Stratum variables */
char *stratum_url;
bool extranonce_subscribe;
char *stratum_port;
SOCKETTYPE sock;
char *sockbuf;
Expand Down
64 changes: 64 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1620,6 +1620,24 @@ double tdiff(struct timeval *end, struct timeval *start)
return end->tv_sec - start->tv_sec + (end->tv_usec - start->tv_usec) / 1000000.0;
}

void check_extranonce_option(struct pool *pool, char * url)
{
char extra_op[16],*extra_op_loc;
extra_op_loc = strstr(url,"#");
if(extra_op_loc && !pool->extranonce_subscribe)
{
strcpy(extra_op, extra_op_loc);
*extra_op_loc = '\0';
if(!strcmp(extra_op,"#xnsub"))
{
pool->extranonce_subscribe = true;
printf("Extra nonce subscribing enabled.");
return;
}
}
return;
}

bool extract_sockaddr(char *url, char **sockaddr_url, char **sockaddr_port)
{
char *url_begin, *url_end, *ipv6_begin, *ipv6_end, *port_start = NULL;
Expand Down Expand Up @@ -2120,6 +2138,40 @@ static bool parse_diff(struct pool *pool, json_t *val)
return true;
}

static bool parse_extranonce(struct pool *pool, json_t *val)
{
int n2size;
char* nonce1;

nonce1 = json_array_string(val, 0);
if (!valid_hex(nonce1)) {
applog(LOG_INFO, "Failed to get valid nonce1 in parse_extranonce");
goto out;
}
n2size = json_integer_value(json_array_get(val, 1));
if (n2size < 2 || n2size > 16) {
applog(LOG_INFO, "Failed to get valid n2size in parse_extranonce");
free(nonce1);
goto out;
}

cg_wlock(&pool->data_lock);
pool->nonce1 = nonce1;
pool->n1_len = strlen(nonce1) / 2;
free(pool->nonce1bin);
pool->nonce1bin = calloc(pool->n1_len, 1);
if (unlikely(!pool->nonce1bin))
quithere(1, "Failed to calloc pool->nonce1bin");
hex2bin(pool->nonce1bin, pool->nonce1, pool->n1_len);
pool->n2size = n2size;
applog(LOG_NOTICE, "Pool %d confirmed mining.extranonce.subscribe with extranonce1 %s extran2size %d",
pool->pool_no, pool->nonce1, pool->n2size);
cg_wunlock(&pool->data_lock);
return true;
out:
return false;
}

static void __suspend_stratum(struct pool *pool)
{
clear_sockbuf(pool);
Expand Down Expand Up @@ -2284,6 +2336,12 @@ bool parse_method(struct pool *pool, char *s)
ret = parse_diff(pool, params);
goto out_decref;
}

if(!strncasecmp(buf, "mining.set_extranonce", 21)) {
ret = parse_extranonce(pool, params);
goto out_decref;
}


if (!strncasecmp(buf, "client.reconnect", 16)) {
ret = parse_reconnect(pool, params);
Expand Down Expand Up @@ -2886,6 +2944,7 @@ bool initiate_stratum(struct pool *pool)
applog(LOG_DEBUG, "Pool %d stratum session id: %s", pool->pool_no, pool->sessionid);

ret = true;

out:
if (ret) {
if (!pool->stratum_url)
Expand All @@ -2896,6 +2955,11 @@ bool initiate_stratum(struct pool *pool)
applog(LOG_DEBUG, "Pool %d confirmed mining.subscribe with extranonce1 %s extran2size %d",
pool->pool_no, pool->nonce1, pool->n2size);
}
if(pool->extranonce_subscribe)
{
sprintf(s,"{\"id\": %d, \"method\": \"mining.extranonce.subscribe\", \"params\": []}", swork_id++);
stratum_send(pool, s, strlen(s));
}
} else {
if (recvd && !noresume) {
/* Reset the sessionid used for stratum resuming in case the pool
Expand Down
1 change: 1 addition & 0 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ void _recalloc(void **ptr, size_t old, size_t new, const char *file, const char
#define recalloc(ptr, old, new) _recalloc((void *)&(ptr), old, new, __FILE__, __func__, __LINE__)
char *recv_line(struct pool *pool);
bool parse_method(struct pool *pool, char *s);
void check_extranonce_option(struct pool *pool, char * url);
bool extract_sockaddr(char *url, char **sockaddr_url, char **sockaddr_port);
bool auth_stratum(struct pool *pool);
bool initiate_stratum(struct pool *pool);
Expand Down

0 comments on commit fd23ce7

Please sign in to comment.