From 41a9788cc9d93cff85ba627ac13b945a1f42762f Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Wed, 3 Feb 2016 21:57:45 +1100 Subject: [PATCH] Add transactions when received by nodes to the txntable --- src/stratifier.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/stratifier.c b/src/stratifier.c index 26dc8b90..c46df4d4 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1289,7 +1289,7 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array) send_node_transactions(sdata, val); json_decref(val); - LOGDEBUG("Stratifier added %d transactions and purged %d", added, purged); + LOGINFO("Stratifier added %d transactions and purged %d", added, purged); } /* This function assumes it will only receive a valid json gbt base template @@ -6190,6 +6190,42 @@ static void parse_trusted_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const LOGWARNING("unrecognised trusted message %s", buf); } +static void add_node_txns(sdata_t *sdata, const json_t *val) +{ + json_t *txn_array, *txn_val, *data_val, *hash_val; + txntable_t *txn; + int added = 0; + size_t i; + + txn_array = json_object_get(val, "transaction"); + + ck_wlock(&sdata->workbase_lock); + json_array_foreach(txn_array, i, txn_val) { + const char *hash, *data; + + data_val = json_object_get(txn_val, "data"); + hash_val = json_object_get(txn_val, "hash"); + data = json_string_value(data_val); + hash = json_string_value(hash_val); + if (unlikely(!data || !hash)) { + LOGERR("Failed to get hash/data in add_node_txns"); + continue; + } + HASH_FIND_STR(sdata->txns, hash, txn); + if (txn) + continue; + txn = ckzalloc(sizeof(txntable_t)); + memcpy(txn->hash, hash, 65); + txn->data = strdup(data); + txn->refcount = 10; + HASH_ADD_STR(sdata->txns, hash, txn); + added++; + } + ck_wunlock(&sdata->workbase_lock); + + LOGINFO("Stratifier added %d node transactions", added); +} + /* Entered with client holding ref count */ static void node_client_msg(ckpool_t *ckp, json_t *val, const char *buf, stratum_instance_t *client) { @@ -6250,6 +6286,9 @@ static void parse_node_msg(ckpool_t *ckp, sdata_t *sdata, json_t *val, const cha } LOGDEBUG("Got node method %d:%s", msg_type, stratum_msgs[msg_type]); switch (msg_type) { + case SM_TRANSACTIONS: + add_node_txns(sdata, val); + break; case SM_WORKINFO: add_node_base(ckp, val); break;