diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 47740336ed7fe8a24f92ef90bae21bb259b76bc0..6b74b128727f49fdf73106d47a271a42120e7549 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -911,6 +911,8 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); dap_chain_ch_summary_t *l_sum = (dap_chain_ch_summary_t *)l_chain_pkt->data; + if(l_chain->atom_num_last < l_sum->num_last) + l_chain->atom_num_last = l_sum->num_last; debug_if(s_debug_more, L_DEBUG, "In: CHAIN_SUMMARY of %s for net %s from source " NODE_ADDR_FP_STR " with %" DAP_UINT64_FORMAT_U " atoms to sync from %" DAP_UINT64_FORMAT_U " to %" DAP_UINT64_FORMAT_U, l_chain ? l_chain->name : "(null)", diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 9d28d183745b4833d4c829a2d874c37e1a80bae7..76def40e457ffacd4b9b23b1452cde56beccb63c 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -150,6 +150,7 @@ typedef struct dap_chain { dap_chain_type_t *default_datum_types; uint16_t autoproc_datum_types_count; uint16_t *autoproc_datum_types; + uint64_t atom_num_last; // To hold it in double-linked lists struct dap_chain * next; diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c index 951b8d04741fe1cb44eae563481c6f251738c2b1..8b681cfe8dfd73147ef99dd2555291b3130d935e 100644 --- a/modules/common/dap_chain_datum_decree.c +++ b/modules/common/dap_chain_datum_decree.c @@ -177,7 +177,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree l_offset += dap_tsd_size(l_tsd); switch(l_tsd->type) { case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_VALUE: - if (l_tsd->size > sizeof(uint256_t)){ + if (l_tsd->size != sizeof(uint256_t)){ dap_string_append_printf(a_str_out, "\tValue: <WRONG SIZE>\n"); break; } @@ -189,7 +189,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_SIGN: break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE: - if (l_tsd->size > sizeof(uint256_t)){ + if (l_tsd->size != sizeof(uint256_t)){ dap_string_append_printf(a_str_out, "\tFee: <WRONG SIZE>\n"); break; } @@ -199,7 +199,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tFee: %s\n", l_fee_value_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_OWNER: - if (l_tsd->size < sizeof(dap_pkey_t)) { + if (l_tsd->size != sizeof(dap_pkey_t)) { dap_string_append_printf(a_str_out, "\tOwner fingerprint: <WRONG SIZE>\n"); break; } @@ -210,7 +210,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tOwner fingerprint: %s\n", l_owner_pkey_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER: - if (l_tsd->size != sizeof(uint32_t)){ + if (l_tsd->size != sizeof(uint256_t)) { dap_string_append_printf(a_str_out, "\tOwner min: <WRONG SIZE>\n"); break; } @@ -220,7 +220,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tOwner min: %s\n", l_owner_min_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_FEE_WALLET: - if (l_tsd->size > sizeof(dap_chain_addr_t)) { + if (l_tsd->size != sizeof(dap_chain_addr_t)) { dap_string_append_printf(a_str_out, "\tWallet for fee: <WRONG SIZE>\n"); break; } @@ -229,7 +229,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tWallet for fee: %s\n", dap_chain_addr_to_str(l_addr_fee_wallet)); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HASH: - if (l_tsd->size > sizeof(dap_hash_fast_t)) { + if (l_tsd->size != sizeof(dap_hash_fast_t)) { dap_string_append_printf(a_str_out, "\tHash: <WRONG SIZE>\n"); break; } @@ -241,7 +241,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tHash: %s\n", l_stake_tx_hash); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_VALUE: - if (l_tsd->size > sizeof(uint256_t)){ + if (l_tsd->size != sizeof(uint256_t)){ dap_string_append_printf(a_str_out, "\tStake value: <WRONG SIZE>\n"); break; } @@ -251,7 +251,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tStake value: %s\n", l_stake_value_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR: - if (l_tsd->size > sizeof(dap_chain_addr_t)) { + if (l_tsd->size != sizeof(dap_chain_addr_t)) { dap_string_append_printf(a_str_out, "\tSigning addr: <WRONG SIZE>\n"); break; } @@ -265,7 +265,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_NODE_ADDR: - if(l_tsd->size > sizeof(dap_chain_node_addr_t)){ + if (l_tsd->size != sizeof(dap_chain_node_addr_t)){ dap_string_append_printf(a_str_out, "\tNode addr: <WRONG SIZE>\n"); break; } @@ -274,7 +274,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree NODE_ADDR_FP_ARGS(l_node_addr)); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_VALUE: - if (l_tsd->size > sizeof(uint256_t)) { + if (l_tsd->size != sizeof(uint256_t)) { dap_string_append_printf(a_str_out, "\tMin value: <WRONG SIZE>\n"); break; } @@ -284,7 +284,7 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tMin value: %s\n", l_min_value_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_MIN_SIGNERS_COUNT: - if (l_tsd->size > sizeof(uint256_t)) { + if (l_tsd->size != sizeof(uint256_t)) { dap_string_append_printf(a_str_out, "\tMin signers count: <WRONG SIZE>\n"); break; } diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 401b6b28047d00d7c373c0f7109bba1a60726d10..b4cbb481ec3e1285ce1c0758cb412c3541999519 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -192,9 +192,9 @@ int dap_chain_cs_esbocs_init() "\tEnables or disables checks for blocks signs structure validity\n" "esbocs check_signs_structure show -net <net_name> -chain <chain_name>\n" "\tShow status of checks for blocks signs structure validity\n" - "esbocs emergency_validator {add|remove} -net <net_name> -chain <chain_name> -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n" + "esbocs emergency_validators {add|remove} -net <net_name> -chain <chain_name> -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n" "\tAdd or remove validator by its signature public key hash to list of validators allowed to work in emergency mode\n" - "esbocs emergency_validator show -net <net_name> -chain <chain_name>\n" + "esbocs emergency_validators show -net <net_name> -chain <chain_name>\n" "\tShow list of validators public key hashes allowed to work in emergency mode\n"); return 0; } @@ -2969,7 +2969,7 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) [SUBCMD_UNDEFINED] = NULL, [SUBCMD_MIN_VALIDATORS_COUNT] = "min_validators_count", [SUBCMD_CHECK_SIGNS_STRUCTURE] = "check_signs_structure", - [SUBCMD_EMERGENCY_VALIDATOR] = "emergency_validator", + [SUBCMD_EMERGENCY_VALIDATOR] = "emergency_validators", }; const size_t l_subcmd_str_count = sizeof(l_subcmd_strs) / sizeof(char *); @@ -3100,7 +3100,7 @@ static int s_cli_esbocs(int a_argc, char **a_argv, void **a_str_reply) } break; default: - dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index]); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Unrecognized subcommand '%s'", a_argv[l_arg_index - 1]); } return ret; } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index e09b826d88412144b88eab1243c8e9d2f5996f8c..271f2c2b45221b6f42393d6f33adc335e5684fe9 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -231,7 +231,7 @@ static const dap_link_manager_callbacks_t s_link_manager_callbacks = { // State machine switchs here static bool s_net_states_proc(void *a_arg); -struct json_object *s_net_states_json_collect(dap_chain_net_t * l_net); +json_object *s_net_states_json_collect(dap_chain_net_t * l_net); static void s_net_states_notify(dap_chain_net_t * l_net); static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg); //static void s_net_proc_kill( dap_chain_net_t * a_net ); @@ -464,7 +464,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name, NODE_ADDR_FP_ARGS_S(a_link->addr)); - struct json_object *l_json = s_net_states_json_collect(l_net); + json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[128] = { }; snprintf(l_err_str, sizeof(l_err_str) , "Established connection with link " NODE_ADDR_FP_STR @@ -528,7 +528,7 @@ static void s_link_manager_callback_error(dap_link_t *a_link, uint64_t a_net_id, log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR, l_net ? l_net->pub.name : "(unknown)", NODE_ADDR_FP_ARGS_S(a_link->addr)); if (l_net){ - struct json_object *l_json = s_net_states_json_collect(l_net); + json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[512] = { }; snprintf(l_err_str, sizeof(l_err_str) , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d" @@ -583,9 +583,37 @@ int s_link_manager_fill_net_info(dap_link_t *a_link) return 0; } -struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) +json_object *s_net_sync_status(dap_chain_net_t *a_net) { +// sanity check + dap_return_val_if_pass(!a_net, NULL); +// func work + json_object *l_ret = json_object_new_object(); + size_t + l_count_el = 0, + l_count_el_all = 0, + l_node_link_nodes = 0; + char *l_gdb_nodes = a_net->pub.gdb_nodes; + + dap_chain_t *l_chain = NULL; + DL_FOREACH(a_net->pub.chains, l_chain){ + l_count_el += l_chain->callback_count_atom(l_chain); + l_count_el_all += l_chain->atom_num_last; + } + double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0; + char *l_percent_str = dap_strdup_printf("%.3f", l_percent); + json_object *l_jobj_percent = json_object_new_string(l_percent_str); + DAP_DELETE(l_percent_str); + json_object *l_jobj_total = json_object_new_uint64(l_count_el_all); + json_object *l_jobj_current = json_object_new_uint64(l_count_el); + json_object_object_add(l_ret, "current", l_jobj_current); + json_object_object_add(l_ret, "total", l_jobj_total); + json_object_object_add(l_ret, "percent", l_jobj_percent); + return l_ret; +} + +json_object *s_net_states_json_collect(dap_chain_net_t *a_net) { - struct json_object *l_json = json_object_new_object(); + json_object *l_json = json_object_new_object(); json_object_object_add(l_json, "class" , json_object_new_string("NetStates")); json_object_object_add(l_json, "name" , json_object_new_string((const char*)a_net->pub.name)); json_object_object_add(l_json, "networkState" , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state))); @@ -595,6 +623,10 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) char l_node_addr_str[24] = {'\0'}; int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr)); json_object_object_add(l_json, "nodeAddress" , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000")); + if (PVT(a_net)->state == NET_STATE_SYNC_CHAINS) { + json_object *l_json_sync_status = s_net_sync_status(a_net); + json_object_object_add(l_json, "processed", l_json_sync_status); + } return l_json; } @@ -604,7 +636,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) */ static void s_net_states_notify(dap_chain_net_t *a_net) { - struct json_object *l_json = s_net_states_json_collect(a_net); + json_object *l_json = s_net_states_json_collect(a_net); json_object_object_add(l_json, "errorMessage", json_object_new_string(" ")); // regular notify has no error dap_notify_server_send_mt(json_object_get_string(l_json)); json_object_put(l_json); @@ -795,20 +827,24 @@ json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) { json_object_object_add(l_jobj_ret, "current_addr", l_jobj_cur_node_addr); if (PVT(a_net)->state != NET_STATE_OFFLINE) { json_object *l_jobj_links = json_object_new_object(); - json_object *l_jobj_active_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/); // need adopt to link manager - json_object *l_jobj_total_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/); - if (!l_jobj_links || !l_jobj_active_links || !l_jobj_total_links) { + json_object *l_jobj_active_links = json_object_new_uint64(dap_link_manager_links_count(a_net->pub.id.uint64)); + json_object *l_jobj_required_links = json_object_new_uint64(dap_link_manager_required_links_count(a_net->pub.id.uint64)); + if (!l_jobj_links || !l_jobj_active_links || !l_jobj_required_links) { json_object_put(l_jobj_ret); json_object_put(l_jobj_links); json_object_put(l_jobj_active_links); - json_object_put(l_jobj_total_links); + json_object_put(l_jobj_required_links); dap_json_rpc_allocation_error; return NULL; } json_object_object_add(l_jobj_links, "active", l_jobj_active_links); - json_object_object_add(l_jobj_links, "total", l_jobj_total_links); + json_object_object_add(l_jobj_links, "required", l_jobj_required_links); json_object_object_add(l_jobj_ret, "links", l_jobj_links); } + + json_object *l_json_sync_status = s_net_sync_status(a_net); + json_object_object_add(l_jobj_ret, "processed", l_json_sync_status); + json_object *l_jobj_states = json_object_new_object(); json_object *l_jobj_current_states = json_object_new_string(c_net_states[PVT(a_net)->state]); json_object *l_jobj_target_states = json_object_new_string(c_net_states[PVT(a_net)->state_target]); @@ -2134,7 +2170,7 @@ bool s_net_load(void *a_arg) dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Initialized chain files"); } - + l_chain->atom_num_last = l_chain->callback_count_atom(l_chain); l_chain = l_chain->next; } // Process thresholds if any diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index d58a9ad326056c1e5043542e897aa686f9240a78..1924ec2c250c444a28337cb756aa7b4c7cbded91 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -387,13 +387,17 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, } json_object_array_add(json_obj_datum, json_obj_lim); size_t i_tmp = 0; + size_t + l_tx_ledger_accepted = 0, + l_tx_ledger_rejected = 0; // load transactions dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); - +size_t datums = 0; for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter); l_datum; l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter)) { + datums++; json_object *l_corr_object = NULL; if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX) // go to next datum @@ -405,11 +409,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, if (!l_list_in_items) // a bad tx continue; // all in items should be from the same address - if (i_tmp >= l_arr_end || i_tmp < l_arr_start) { - i_tmp++; - continue; - } - i_tmp++; + dap_chain_addr_t *l_src_addr = NULL; bool l_base_tx = false, l_reward_collect = false; const char *l_noaddr_token = NULL; @@ -600,6 +600,11 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, l_corr_value = l_value; } const char *l_coins_str, *l_value_str = dap_uint256_to_char(l_value, &l_coins_str); + if (i_tmp >= l_arr_end || i_tmp < l_arr_start) { + i_tmp++; + continue; + } + i_tmp++; json_object *j_obj_data = json_object_new_object(); if (!j_obj_data) { @@ -608,6 +613,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object_put(j_arr_data); return NULL; } + l_src_token ? l_tx_ledger_accepted++ : l_tx_ledger_rejected++; json_object_object_add(j_obj_data, "tx_type", json_object_new_string("recv")); json_object_object_add(j_obj_data, "recv_coins", json_object_new_string(l_coins_str)); json_object_object_add(j_obj_data, "recv_datoshi", json_object_new_string(l_value_str)); @@ -634,6 +640,11 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, : dap_chain_tx_out_cond_subtype_to_str( ((dap_chain_tx_out_cond_t *)it->data)->header.subtype); const char *l_coins_str, *l_value_str = dap_uint256_to_char(l_value, &l_coins_str); + if (i_tmp >= l_arr_end || i_tmp < l_arr_start) { + i_tmp++; + continue; + } + i_tmp++; json_object * j_obj_data = json_object_new_object(); if (!j_obj_data) { dap_json_rpc_allocation_error; @@ -641,6 +652,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, json_object_put(j_arr_data); return NULL; } + l_src_token ? l_tx_ledger_accepted++ : l_tx_ledger_rejected++; json_object_object_add(j_obj_data, "tx_type", json_object_new_string("send")); json_object_object_add(j_obj_data, "send_coins", json_object_new_string(l_coins_str)); json_object_object_add(j_obj_data, "send_datoshi", json_object_new_string(l_value_str)); @@ -684,7 +696,9 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, } 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(a_chain->name)); - json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(i_tmp)); + json_object_object_add(json_obj_summary, "tx_sum", json_object_new_int(i_tmp)); + 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_obj_datum; } @@ -712,26 +726,28 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, json_object_object_add(json_obj_lim, "offset", json_object_new_int(l_arr_start)); } size_t l_arr_end = l_chain->callback_count_atom(l_chain); - l_arr_end = a_limit ? l_arr_start + a_limit : l_arr_start + 1000; - json_object_object_add(json_obj_lim, "limit", json_object_new_int(l_arr_end - l_arr_start)); + l_arr_end = a_limit ? l_arr_start + a_limit : 0; + l_arr_end ? json_object_object_add(json_obj_lim, "limit", json_object_new_int(l_arr_end - l_arr_start)): + json_object_object_add(json_obj_lim, "limit", json_object_new_string("unlimit")); json_object_array_add(json_arr_out, json_obj_lim); if (l_arr_end > l_chain->callback_count_atom(l_chain)) { l_arr_end = l_chain->callback_count_atom(l_chain); } bool look_for_unknown_service = (a_srv && strcmp(a_srv,"unknown") == 0); - - HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { - if (l_count_tx >= l_arr_end) +size_t datums = 0; + HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { + if ((l_count_tx >= l_arr_end)&&(l_arr_end)) 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 && (l_count_tx < l_arr_end)) { + while (l_ptr && l_atom_size && ((l_count_tx < l_arr_end)||(!l_arr_end))) { 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 && (l_count_tx < l_arr_end); i++) { + for (size_t i = 0; i < l_datums_count && ((l_count_tx < l_arr_end)||(!l_arr_end)); i++) { if (l_datums[i]->header.type_id == DAP_CHAIN_DATUM_TX) { + datums++; if (l_count_tx < l_arr_start) { l_count_tx++; continue; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 5c1d0941577a2fec5f45044b02092aff77da9336..ed77c8a7fb55bc4645f48f40b3625af3a2e32952 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -892,12 +892,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) } json_object_array_add(json_arr_bl_cache_out, json_obj_lim); size_t i_tmp = 0; - for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { - if (i_tmp < l_start_arr || i_tmp >= l_arr_end) { - i_tmp++; - continue; - } - i_tmp++; + for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { dap_time_t l_ts = l_block_cache->block->hdr.ts_created; if (l_from_time && l_ts < l_from_time) continue; @@ -958,6 +953,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) continue; } } + if (i_tmp < l_start_arr || i_tmp >= l_arr_end) { + i_tmp++; + continue; + } + i_tmp++; char l_buf[DAP_TIME_STR_SIZE]; json_object* json_obj_bl_cache = json_object_new_object(); dap_time_to_str_rfc822(l_buf, DAP_TIME_STR_SIZE, l_ts);