diff --git a/src/libckpool.h b/src/libckpool.h index 0f1ee68d..919140d2 100644 --- a/src/libckpool.h +++ b/src/libckpool.h @@ -374,6 +374,7 @@ static inline void _json_set_string(json_t *val, const char *key, const char *st } #define json_set_string(val, key, str) _json_set_string(val, key, str, __FILE__, __func__, __LINE__) +/* Int is long long so will work for u32 and int64 */ static inline void _json_set_int(json_t *val, const char *key, int64_t integer, const char *file, const char *func, const int line) { @@ -381,6 +382,8 @@ static inline void _json_set_int(json_t *val, const char *key, int64_t integer, LOGERR("Failed to set json int from %s %s:%d", file, func, line); } #define json_set_int(val, key, integer) _json_set_int(val, key, integer, __FILE__, __func__, __LINE__) +#define json_set_uint32(val, key, u32) _json_set_int(val, key, u32, __FILE__, __func__, __LINE__) +#define json_set_int64(val, key, i64) _json_set_int(val, key, i64, __FILE__, __func__, __LINE__) static inline void _json_set_double(json_t *val, const char *key, double real, const char *file, const char *func, const int line) @@ -398,6 +401,7 @@ static inline void _json_set_bool(json_t *val, const char *key, bool boolean, } #define json_set_bool(val, key, boolean) _json_set_bool(val, key, boolean, __FILE__, __func__, __LINE__) + static inline void _json_set_object(json_t *val, const char *key, json_t *object, const char *file, const char *func, const int line) { diff --git a/src/stratifier.c b/src/stratifier.c index 778eb1db..82c53b61 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1257,6 +1257,51 @@ share_diff(char *coinbase, const uchar *enonce1bin, const workbase_t *wb, const return diff_from_target(hash); } +static void send_node_block(sdata_t *sdata, const char *enonce1, const char *nonce, + const char *nonce2, const uint32_t ntime32, const int64_t jobid, + const double diff) +{ + stratum_instance_t *client; + ckmsg_t *bulk_send = NULL; + + ck_rlock(&sdata->instance_lock); + if (sdata->node_instances) { + json_t *val = json_object(); + + json_set_string(val, "node.method", stratum_msgs[SM_BLOCK]); + json_set_string(val, "enonce1", enonce1); + json_set_string(val, "nonce", nonce); + json_set_string(val, "nonce2", nonce2); + json_set_uint32(val, "ntime32", ntime32); + json_set_int64(val, "jobid", jobid); + json_set_double(val, "diff", diff); + DL_FOREACH(sdata->node_instances, client) { + ckmsg_t *client_msg; + smsg_t *msg; + json_t *json_msg = json_deep_copy(val); + client_msg = ckalloc(sizeof(ckmsg_t)); + msg = ckzalloc(sizeof(smsg_t)); + msg->json_msg = json_msg; + msg->client_id = client->id; + client_msg->data = msg; + DL_APPEND(bulk_send, client_msg); + } + json_decref(val); + } + ck_runlock(&sdata->instance_lock); + + if (bulk_send) { + ckmsgq_t *ssends = sdata->ssends; + + LOGNOTICE("Sending block to mining nodes"); + + mutex_lock(ssends->lock); + DL_CONCAT(ssends->msgs, bulk_send); + pthread_cond_signal(ssends->cond); + mutex_unlock(ssends->lock); + } +} + static void process_block(ckpool_t *ckp, const workbase_t *wb, const char *coinbase, const int cblen, const uchar *data, const uchar *hash, uchar *swap32, char *blockhash) @@ -1294,6 +1339,8 @@ process_block(ckpool_t *ckp, const workbase_t *wb, const char *coinbase, const i realloc_strcat(&gbt_block, wb->txn_data); send_generator(ckp, gbt_block, GEN_PRIORITY); free(gbt_block); + + } static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val) @@ -1302,10 +1349,10 @@ static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val) uchar *enonce1bin = NULL, hash[32], swap[80], swap32[32]; char blockhash[68], cdfield[64]; int enonce1len, cblen; + workbase_t *wb = NULL; ckmsg_t *block_ckmsg; json_t *bval = NULL; uint32_t ntime32; - workbase_t *wb; double diff; ts_t ts_now; int64_t id; @@ -1335,6 +1382,8 @@ static void submit_node_block(ckpool_t *ckp, sdata_t *sdata, json_t *val) goto out; } + LOGWARNING("Possible upstream block solve diff %f !", diff); + ts_realtime(&ts_now); sprintf(cdfield, "%lu,%lu", ts_now.tv_sec, ts_now.tv_nsec); @@ -1373,7 +1422,7 @@ out_unlock: LOGWARNING("Failed to find workbase with jobid %"PRId64" in node method block", id); else { block_ckmsg = ckalloc(sizeof(ckmsg_t)); - block_ckmsg->data = bval; + block_ckmsg->data = json_deep_copy(bval); mutex_lock(&sdata->block_lock); DL_APPEND(sdata->block_solves, block_ckmsg); @@ -4806,7 +4855,7 @@ static void add_submit(ckpool_t *ckp, stratum_instance_t *client, const double d static void test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uchar *data, const uchar *hash, const double diff, const char *coinbase, int cblen, - const char *nonce2, const char *nonce) + const char *nonce2, const char *nonce, const uint32_t ntime32) { char blockhash[68], cdfield[64]; sdata_t *sdata = client->sdata; @@ -4830,6 +4879,8 @@ test_blocksolve(const stratum_instance_t *client, const workbase_t *wb, const uc process_block(ckp, wb, coinbase, cblen, data, hash, swap32, blockhash); + send_node_block(sdata, client->enonce1, nonce, nonce2, ntime32, wb->id, diff); + JSON_CPACK(val, "{si,ss,ss,sI,ss,ss,sI,ss,ss,ss,sI,ss,ss,ss,ss}", "height", wb->height, "blockhash", blockhash, @@ -4873,7 +4924,7 @@ static double submission_diff(const stratum_instance_t *client, const workbase_t ret = share_diff(coinbase, client->enonce1bin, wb, nonce2, ntime32, nonce, hash, swap, &cblen); /* Test we haven't solved a block regardless of share status */ - test_blocksolve(client, wb, swap, hash, ret, coinbase, cblen, nonce2, nonce); + test_blocksolve(client, wb, swap, hash, ret, coinbase, cblen, nonce2, nonce, ntime32); free(coinbase);