From ed63fbbafc75b70b8215ce7a75d8303f2cdc8790 Mon Sep 17 00:00:00 2001 From: dmitry <dmitry.puzyrkov@demlabs.net> Date: Mon, 26 Feb 2024 23:07:10 +0700 Subject: [PATCH] [+] ledger tx main ticker by cache-check + mempool ledger status --- modules/net/dap_chain_ledger.c | 17 +++ modules/net/dap_chain_node_cli_cmd.c | 145 +++---------------------- modules/net/include/dap_chain_ledger.h | 3 + prod_build/targets/android.sh | 10 +- 4 files changed, 46 insertions(+), 129 deletions(-) diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 8f0d62be82..c4fb5a5f0b 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -5806,3 +5806,20 @@ void dap_ledger_set_cache_tx_check_callback(dap_ledger_t *a_ledger, dap_ledger_c { PVT(a_ledger)->cache_tx_check_callback = a_callback; } + +char * dap_ledger_tx_get_main_ticker(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, int *a_ledger_rc) +{ + char *l_main_ticker = NULL; + dap_chain_hash_fast_t * l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx); + int l_rc = dap_ledger_tx_cache_check(a_ledger, a_tx, l_tx_hash, false, NULL, NULL, &l_main_ticker); + + if (l_rc == DAP_LEDGER_TX_ALREADY_CACHED) + { + l_main_ticker = dap_ledger_tx_get_token_ticker_by_hash(a_ledger, l_tx_hash); + } + + if (a_ledger_rc) + *a_ledger_rc = l_rc; + + return l_main_ticker; +} diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 6bf96d4667..8b32f469e5 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2778,122 +2778,6 @@ int com_token_decl_sign(int a_argc, char **a_argv, void **a_str_reply) return 0; } -/** - * @breif s_ticker_list_get_main_ticker - * - * @param a_tickers - * @param a_native_ticker - * @return const char* - */ -const char *s_ticker_list_get_main_ticker(dap_list_t *a_tickers, const char *a_native_ticker) { - if (!a_tickers) - return NULL; - const char *mt = (char*)a_tickers->data; - for (dap_list_t *i = a_tickers; i != NULL; i = i->next) { - char *tmp = (char*)i->data; - if (dap_strcmp(mt, tmp) != 0) { - if (dap_strcmp(tmp, a_native_ticker) != 0) - return tmp; - } - } - return mt; -} - -/** - * @breif s_tickers_list_created - * - * @param a_tx - * @param a_net - * @param a_unchained - * @param a_token_ticker - * @return dap_list_t* - */ -dap_list_t *s_tickers_list_created(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net, bool *a_unchained, - const char **a_token_ticker) { - dap_list_t* l_tickers = NULL; - const char *l_token_ticker = 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(a_tx, NULL, TX_ITEM_TYPE_IN_ALL, &l_item_in_size); - dap_hash_fast_t l_parent_hash = {0}; - int l_parrent_tx_out_idx = 0; - 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_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_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) { - *a_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_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_ledger_tx_get_token_ticker_by_hash(a_net->pub.ledger, &l_parent_hash); - } - break; - } - } - if (!(*a_unchained) && !l_token_ticker) { - return l_tickers; - } else { - DAP_DELETE(l_tickers); - *a_token_ticker = l_token_ticker; - return NULL; - } -} - -/** - * @breif s_tx_get_main_ticker - * - * @param a_tx - * @param a_net - * @param a_unchained - * @return const char* - */ -const char* s_tx_get_main_ticker(dap_chain_datum_tx_t *a_tx, dap_chain_net_t *a_net, bool *a_unchained) { - dap_chain_tx_in_ems_t *obj_token = (dap_chain_tx_in_ems_t*)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_IN_EMS, NULL); - if (obj_token) { - return obj_token->header.ticker; - } else { - const char *l_token_ticker = NULL; - dap_list_t *l_tickers_list = NULL; - if (a_unchained) { - l_tickers_list = s_tickers_list_created(a_tx, a_net, a_unchained, &l_token_ticker); - } else { - bool l_unchained = false; - l_tickers_list = s_tickers_list_created(a_tx, a_net, &l_unchained, &l_token_ticker); - } - if (l_tickers_list) { - l_token_ticker = s_ticker_list_get_main_ticker(l_tickers_list, a_net->pub.native_ticker); - DAP_DELETE(l_tickers_list); - } - return l_token_ticker; - } -} /** * @brief s_com_mempool_list_print_for_chain @@ -3044,19 +2928,26 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a case DAP_CHAIN_DATUM_TX: { dap_chain_addr_t l_addr_from; dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *) l_datum->data; - const char *l_main_token = s_tx_get_main_ticker(l_tx, a_net, NULL); - if (l_main_token) { - json_object *l_jobj_main_ticker = json_object_new_string(l_main_token); - if (!l_jobj_main_ticker) { + + int l_ledger_rc = DAP_LEDGER_TX_CHECK_NULL_TX; + char *l_main_ticker = dap_ledger_tx_get_main_ticker(a_net->pub.ledger, l_tx, &l_ledger_rc); + char * l_ledger_rc_str = dap_ledger_tx_check_err_str(l_ledger_rc); + + json_object *l_jobj_main_ticker = json_object_new_string(l_main_ticker ? l_main_ticker : "UNKNOWN"); + json_object *l_jobj_ledger_rc = json_object_new_string(l_ledger_rc_str); + + if (!l_jobj_main_ticker || !l_jobj_ledger_rc) { json_object_put(l_jobj_datum); json_object_put(l_jobj_datums); json_object_put(l_obj_chain); dap_global_db_objs_delete(l_objs, l_objs_count); dap_json_rpc_allocation_error; return; - } - json_object_object_add(l_jobj_datum, "main_ticker", l_jobj_main_ticker); } + + json_object_object_add(l_jobj_datum, "main_ticker", l_jobj_main_ticker); + json_object_object_add(l_jobj_datum, "ledger_rc", l_jobj_ledger_rc); + dap_list_t *l_list_sig_item = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_SIG, NULL); dap_list_t *l_list_in_ems = dap_chain_datum_tx_items_get(l_tx, TX_ITEM_TYPE_IN_EMS, NULL); if (!l_list_sig_item) { @@ -3161,7 +3052,7 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a switch (l_type) { case TX_ITEM_TYPE_OUT: { l_value = ((dap_chain_tx_out_t *) it->data)->header.value; - l_dist_token = l_main_token; + l_dist_token = l_main_ticker; l_dist_addr = &((dap_chain_tx_out_t *) it->data)->addr; } break; @@ -3180,19 +3071,19 @@ void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a l_out_cond_subtype = OUT_COND_TYPE_FEE; } break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_LOCK: { - l_dist_token = l_main_token; + l_dist_token = l_main_ticker; l_out_cond_subtype = OUT_COND_TYPE_STAKE_LOCK; } break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_XCHANGE: { - l_dist_token = l_main_token; + l_dist_token = l_main_ticker; l_out_cond_subtype = OUT_COND_TYPE_XCHANGE; } break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE: { - l_dist_token = l_main_token; + l_dist_token = l_main_ticker; l_out_cond_subtype = OUT_COND_TYPE_POS_DELEGATE; } break; case DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_PAY: { - l_dist_token = l_main_token; + l_dist_token = l_main_ticker; l_out_cond_subtype = OUT_COND_TYPE_PAY; } break; default: diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 72e18b96d6..a66092cda2 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -273,6 +273,9 @@ bool dap_ledger_tx_poa_signed(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_hash_fast_t *a_tx_hash, bool a_from_threshold, dap_list_t **a_list_bound_items, dap_list_t **a_list_tx_out, char **a_main_ticker); +char * dap_ledger_tx_get_main_ticker(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, int *a_ledger_rc); + + /** * Delete all transactions from the cache */ diff --git a/prod_build/targets/android.sh b/prod_build/targets/android.sh index 66d52f2ee5..7c73faa86d 100644 --- a/prod_build/targets/android.sh +++ b/prod_build/targets/android.sh @@ -21,8 +21,14 @@ HERE="$DIR" if [ -z "$ANDROID_CMAKE_TOOLCHAIN" ] then - echo "ANDROID_CMAKE_TOOLCHAIN not defined!" - exit 1 + if [ -z "$ANDROID_NDK_ROOT"] + then + echo "Nor ANDROID_CMAKE_TOOLCHAIN nor ANDROID_NDK_ROOT defined!" + exit 1 + fi + ANDROID_CMAKE_TOOLCHAIN=${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake + echo "ANDROID_CMAKE_TOOLCHAIN not defined, but ANDROID_NDK_ROOT is." + echo "Use ANDROID_CMAKE_TOOLCHAIN as $ANDROID_CMAKE_TOOLCHAIN" fi CMAKE=(cmake -DCMAKE_TOOLCHAIN_FILE=${ANDROID_CMAKE_TOOLCHAIN}) -- GitLab