diff --git a/src/stratifier.c b/src/stratifier.c index 459bdfac..bece6f3b 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -2529,12 +2529,23 @@ static json_t *user_stats(const user_instance_t *user) return val; } +static void upstream_block(ckpool_t *ckp, const int height, const char *workername, + const double diff) +{ + char buf[512]; + + snprintf(buf, 511, "upstream={\"method\":\"block\",\"workername\":\"%s\",\"diff\":%lf,\"height\":%d,\"name\":\"%s\"}\n", + workername, diff, height, ckp->name); + send_proc(ckp->connector, buf); +} + static void block_solve(ckpool_t *ckp, const char *blockhash) { ckmsg_t *block, *tmp, *found = NULL; char *msg, *workername = NULL; sdata_t *sdata = ckp->data; char cdfield[64]; + double diff = 0; int height = 0; ts_t ts_now; json_t *val; @@ -2576,6 +2587,7 @@ static void block_solve(ckpool_t *ckp, const char *blockhash) json_set_string(val, "createdate", cdfield); json_set_string(val, "createcode", __func__); json_get_int(&height, val, "height"); + json_get_double(&diff, val, "diff"); ckdbq_add(ckp, ID_BLOCK, val); free(found); @@ -2610,6 +2622,8 @@ static void block_solve(ckpool_t *ckp, const char *blockhash) } stratum_broadcast_message(sdata, msg); free(msg); + if (ckp->remote) + upstream_block(ckp, height, workername, diff); free(workername); @@ -4672,6 +4686,7 @@ test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uc "createcode", __func__, "createinet", ckp->serverurl[client->server]); val_copy = json_deep_copy(val); + json_set_double(val_copy, "diff", diff); block_ckmsg = ckalloc(sizeof(ckmsg_t)); block_ckmsg->data = val_copy; @@ -5581,6 +5596,36 @@ static void parse_remote_workers(sdata_t *sdata, json_t *val, const char *buf) LOGDEBUG("Adding %d remote workers to user %s", workers, username); } +static void parse_remote_block(sdata_t *sdata, json_t *val, const char *buf) +{ + json_t *workername_val = json_object_get(val, "workername"), + *name_val = json_object_get(val, "name"); + const char *workername, *name; + double diff = 0; + int height = 0; + char *msg; + + workername = json_string_value(workername_val); + if (unlikely(!workername_val || !workername)) { + LOGWARNING("Failed to get workername from remote message %s", buf); + workername = ""; + } + name = json_string_value(name_val); + if (unlikely(!name_val || !name)) { + LOGWARNING("Failed to get name from remote message %s", buf); + name = ""; + } + if (unlikely(!json_get_int(&height, val, "height"))) + LOGWARNING("Failed to get height from remote message %s", buf); + if (unlikely(!json_get_double(&diff, val, "diff"))) + LOGWARNING("Failed to get diff from remote message %s", buf); + ASPRINTF(&msg, "Block %d solved by %s @ %s!", height, workername, name); + LOGWARNING("%s", msg); + stratum_broadcast_message(sdata, msg); + free(msg); + reset_bestshares(sdata); +} + static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const char *buf) { json_t *method_val = json_object_get(val, "method"); @@ -5596,6 +5641,8 @@ static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const parse_remote_shares(ckp, sdata, val, buf); else if (!safecmp(method, "workers")) parse_remote_workers(sdata, val, buf); + else if (!safecmp(method, "block")) + parse_remote_block(sdata, val, buf); else LOGWARNING("unrecognised trusted message %s", buf); }