Browse Source

Add a nodeserver option for dedicated serverurls that will accept incoming requests to act as a mining node

master
Con Kolivas 9 years ago
parent
commit
6398a4cac6
  1. 9
      README
  2. 5
      ckpool.conf
  3. 33
      src/ckpool.c
  4. 2
      src/ckpool.h
  5. 14
      src/stratifier.c

9
README

@ -176,7 +176,9 @@ maximum debug is level 7.
-N will start ckpool in passthrough node mode where it behaves like a -N will start ckpool in passthrough node mode where it behaves like a
passthrough but requires a locally running bitcoind and can submit blocks passthrough but requires a locally running bitcoind and can submit blocks
itself in addition to passing the shares back to the upstream pool. It also itself in addition to passing the shares back to the upstream pool. It also
monitors hashrate and requires more resources than a simple passthrough. monitors hashrate and requires more resources than a simple passthrough. Be
aware that upstream pools must specify dedicated IPs/ports that accept
incoming node requests with the nodeserver directive described below.
-n <NAME> will change the ckpool process name to that specified, allowing -n <NAME> will change the ckpool process name to that specified, allowing
multiple different named instances to be running. By default the variant multiple different named instances to be running. By default the variant
@ -266,6 +268,11 @@ new network blocks and is 100 by default. It is intended to be a backup only
for when the notifier is not set up and only polls if the "notify" field is for when the notifier is not set up and only polls if the "notify" field is
not set on a btcd. not set on a btcd.
"nodeserver" : This takes the same format as the serverurl array and specifies
additional IPs/ports to bind to that will accept incoming requests for mining
node communications. It is recommended to selectively isolate this address
to minimise unnecessary communications with unauthorised nodes.
"nonce1length" : This is optional allowing the extranonce1 length to be chosen "nonce1length" : This is optional allowing the extranonce1 length to be chosen
from 2 to 8. Default 4 from 2 to 8. Default 4

5
ckpool.conf

@ -23,7 +23,10 @@
"ckpool.org:3333", "ckpool.org:3333",
"node.ckpool.org:3333", "node.ckpool.org:3333",
"node.ckpool.org:80" "node.ckpool.org:80"
], ],
"nodeserver" : [
"ckpool.org:3335"
],
"mindiff" : 1, "mindiff" : 1,
"startdiff" : 42, "startdiff" : 42,
"maxdiff" : 0, "maxdiff" : 0,

33
src/ckpool.c

@ -1283,7 +1283,7 @@ static bool parse_serverurls(ckpool_t *ckp, const json_t *arr_val)
if (!arr_val) if (!arr_val)
goto out; goto out;
if (!json_is_array(arr_val)) { if (!json_is_array(arr_val)) {
LOGWARNING("Unable to parse serverurl entries as an array"); LOGINFO("Unable to parse serverurl entries as an array");
goto out; goto out;
} }
arr_size = json_array_size(arr_val); arr_size = json_array_size(arr_val);
@ -1293,6 +1293,7 @@ static bool parse_serverurls(ckpool_t *ckp, const json_t *arr_val)
} }
ckp->serverurls = arr_size; ckp->serverurls = arr_size;
ckp->serverurl = ckalloc(sizeof(char *) * arr_size); ckp->serverurl = ckalloc(sizeof(char *) * arr_size);
ckp->nodeserver = ckzalloc(sizeof(bool) * arr_size);
for (i = 0; i < arr_size; i++) { for (i = 0; i < arr_size; i++) {
json_t *val = json_array_get(arr_val, i); json_t *val = json_array_get(arr_val, i);
@ -1304,6 +1305,34 @@ out:
return ret; return ret;
} }
static void parse_nodeservers(ckpool_t *ckp, const json_t *arr_val)
{
int arr_size, i, j, total_urls;
if (!arr_val)
return;
if (!json_is_array(arr_val)) {
LOGWARNING("Unable to parse nodeservers entries as an array");
return;
}
arr_size = json_array_size(arr_val);
if (!arr_size) {
LOGWARNING("Nodeserver array empty");
return;
}
total_urls = ckp->serverurls + arr_size;
ckp->serverurl = realloc(ckp->serverurl, sizeof(char *) * total_urls);
ckp->nodeserver = realloc(ckp->nodeserver, sizeof(bool) * total_urls);
for (i = 0, j = ckp->serverurls; j < total_urls; i++, j++) {
json_t *val = json_array_get(arr_val, i);
if (!_json_get_string(&ckp->serverurl[j], val, "nodeserver"))
LOGWARNING("Invalid nodeserver entry number %d", i);
ckp->nodeserver[j] = true;
}
ckp->serverurls = total_urls;
}
static bool parse_redirecturls(ckpool_t *ckp, const json_t *arr_val) static bool parse_redirecturls(ckpool_t *ckp, const json_t *arr_val)
{ {
bool ret = false; bool ret = false;
@ -1379,6 +1408,8 @@ static void parse_config(ckpool_t *ckp)
ckp->serverurls = 1; ckp->serverurls = 1;
} }
} }
arr_val = json_object_get(json_conf, "nodeserver");
parse_nodeservers(ckp, arr_val);
json_get_int64(&ckp->mindiff, json_conf, "mindiff"); json_get_int64(&ckp->mindiff, json_conf, "mindiff");
json_get_int64(&ckp->startdiff, json_conf, "startdiff"); json_get_int64(&ckp->startdiff, json_conf, "startdiff");
json_get_int64(&ckp->maxdiff, json_conf, "maxdiff"); json_get_int64(&ckp->maxdiff, json_conf, "maxdiff");

2
src/ckpool.h

@ -226,6 +226,8 @@ struct ckpool_instance {
server_instance_t **servers; server_instance_t **servers;
char **serverurl; // Array of URLs to bind our server/proxy to char **serverurl; // Array of URLs to bind our server/proxy to
int serverurls; // Number of server bindings int serverurls; // Number of server bindings
bool *nodeserver; // If this server URL serves node information
int update_interval; // Seconds between stratum updates int update_interval; // Seconds between stratum updates
/* Proxy options */ /* Proxy options */

14
src/stratifier.c

@ -5174,7 +5174,7 @@ static void init_client(sdata_t *sdata, const stratum_instance_t *client, const
stratum_send_update(sdata, client_id, true); stratum_send_update(sdata, client_id, true);
} }
static void add_mining_node(sdata_t *sdata, stratum_instance_t *client) static void add_mining_node(ckpool_t *ckp, sdata_t *sdata, stratum_instance_t *client)
{ {
client->node = true; client->node = true;
@ -5182,7 +5182,8 @@ static void add_mining_node(sdata_t *sdata, stratum_instance_t *client)
DL_APPEND(sdata->node_instances, client); DL_APPEND(sdata->node_instances, client);
ck_wunlock(&sdata->instance_lock); ck_wunlock(&sdata->instance_lock);
LOGWARNING("Added client %"PRId64" %s as mining node!", client->id, client->address); LOGWARNING("Added client %"PRId64" %s as mining node on server %d:%s", client->id,
client->address, client->server, ckp->serverurl[client->server]);
} }
/* Enter with client holding ref count */ /* Enter with client holding ref count */
@ -5238,9 +5239,16 @@ static void parse_method(ckpool_t *ckp, sdata_t *sdata, stratum_instance_t *clie
/* Add this client as a passthrough in the connector and /* Add this client as a passthrough in the connector and
* add it to the list of mining nodes in the stratifier */ * add it to the list of mining nodes in the stratifier */
add_mining_node(sdata, client); if (!ckp->nodeserver[client->server]) {
LOGNOTICE("Dropping client %"PRId64" %s trying to authorise as node on non node server %d",
client_id, client->address, client->server);
connector_drop_client(ckp, client_id);
drop_client(ckp, sdata, client_id);
} else {
add_mining_node(ckp, sdata, client);
snprintf(buf, 255, "passthrough=%"PRId64, client_id); snprintf(buf, 255, "passthrough=%"PRId64, client_id);
send_proc(ckp->connector, buf); send_proc(ckp->connector, buf);
}
return; return;
} }

Loading…
Cancel
Save