diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum.c b/modules/json_rpc/common/dap_json_rpc_chain_datum.c index 31eee45386f98906b8e70eee859b73ac615a6866..5b61d66f4075d7ea40e272167d8a72dc07c1ec65 100644 --- a/modules/json_rpc/common/dap_json_rpc_chain_datum.c +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum.c @@ -652,7 +652,7 @@ json_object * dap_chain_datum_data_to_json(dap_chain_datum_t *a_datum) { json_object *l_obj_data; switch (a_datum->header.type_id) { case DAP_CHAIN_DATUM_TX: - l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data,NULL); + l_obj_data = dap_chain_datum_tx_to_json((dap_chain_datum_tx_t*)a_datum->data, NULL); if (!l_obj_data) { dap_json_rpc_error_add(CHAIN_DATUM_TO_JSON_ERR_CAN_NOT_SERIALIZATION_TX_TO_JSON, "Can't convert DAP_CHAIN_DATUM_TX to JSON"); diff --git a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c index 9b3d6404058a8390a7fa1e23551fe00964d9cea6..5df5fdb51304e87c431a9a3c84c274fbc718ff7f 100644 --- a/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c +++ b/modules/json_rpc/common/dap_json_rpc_chain_datum_tx.c @@ -16,16 +16,17 @@ -json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx,dap_chain_net_id_t *a_net_id){ +json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx, dap_chain_net_id_t *a_net_id){ json_object *l_obj_items = json_object_new_array(); if (!l_obj_items) { dap_json_rpc_allocation_error; return NULL; } - uint32_t l_tx_items_count = 0; - uint32_t l_tx_items_size = a_tx->header.tx_items_size; - while(l_tx_items_count < l_tx_items_size) { - uint8_t *item = a_tx->tx_items + l_tx_items_count; + uint32_t + l_tx_items_size_total = 0, + l_tx_items_size = a_tx->header.tx_items_size; + while(l_tx_items_size_total < l_tx_items_size) { + uint8_t *item = a_tx->tx_items + l_tx_items_size_total; size_t l_tx_item_size = dap_chain_datum_item_tx_get_size(item); if (l_tx_item_size == 0) { json_object_put(l_obj_items); @@ -142,8 +143,7 @@ json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx,dap_chain_net json_object_object_add(l_obj_item, "data", l_obj_item_data); json_object_array_add(l_obj_items, l_obj_item); } - - l_tx_items_count += l_tx_item_size; + l_tx_items_size_total += l_tx_item_size; } return l_obj_items; } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 34afd32460d8fa7f1b50381b906a1fc886ad8fdb..abb08d9ad279d3e67e949f14f5b23621e6d41a10 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -7165,6 +7165,7 @@ int com_tx_history(int a_argc, char ** a_argv, void **a_str_reply) "something went wrong in tx_history"); return DAP_CHAIN_NODE_CLI_COM_TX_HISTORY_DAP_DB_HISTORY_ADDR_ERR; } + } else if (l_is_tx_all) { // history all const char * l_brief_type = NULL; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index f523b12f3c8e87fe6cec37cc6ae855a076b2bbd9..15e225603ead94df793fc3cb326f20b8a15aad3e 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -332,33 +332,20 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, uint256_t l_corr_value = {}, l_unstake_value = {}; json_object *l_corr_object = NULL; - size_t l_arr_start = 0; - if (a_offset) - l_arr_start = a_offset * a_limit; - size_t l_arr_end = a_chain->callback_count_atom(a_chain); - if (a_limit) { - l_arr_end = l_arr_start + a_limit; - size_t l_length = a_chain->callback_count_atom(a_chain); - if (l_arr_end > l_length) - l_arr_end = l_length; - } - size_t i_tmp = 1; + size_t + l_count = 0, + l_count_tx = 0; // load transactions dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter); - l_datum; + l_datum && (a_limit ? l_count_tx < a_limit : true); l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter)) { if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX) // go to next datum continue; // it's a transaction - if (i_tmp < l_arr_start || i_tmp > l_arr_end) { - i_tmp++; - continue; - } - i_tmp++; bool l_is_unstake = false; dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; dap_list_t *l_list_in_items = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_ALL, NULL); @@ -445,8 +432,6 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object * j_obj_tx = json_object_new_object(); if (!j_obj_tx || !j_arr_data) { dap_json_rpc_allocation_error; - json_object_put(j_obj_tx); - json_object_put(j_arr_data); return NULL; } if (!l_src_addr) { @@ -471,6 +456,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, if (!l_dst_addr_present) continue; } + bool l_count_bool = false; for (dap_list_t *it = l_list_out_items; it; it = it->next) { dap_chain_addr_t *l_dst_addr = NULL; uint8_t l_type = *(uint8_t *)it->data; @@ -506,6 +492,8 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, if (l_dst_addr && l_net_fee_used && dap_chain_addr_compare(&l_net_fee_addr, l_dst_addr)) SUM_256_256(l_fee_sum, l_value, &l_fee_sum); if (l_dst_addr && dap_chain_addr_compare(l_dst_addr, a_addr)) { + if (l_count++ < a_offset) + break; if (!l_header_printed) { s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code); @@ -528,7 +516,6 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object *j_obj_data = json_object_new_object(); if (!j_obj_data) { dap_json_rpc_allocation_error; - json_object_put(j_arr_data); json_object_put(j_obj_tx); return NULL; } @@ -542,11 +529,14 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, l_corr_object = j_obj_data; else json_object_array_add(j_arr_data, j_obj_data); + l_count_bool = true; } else if (!l_src_addr || dap_chain_addr_compare(l_src_addr, a_addr)) { if (!l_dst_addr && ((dap_chain_tx_out_cond_t *)it->data)->header.subtype == l_src_subtype && l_src_subtype == DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) continue; if (!l_src_addr && l_dst_addr && !dap_chain_addr_compare(l_dst_addr, &l_net_fee_addr)) continue; + if (l_count++ < a_offset) + break; if (!l_header_printed) { s_tx_header_print(j_obj_tx, &l_tx_data_ht, l_tx, l_datum_iter->cur_atom_hash, a_hash_out_type, l_ledger, &l_tx_hash, l_datum_iter->ret_code); @@ -560,7 +550,6 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object * j_obj_data = json_object_new_object(); if (!j_obj_data) { dap_json_rpc_allocation_error; - json_object_put(j_arr_data); json_object_put(j_obj_tx); return NULL; } @@ -571,10 +560,12 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, : json_object_new_string("UNKNOWN")); json_object_object_add(j_obj_data, "destination_address", json_object_new_string(l_dst_addr_str)); json_object_array_add(j_arr_data, j_obj_data); + l_count_bool = true; } } if (json_object_array_length(j_arr_data) > 0) { json_object_object_add(j_obj_tx, "data", j_arr_data); + json_object_array_add(json_obj_datum, j_obj_tx); } dap_list_free(l_list_out_items); if (l_is_need_correction) { @@ -588,6 +579,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object_array_add(j_arr_data, l_corr_object); l_is_need_correction = false; } + l_count_tx += l_count_bool; } a_chain->callback_datum_iter_delete(l_datum_iter); // delete hashes @@ -611,40 +603,30 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, size_t a_limit, size_t a_offset, bool out_brief) { log_it(L_DEBUG, "Start getting tx from chain"); - size_t l_tx_count = 0; - size_t l_tx_ledger_accepted = 0; - size_t l_tx_ledger_rejected = 0; + size_t + l_tx_ledger_accepted = 0, + l_tx_ledger_rejected = 0, + l_count = 0, + l_count_tx = 0; + dap_chain_cell_t *l_cell = NULL, *l_cell_tmp = NULL; dap_chain_atom_iter_t *l_iter = NULL; json_object * json_arr_out = json_object_new_array(); - size_t l_arr_start = 0; - if (a_offset) { - l_arr_start = a_limit * a_offset; - } - size_t l_arr_end = l_chain->callback_count_atom(l_chain); - if (a_limit) { - l_arr_end = l_arr_start + a_limit; - if (l_arr_end > l_chain->callback_count_atom(l_chain)) { - l_arr_end = l_chain->callback_count_atom(l_chain); - } - } - size_t i_tmp = 1; HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { + if (a_limit && l_count_tx >= a_limit) + break; l_iter = l_chain->callback_atom_iter_create(l_chain, l_cell->id, NULL); size_t l_atom_size = 0; dap_chain_atom_ptr_t l_ptr = l_chain->callback_atom_iter_get(l_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size); - while (l_ptr && l_atom_size) { + while (l_ptr && l_atom_size && (a_limit ? l_count_tx < a_limit : true)) { size_t l_datums_count = 0; dap_chain_datum_t **l_datums = l_cell->chain->callback_atom_get_datums(l_ptr, l_atom_size, &l_datums_count); - for (size_t i = 0; i < l_datums_count; i++) { + for (size_t i = 0; i < l_datums_count && (a_limit ? l_count_tx < a_limit : true); i++) { if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) { - if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { - i_tmp++; + if (l_count++ < a_offset) { continue; } - i_tmp++; - l_tx_count++; dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*)l_datums[i]->data; dap_hash_fast_t l_ttx_hash = {0}; dap_hash_fast(l_tx, l_datums[i]->header.data_size, &l_ttx_hash); @@ -654,12 +636,14 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, log_it(L_CRITICAL, "%s", g_error_memory_alloc); return NULL; } - if (accepted_tx) - l_tx_ledger_accepted++; - else - l_tx_ledger_rejected++; + if (accepted_tx) { + ++l_tx_ledger_accepted; + } else { + ++l_tx_ledger_rejected; + } json_object_array_add(json_arr_out, json_obj_datum); const char * debug_json_string = json_object_to_json_string(json_obj_datum); + ++l_count_tx; } } DAP_DEL_Z(l_datums); @@ -671,7 +655,7 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, json_object_object_add(json_obj_summary, "network", json_object_new_string(l_net->pub.name)); json_object_object_add(json_obj_summary, "chain", json_object_new_string(l_chain->name)); - json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(l_tx_count)); + json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(l_count_tx)); json_object_object_add(json_obj_summary, "accepted_tx", json_object_new_int(l_tx_ledger_accepted)); json_object_object_add(json_obj_summary, "rejected_tx", json_object_new_int(l_tx_ledger_rejected)); return json_arr_out;