diff --git a/src/stratifier.c b/src/stratifier.c index 23d5446e..28d72635 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1590,8 +1590,8 @@ static void add_remote_base(ckpool_t *ckp, sdata_t *sdata, workbase_t *wb) ck_wunlock(&sdata->workbase_lock); val = generate_workinfo(ckp, wb, __func__); - /* Replace workinfoid with mapped id */ - json_set_int64(val, "workinfoid", wb->mapped_id); + /* Replace jobid with mapped id */ + json_set_int64(val, "jobid", wb->mapped_id); /* If this is the upstream pool, send a copy of this to all OTHER remote * trusted servers as well */ @@ -5593,20 +5593,12 @@ static void add_remote_blockdata(ckpool_t *ckp, json_t *val, const int cblen, co free(buf); } -static void -downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cblen, - const char *coinbase, const uchar *data, int64_t client_id) +static void downstream_blockdata(sdata_t *sdata, const json_t *val, int64_t client_id) { - json_t *block_val = json_deep_copy(val); stratum_instance_t *client; ckmsg_t *bulk_send = NULL; int messages = 0; - /* Strip unnecessary fields and add extra fields needed */ - strip_fields(ckp, block_val); - json_set_string(block_val, "method", stratum_msgs[SM_BLOCK]); - add_remote_blockdata(ckp, block_val, cblen, coinbase, data); - ck_rlock(&sdata->instance_lock); DL_FOREACH(sdata->remote_instances, client) { ckmsg_t *client_msg; @@ -5616,7 +5608,7 @@ downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cbl /* Don't send remote workinfo back to same remote */ if (client->id == client_id) continue; - json_msg = json_deep_copy(block_val); + json_msg = json_deep_copy(val); client_msg = ckalloc(sizeof(ckmsg_t)); msg = ckzalloc(sizeof(smsg_t)); msg->json_msg = json_msg; @@ -5627,14 +5619,26 @@ downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cbl } ck_runlock(&sdata->instance_lock); - json_decref(block_val); - if (bulk_send) { LOGINFO("Sending block to %d remote servers", messages); ssend_bulk_postpone(sdata, bulk_send, messages); } } +static void +downstream_block(ckpool_t *ckp, sdata_t *sdata, const json_t *val, const int cblen, + const char *coinbase, const uchar *data) +{ + json_t *block_val = json_deep_copy(val); + + /* Strip unnecessary fields and add extra fields needed */ + strip_fields(ckp, block_val); + json_set_string(block_val, "method", stratum_msgs[SM_BLOCK]); + add_remote_blockdata(ckp, block_val, cblen, coinbase, data); + downstream_blockdata(sdata, block_val, 0); + json_decref(block_val); +} + /* We should already be holding the workbase_lock. Needs to be entered with * client holding a ref count. */ static void @@ -5695,7 +5699,7 @@ test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uc add_remote_blockdata(ckp, val, cblen, coinbase, data); upstream_json_msgtype(ckp, val, SM_BLOCK); } else { - downstream_block(ckp, sdata, val, cblen, coinbase, data, 0); + downstream_block(ckp, sdata, val, cblen, coinbase, data); ckdbq_add(ckp, ID_BLOCK, val); } } @@ -6791,7 +6795,8 @@ static void parse_remote_workers(sdata_t *sdata, json_t *val, const char *buf) /* Attempt to submit a remote block locally by recreating it from its workinfo * in addition to sending it to ckdb */ -static void parse_remote_block(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf) +static void parse_remote_block(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf, + const int64_t client_id) { json_t *workername_val = json_object_get(val, "workername"), *name_val = json_object_get(val, "name"); @@ -6811,6 +6816,7 @@ static void parse_remote_block(ckpool_t *ckp, sdata_t *sdata, json_t *val, const cnfrm = json_string_value(json_object_get(val, "confirmed")); if (cnfrm && cnfrm[0] == '1') goto out_add; + json_get_int64(&id, val, "workinfoid"); coinbasehex = json_string_value(json_object_get(val, "coinbasehex")); swaphex = json_string_value(json_object_get(val, "swaphex")); @@ -6852,12 +6858,11 @@ static void parse_remote_block(ckpool_t *ckp, sdata_t *sdata, json_t *val, const stratum_broadcast_message(sdata, msg); free(msg); out_add: - if (CKP_STANDALONE(ckp)) - return; - /* Make a duplicate for use by ckdbq_add */ val = json_deep_copy(val); remap_workinfo_id(sdata, val); + if (!ckp->remote) + downstream_blockdata(sdata, val, client_id); ckdbq_add(ckp, ID_BLOCK, val); } @@ -6868,7 +6873,7 @@ void parse_upstream_block(ckpool_t *ckp, json_t *val) sdata_t *sdata = ckp->sdata; buf = json_dumps(val, 0); - parse_remote_block(ckp, sdata, val, buf); + parse_remote_block(ckp, sdata, val, buf, 0); free(buf); } @@ -6951,7 +6956,7 @@ static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, stratu else if (!safecmp(method, stratum_msgs[SM_SHAREERR])) parse_remote_shareerr(ckp, sdata, val, buf); else if (!safecmp(method, stratum_msgs[SM_BLOCK])) - parse_remote_block(ckp, sdata, val, buf); + parse_remote_block(ckp, sdata, val, buf, client->id); else if (!safecmp(method, "workers")) parse_remote_workers(sdata, val, buf); else if (!safecmp(method, "ping"))