diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 5dfec5e143910d718a06b5c0b89574f7562eb71d..bd467d2052f1cfe3ab444a2076ffc12a70c62940 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -235,7 +235,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) dap_cli_server_cmd_add ("mempool_list", com_mempool_list, "List mempool (entries or transaction) for (selected chain network or wallet)", - "mempool_list -net <net_name> [-chain <chain_name>] [-addr <addr>] \n"); + "mempool_list -net <net_name> [-chain <chain_name>] [-addr <addr>] [-fast] \n"); dap_cli_server_cmd_add ("mempool_check", com_mempool_check, "Check mempool entrie for presence in selected chain network", "mempool_check -net <net_name> -datum <datum hash>\n"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 3e363090f8f029ed5713253f29128197f55aa94c..cb8f668ede6ba21da022074baff6c88c41067c8c 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2348,7 +2348,7 @@ const char *s_ticker_list_get_main_ticker(dap_list_t *a_tickers, const char *a_n * @param a_str_tmp * @param a_hash_out_type */ -void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, dap_string_t * a_str_tmp, const char *a_hash_out_type){ +void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, const char * a_add, dap_string_t * a_str_tmp, const char *a_hash_out_type, bool a_fast){ int l_removed = 0; dap_chain_mempool_filter(a_chain, &l_removed); dap_string_append_printf(a_str_tmp, "Removed %i records from the %s chain mempool in %s network. \n\n", @@ -2435,62 +2435,64 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a if (obj_token) { l_token_ticker = obj_token->header.ticker; } else { - dap_list_t* l_tickers = NULL; - dap_chain_datum_tx_t *l_tx_parent = NULL; - int l_item_in_size = 0; - void *l_item_in = dap_chain_datum_tx_item_get((dap_chain_datum_tx_t*)l_datum->data, NULL, TX_ITEM_TYPE_IN_ALL, &l_item_in_size); - bool l_is_unchained = false; - dap_hash_fast_t l_parent_hash = {0}; - int l_parrent_tx_out_idx; - for (int l_item_in_size_current = 0; l_item_in_size_current < l_item_in_size && !l_token_ticker;) { - size_t l_tmp_size = dap_chain_datum_item_tx_get_size(l_item_in); - if (l_tmp_size == 0) - break; - l_item_in_size_current += l_tmp_size; - switch (dap_chain_datum_tx_item_get_type(l_item_in)) { - case TX_ITEM_TYPE_IN: - l_parent_hash = ((dap_chain_tx_in_t*)l_item_in)->header.tx_prev_hash; - l_parrent_tx_out_idx = ((dap_chain_tx_in_t*)l_item_in)->header.tx_out_prev_idx; - l_tx_parent = dap_chain_ledger_tx_find_by_hash(a_net->pub.ledger, &((dap_chain_tx_in_t*)l_item_in)->header.tx_prev_hash); + if (!a_fast) { + dap_list_t* l_tickers = NULL; + dap_chain_datum_tx_t *l_tx_parent = NULL; + int l_item_in_size = 0; + void *l_item_in = dap_chain_datum_tx_item_get((dap_chain_datum_tx_t*)l_datum->data, NULL, TX_ITEM_TYPE_IN_ALL, &l_item_in_size); + bool l_is_unchained = false; + dap_hash_fast_t l_parent_hash = {0}; + int l_parrent_tx_out_idx; + for (int l_item_in_size_current = 0; l_item_in_size_current < l_item_in_size && !l_token_ticker;) { + size_t l_tmp_size = dap_chain_datum_item_tx_get_size(l_item_in); + if (l_tmp_size == 0) break; - case TX_ITEM_TYPE_IN_COND: - l_parent_hash = ((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_prev_hash; - l_parrent_tx_out_idx = ((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_out_prev_idx; - l_tx_parent = dap_chain_ledger_tx_find_by_hash(a_net->pub.ledger, &((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_prev_hash); + l_item_in_size_current += l_tmp_size; + switch (dap_chain_datum_tx_item_get_type(l_item_in)) { + case TX_ITEM_TYPE_IN: + l_parent_hash = ((dap_chain_tx_in_t*)l_item_in)->header.tx_prev_hash; + l_parrent_tx_out_idx = ((dap_chain_tx_in_t*)l_item_in)->header.tx_out_prev_idx; + l_tx_parent = dap_chain_ledger_tx_find_by_hash(a_net->pub.ledger, &((dap_chain_tx_in_t*)l_item_in)->header.tx_prev_hash); + break; + case TX_ITEM_TYPE_IN_COND: + l_parent_hash = ((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_prev_hash; + l_parrent_tx_out_idx = ((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_out_prev_idx; + l_tx_parent = dap_chain_ledger_tx_find_by_hash(a_net->pub.ledger, &((dap_chain_tx_in_cond_t*)l_item_in)->header.tx_prev_hash); + break; + } + if (!l_tx_parent) { + l_is_unchained = true; break; + } + const char *l_current_token = NULL; + void *l_out_unknown = (dap_chain_tx_out_cond_t*)dap_chain_datum_tx_item_get_nth( + l_tx_parent, TX_ITEM_TYPE_OUT_ALL, l_parrent_tx_out_idx); + switch(dap_chain_datum_tx_item_get_type(l_out_unknown)) { + case TX_ITEM_TYPE_OUT: + l_current_token = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_parent_hash); + l_tickers = dap_list_append(l_tickers, (void *)l_current_token); + break; + case TX_ITEM_TYPE_OUT_EXT: + l_current_token = ((dap_chain_tx_out_ext_t*)l_out_unknown)->token; + l_tickers = dap_list_append(l_tickers, (void *)l_current_token); + break; + case TX_ITEM_TYPE_OUT_COND: + if(((dap_chain_tx_out_cond_t*)l_out_unknown)->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { + l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_parent_hash); + } + break; + } } - if (!l_tx_parent) { - l_is_unchained = true; - break; + if (l_is_unchained) { + dap_string_append_printf(a_str_tmp, ": Transaction %s unchained. \n", l_objs[i].key); } - const char *l_current_token = NULL; - void *l_out_unknown = (dap_chain_tx_out_cond_t*)dap_chain_datum_tx_item_get_nth( - l_tx_parent, TX_ITEM_TYPE_OUT_ALL, l_parrent_tx_out_idx); - switch(dap_chain_datum_tx_item_get_type(l_out_unknown)) { - case TX_ITEM_TYPE_OUT: - l_current_token = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_parent_hash); - l_tickers = dap_list_append(l_tickers, (void *)l_current_token); - break; - case TX_ITEM_TYPE_OUT_EXT: - l_current_token = ((dap_chain_tx_out_ext_t*)l_out_unknown)->token; - l_tickers = dap_list_append(l_tickers, (void *)l_current_token); - break; - case TX_ITEM_TYPE_OUT_COND: - if(((dap_chain_tx_out_cond_t*)l_out_unknown)->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) { - l_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_parent_hash); - } - break; + if (!l_is_unchained && !l_token_ticker) { + l_token_ticker = s_ticker_list_get_main_ticker(l_tickers, a_net->pub.native_ticker); + if (!l_token_ticker) + dap_string_append_printf(a_str_tmp, ": Can't find token ticker for transaction %s. \n", l_objs[i].key); } + dap_list_free(l_tickers); } - if (l_is_unchained) { - dap_string_append_printf(a_str_tmp, ": Transaction %s unchained. \n", l_objs[i].key); - } - if (!l_is_unchained && !l_token_ticker) { - l_token_ticker = s_ticker_list_get_main_ticker(l_tickers, a_net->pub.native_ticker); - if (!l_token_ticker) - dap_string_append_printf(a_str_tmp, ": Can't find token ticker for transaction %s. \n", l_objs[i].key); - } - dap_list_free(l_tickers); } } dap_string_append_printf(a_str_tmp, @@ -2501,8 +2503,8 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a (l_datum->header.type_id == DAP_CHAIN_DATUM_TX ) ? "UNKNOWN" : "", l_datum->header.data_size, dap_ctime_r(&l_ts_create, buf)); - - dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type); + if (!a_fast) + dap_chain_datum_dump(a_str_tmp, l_datum, a_hash_out_type); } if(a_add) dap_string_append_printf(a_str_tmp, l_objs_addr @@ -2531,11 +2533,13 @@ int com_mempool_list(int a_argc, char **a_argv, char **a_str_reply) dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; const char *l_addr_base58 = NULL; + bool l_fast = false; const char * l_hash_out_type = "hex"; dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-H", &l_hash_out_type); dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net); dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_base58); + l_fast = (dap_cli_server_cmd_check_option(a_argv, arg_index, a_argc, "-fast") != -1) ? true : false; if(!l_net) return -1; else { @@ -2547,10 +2551,10 @@ int com_mempool_list(int a_argc, char **a_argv, char **a_str_reply) dap_string_t * l_str_tmp = dap_string_new(NULL); if(l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_addr_base58, l_str_tmp, l_hash_out_type); + s_com_mempool_list_print_for_chain(l_net, l_chain, l_addr_base58, l_str_tmp, l_hash_out_type, l_fast); else DL_FOREACH(l_net->pub.chains, l_chain) - s_com_mempool_list_print_for_chain(l_net, l_chain, l_addr_base58, l_str_tmp, l_hash_out_type); + s_com_mempool_list_print_for_chain(l_net, l_chain, l_addr_base58, l_str_tmp, l_hash_out_type, l_fast); dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); dap_string_free(l_str_tmp, true); return 0;