|
|
@ -899,7 +899,6 @@ static void send_node_workinfo(sdata_t *sdata, const workbase_t *wb) |
|
|
|
json_set_string(wb_val, "flags", wb->flags); |
|
|
|
json_set_string(wb_val, "flags", wb->flags); |
|
|
|
/* Set to zero to be backwards compat with older node code */ |
|
|
|
/* Set to zero to be backwards compat with older node code */ |
|
|
|
json_set_int(wb_val, "transactions", 0); |
|
|
|
json_set_int(wb_val, "transactions", 0); |
|
|
|
json_set_int(wb_val, "txns", wb->txns); |
|
|
|
|
|
|
|
json_object_set_new_nocheck(wb_val, "txnhashes", txn_array); |
|
|
|
json_object_set_new_nocheck(wb_val, "txnhashes", txn_array); |
|
|
|
json_set_int(wb_val, "merkles", wb->merkles); |
|
|
|
json_set_int(wb_val, "merkles", wb->merkles); |
|
|
|
json_object_set_new_nocheck(wb_val, "merklehash", json_deep_copy(wb->merkle_array)); |
|
|
|
json_object_set_new_nocheck(wb_val, "merklehash", json_deep_copy(wb->merkle_array)); |
|
|
@ -1267,6 +1266,7 @@ static void wb_merkle_bins(sdata_t *sdata, workbase_t *wb, json_t *txn_array) |
|
|
|
binlen = binleft * 32; |
|
|
|
binlen = binleft * 32; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
LOGINFO("Stored %d transactions", wb->txns); |
|
|
|
|
|
|
|
|
|
|
|
txn_array = json_array(); |
|
|
|
txn_array = json_array(); |
|
|
|
|
|
|
|
|
|
|
@ -1389,18 +1389,19 @@ out: |
|
|
|
|
|
|
|
|
|
|
|
static bool rebuild_txns(sdata_t *sdata, workbase_t *wb, json_t *txnhashes) |
|
|
|
static bool rebuild_txns(sdata_t *sdata, workbase_t *wb, json_t *txnhashes) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
int i, arr_size = json_array_size(txnhashes); |
|
|
|
json_t *txn_array, *hash_val; |
|
|
|
json_t *txn_array, *hash_val; |
|
|
|
txntable_t *txn; |
|
|
|
txntable_t *txn; |
|
|
|
bool ret = true; |
|
|
|
bool ret = true; |
|
|
|
size_t i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txn_array = json_array(); |
|
|
|
txn_array = json_array(); |
|
|
|
|
|
|
|
|
|
|
|
ck_rlock(&sdata->workbase_lock); |
|
|
|
ck_rlock(&sdata->workbase_lock); |
|
|
|
json_array_foreach(txnhashes, i, hash_val) { |
|
|
|
for (i = 0; i < arr_size; i++) { |
|
|
|
const char *hash; |
|
|
|
const char *hash; |
|
|
|
json_t *txn_val; |
|
|
|
json_t *txn_val; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hash_val = json_array_get(txnhashes, i); |
|
|
|
hash = json_string_value(hash_val); |
|
|
|
hash = json_string_value(hash_val); |
|
|
|
if (unlikely(!hash)) { |
|
|
|
if (unlikely(!hash)) { |
|
|
|
LOGERR("Failed to get hash in rebuild_txns"); |
|
|
|
LOGERR("Failed to get hash in rebuild_txns"); |
|
|
@ -1435,10 +1436,8 @@ static void add_node_base(ckpool_t *ckp, json_t *val) |
|
|
|
workbase_t *wb = ckzalloc(sizeof(workbase_t)); |
|
|
|
workbase_t *wb = ckzalloc(sizeof(workbase_t)); |
|
|
|
sdata_t *sdata = ckp->data; |
|
|
|
sdata_t *sdata = ckp->data; |
|
|
|
bool new_block = false; |
|
|
|
bool new_block = false; |
|
|
|
txntable_t *txn, *tmp; |
|
|
|
|
|
|
|
json_t *txnhashes; |
|
|
|
json_t *txnhashes; |
|
|
|
char header[228]; |
|
|
|
char header[228]; |
|
|
|
int purged = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
wb->ckp = ckp; |
|
|
|
wb->ckp = ckp; |
|
|
|
json_int64cpy(&wb->id, val, "jobid"); |
|
|
|
json_int64cpy(&wb->id, val, "jobid"); |
|
|
@ -1454,7 +1453,6 @@ static void add_node_base(ckpool_t *ckp, json_t *val) |
|
|
|
json_uint64cpy(&wb->coinbasevalue, val, "coinbasevalue"); |
|
|
|
json_uint64cpy(&wb->coinbasevalue, val, "coinbasevalue"); |
|
|
|
json_intcpy(&wb->height, val, "height"); |
|
|
|
json_intcpy(&wb->height, val, "height"); |
|
|
|
json_strdup(&wb->flags, val, "flags"); |
|
|
|
json_strdup(&wb->flags, val, "flags"); |
|
|
|
json_intcpy(&wb->txns, val, "txns"); |
|
|
|
|
|
|
|
txnhashes = json_object_get(val, "txnhashes"); |
|
|
|
txnhashes = json_object_get(val, "txnhashes"); |
|
|
|
if (!rebuild_txns(sdata, wb, txnhashes)) { |
|
|
|
if (!rebuild_txns(sdata, wb, txnhashes)) { |
|
|
|
LOGWARNING("Unable to rebuild transactions from hashes to create workinfo"); |
|
|
|
LOGWARNING("Unable to rebuild transactions from hashes to create workinfo"); |
|
|
@ -1485,20 +1483,6 @@ static void add_node_base(ckpool_t *ckp, json_t *val) |
|
|
|
add_base(ckp, sdata, wb, &new_block); |
|
|
|
add_base(ckp, sdata, wb, &new_block); |
|
|
|
if (new_block) |
|
|
|
if (new_block) |
|
|
|
LOGNOTICE("Block hash changed to %s", sdata->lastswaphash); |
|
|
|
LOGNOTICE("Block hash changed to %s", sdata->lastswaphash); |
|
|
|
|
|
|
|
|
|
|
|
ck_wlock(&sdata->workbase_lock); |
|
|
|
|
|
|
|
HASH_ITER(hh, sdata->txns, txn, tmp) { |
|
|
|
|
|
|
|
if (txn->refcount--) |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
HASH_DEL(sdata->txns, txn); |
|
|
|
|
|
|
|
dealloc(txn->data); |
|
|
|
|
|
|
|
dealloc(txn); |
|
|
|
|
|
|
|
purged++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ck_wunlock(&sdata->workbase_lock); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (purged) |
|
|
|
|
|
|
|
LOGINFO("Stratifier purged %d node transactions", purged); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Calculate share diff and fill in hash and swap */ |
|
|
|
/* Calculate share diff and fill in hash and swap */ |
|
|
@ -6287,15 +6271,17 @@ static void add_node_txns(sdata_t *sdata, const json_t *val) |
|
|
|
{ |
|
|
|
{ |
|
|
|
json_t *txn_array, *txn_val, *data_val, *hash_val; |
|
|
|
json_t *txn_array, *txn_val, *data_val, *hash_val; |
|
|
|
txntable_t *txn; |
|
|
|
txntable_t *txn; |
|
|
|
|
|
|
|
int i, arr_size; |
|
|
|
int added = 0; |
|
|
|
int added = 0; |
|
|
|
size_t i; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txn_array = json_object_get(val, "transaction"); |
|
|
|
txn_array = json_object_get(val, "transaction"); |
|
|
|
|
|
|
|
arr_size = json_array_size(txn_array); |
|
|
|
|
|
|
|
|
|
|
|
ck_wlock(&sdata->workbase_lock); |
|
|
|
ck_wlock(&sdata->workbase_lock); |
|
|
|
json_array_foreach(txn_array, i, txn_val) { |
|
|
|
for (i = 0; i < arr_size; i++) { |
|
|
|
const char *hash, *data; |
|
|
|
const char *hash, *data; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txn_val = json_array_get(txn_array, i); |
|
|
|
data_val = json_object_get(txn_val, "data"); |
|
|
|
data_val = json_object_get(txn_val, "data"); |
|
|
|
hash_val = json_object_get(txn_val, "hash"); |
|
|
|
hash_val = json_object_get(txn_val, "hash"); |
|
|
|
data = json_string_value(data_val); |
|
|
|
data = json_string_value(data_val); |
|
|
|