Browse Source

Propagate enough information to allow nodes to be attached to remote servers.

master
Con Kolivas 8 years ago
parent
commit
2b821bf70e
  1. 68
      src/stratifier.c

68
src/stratifier.c

@ -2007,10 +2007,26 @@ share_diff(char *coinbase, const uchar *enonce1bin, const workbase_t *wb, const
return diff_from_target(hash); return diff_from_target(hash);
} }
static void add_remote_blockdata(ckpool_t *ckp, json_t *val, const int cblen, const char *coinbase,
const uchar *data)
{
char *buf;
json_set_string(val, "name", ckp->name);
json_set_int(val, "cblen", cblen);
buf = bin2hex(coinbase, cblen);
json_set_string(val, "coinbasehex", buf);
free(buf);
buf = bin2hex(data, 80);
json_set_string(val, "swaphex", buf);
free(buf);
}
/* Entered with workbase readcount, grabs instance lock */ /* Entered with workbase readcount, grabs instance lock */
static void send_node_block(sdata_t *sdata, const char *enonce1, const char *nonce, static void send_node_block(ckpool_t *ckp, sdata_t *sdata, const char *enonce1, const char *nonce,
const char *nonce2, const uint32_t ntime32, const int64_t jobid, const char *nonce2, const uint32_t ntime32, const int64_t jobid,
const double diff, const int64_t client_id) const double diff, const int64_t client_id,
const char *coinbase, const int cblen, const uchar *data)
{ {
stratum_instance_t *client; stratum_instance_t *client;
int64_t skip, messages = 0; int64_t skip, messages = 0;
@ -2031,6 +2047,7 @@ static void send_node_block(sdata_t *sdata, const char *enonce1, const char *non
json_set_uint32(val, "ntime32", ntime32); json_set_uint32(val, "ntime32", ntime32);
json_set_int64(val, "jobid", jobid); json_set_int64(val, "jobid", jobid);
json_set_double(val, "diff", diff); json_set_double(val, "diff", diff);
add_remote_blockdata(ckp, val, cblen, coinbase, data);
DL_FOREACH(sdata->node_instances, client) { DL_FOREACH(sdata->node_instances, client) {
ckmsg_t *client_msg; ckmsg_t *client_msg;
json_t *json_msg; json_t *json_msg;
@ -2172,7 +2189,8 @@ static void block_reject(json_t *val);
static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val) static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val)
{ {
char *coinbase = NULL, *enonce1 = NULL, *nonce = NULL, *nonce2 = NULL, *gbt_block; char *coinbase = NULL, *enonce1 = NULL, *nonce = NULL, *nonce2 = NULL, *gbt_block,
*coinbasehex, *swaphex;
uchar *enonce1bin = NULL, hash[32], swap[80], flip32[32]; uchar *enonce1bin = NULL, hash[32], swap[80], flip32[32];
char blockhash[68], cdfield[64]; char blockhash[68], cdfield[64];
json_t *bval, *bval_copy; json_t *bval, *bval_copy;
@ -2219,14 +2237,31 @@ static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val)
LOGWARNING("Failed to find workbase with jobid %"PRId64" in node method block", id); LOGWARNING("Failed to find workbase with jobid %"PRId64" in node method block", id);
goto out; goto out;
} }
/* Now we have enough to assemble a block */
coinbase = ckalloc(wb->coinb1len + wb->enonce1constlen + wb->enonce1varlen + wb->enonce2varlen + wb->coinb2len);
enonce1len = wb->enonce1constlen + wb->enonce1varlen; enonce1len = wb->enonce1constlen + wb->enonce1varlen;
enonce1bin = ckalloc(enonce1len); enonce1bin = alloca(enonce1len);
hex2bin(enonce1bin, enonce1, enonce1len); hex2bin(enonce1bin, enonce1, enonce1len);
/* Get parameters if upstream pool supports them with new format */
json_get_string(&coinbasehex, val, "coinbasehex");
json_get_int(&cblen, val, "cblen");
json_get_string(&swaphex, val, "swaphex");
if (coinbasehex && cblen && swaphex) {
uchar hash1[32];
coinbase = alloca(cblen);
hex2bin(coinbase, coinbasehex, cblen);
hex2bin(swap, swaphex, 80);
sha256(swap, 80, hash1);
sha256(hash1, 32, hash);
} else {
/* Rebuild the old way if we can if the upstream pool is using
* the old format only */
coinbase = alloca(wb->coinb1len + wb->enonce1constlen + wb->enonce1varlen + wb->enonce2varlen + wb->coinb2len);
/* Fill in the hashes */ /* Fill in the hashes */
share_diff(coinbase, enonce1bin, wb, nonce2, ntime32, nonce, hash, swap, &cblen); share_diff(coinbase, enonce1bin, wb, nonce2, ntime32, nonce, hash, swap, &cblen);
}
/* Now we have enough to assemble a block */
gbt_block = process_block(wb, coinbase, cblen, swap, hash, flip32, blockhash); gbt_block = process_block(wb, coinbase, cblen, swap, hash, flip32, blockhash);
ret = local_block_submit(ckp, gbt_block, flip32, wb->height); ret = local_block_submit(ckp, gbt_block, flip32, wb->height);
@ -2253,8 +2288,6 @@ static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val)
else else
block_reject(bval_copy); block_reject(bval_copy);
out: out:
free(enonce1bin);
free(coinbase);
free(nonce2); free(nonce2);
free(nonce); free(nonce);
free(enonce1); free(enonce1);
@ -5810,21 +5843,6 @@ static void add_submit(ckpool_t *ckp, stratum_instance_t *client, const double d
stratum_send_diff(sdata, client); stratum_send_diff(sdata, client);
} }
static void add_remote_blockdata(ckpool_t *ckp, json_t *val, const int cblen, const char *coinbase,
const uchar *data)
{
char *buf;
json_set_string(val, "name", ckp->name);
json_set_int(val, "cblen", cblen);
buf = bin2hex(coinbase, cblen);
json_set_string(val, "coinbasehex", buf);
free(buf);
buf = bin2hex(data, 80);
json_set_string(val, "swaphex", buf);
free(buf);
}
static void static void
downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cblen, downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cblen,
const char *coinbase, const uchar *data) const char *coinbase, const uchar *data)
@ -5867,8 +5885,8 @@ test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uc
sprintf(cdfield, "%lu,%lu", ts_now.tv_sec, ts_now.tv_nsec); sprintf(cdfield, "%lu,%lu", ts_now.tv_sec, ts_now.tv_nsec);
gbt_block = process_block(wb, coinbase, cblen, data, hash, flip32, blockhash); gbt_block = process_block(wb, coinbase, cblen, data, hash, flip32, blockhash);
send_node_block(sdata, client->enonce1, nonce, nonce2, ntime32, wb->id, send_node_block(ckp, sdata, client->enonce1, nonce, nonce2, ntime32, wb->id,
diff, client->id); diff, client->id, coinbase, cblen, data);
val = json_object(); val = json_object();
// JSON_CPACK(val, "{si,ss,ss,sI,ss,ss,sI,ss,ss,ss,sI,sf,ss,ss,ss,ss}", // JSON_CPACK(val, "{si,ss,ss,sI,ss,ss,sI,ss,ss,ss,sI,sf,ss,ss,ss,ss}",

Loading…
Cancel
Save