From 31641460efb9fbbf4857cb701e8a964f98d39380 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 28 Feb 2025 14:32:57 +0300 Subject: [PATCH 01/10] [*] adopt to use verify sign by pkey --- dap-sdk | 2 +- modules/chain/dap_chain_srv.c | 18 ---------- modules/chain/include/dap_chain_srv.h | 1 - .../consensus/esbocs/dap_chain_cs_esbocs.c | 8 ++++- modules/datum/dap_chain_datum_token.c | 2 +- .../dap_chain_net_srv_stake_pos_delegate.c | 33 ++++++++++--------- .../dap_chain_net_srv_stake_pos_delegate.h | 1 + 7 files changed, 27 insertions(+), 38 deletions(-) diff --git a/dap-sdk b/dap-sdk index 0e5303fbfc..92df7fb264 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 0e5303fbfc0a646d157117d451ac3e98e5a5752d +Subproject commit 92df7fb264f91c34624bff397e1a5f3e9264ae65 diff --git a/modules/chain/dap_chain_srv.c b/modules/chain/dap_chain_srv.c index 7d9d9ce1b3..7b8dda731a 100644 --- a/modules/chain/dap_chain_srv.c +++ b/modules/chain/dap_chain_srv.c @@ -254,24 +254,6 @@ void *dap_chain_srv_get_internal(dap_chain_net_id_t a_net_id, dap_chain_srv_uid_ return l_service ? l_service->service : NULL; } -/** - * @brief get list with all networks by concretic srv_uid - * @param a_srv_uid - * @return ponter to list - */ -dap_list_t *dap_chain_srv_get_internal_all(dap_chain_srv_uid_t a_srv_uid) -{ - dap_list_t *ret = NULL; - struct service_list *l_service_item = s_service_find(a_srv_uid); - if (l_service_item) { - for (dap_list_t *it = l_service_item->networks; it; it = it->next) { - struct network_service *l_service = it->data; - ret = dap_list_append(ret, l_service->service); - } - } - return ret; -} - /** * @brief dap_chain_srv_get_uid_by_name * @param a_client diff --git a/modules/chain/include/dap_chain_srv.h b/modules/chain/include/dap_chain_srv.h index beff734001..e1aa48d28a 100644 --- a/modules/chain/include/dap_chain_srv.h +++ b/modules/chain/include/dap_chain_srv.h @@ -113,7 +113,6 @@ int dap_chain_srv_add(dap_chain_srv_uid_t a_uid, const char *a_name, dap_chain_s int dap_chain_srv_start(dap_chain_net_id_t a_net_id, const char *a_name, dap_config_t *a_config); int dap_chain_srv_delete(dap_chain_srv_uid_t a_uid); void *dap_chain_srv_get_internal(dap_chain_net_id_t a_net_id, dap_chain_srv_uid_t a_srv_id); -dap_list_t *dap_chain_srv_get_internal_all(dap_chain_srv_uid_t a_srv_uid); dap_chain_srv_uid_t dap_chain_srv_get_uid_by_name(const char *a_name); size_t dap_chain_srv_count(dap_chain_net_id_t a_net_id); dap_list_t *dap_chain_srv_list(dap_chain_net_id_t a_net_id); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index c7f2dcfab8..473e8051bd 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -3042,7 +3042,13 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl break; } } - if (!dap_sign_verify(l_sign, l_block, l_block_excl_sign_size)) + dap_pkey_t *l_pkey = NULL;; + if (dap_sign_is_use_pkey_hash(l_sign)) { + dap_hash_fast_t l_pkey_hash = {}; + dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); + l_pkey = dap_chain_net_srv_stake_get_pkey_by_hash(l_esbocs->chain->net_id, &l_pkey_hash); + } + if (!dap_sign_verify_by_pkey(l_sign, l_block, l_block_excl_sign_size, l_pkey)) l_signs_verified_count++; } DAP_DELETE(l_signs); diff --git a/modules/datum/dap_chain_datum_token.c b/modules/datum/dap_chain_datum_token.c index 391965ace4..1ea3e131ee 100644 --- a/modules/datum/dap_chain_datum_token.c +++ b/modules/datum/dap_chain_datum_token.c @@ -490,7 +490,7 @@ dap_sign_t *dap_chain_datum_emission_get_signs(dap_chain_datum_token_emission_t size_t l_count, l_sign_size; for (l_count = 0, l_sign_size = 0; l_count < a_emission->data.type_auth.signs_count; ++l_count) { l_sign_size = dap_sign_get_size(l_sign); - if (!dap_sign_verify_size(l_sign, l_sign_size)) { + if (dap_sign_verify_size(l_sign, l_sign_size)) { break; } l_actual_size += l_sign_size; diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 63a91272c3..c95dd1af00 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -177,21 +177,6 @@ DAP_STATIC_INLINE char *s_get_approved_group(dap_chain_net_t *a_net) return a_net ? dap_strdup_printf("%s.orders.stake.approved", a_net->pub.gdb_groups_prefix) : NULL; } -static dap_pkey_t *s_get_pkey_by_hash_callback(const uint8_t *a_hash) -{ - dap_list_t *l_srv_stake_list = dap_chain_srv_get_internal_all((dap_chain_srv_uid_t) { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }); - dap_chain_net_srv_stake_item_t *l_stake = NULL; - for ( ; l_srv_stake_list && !l_stake; l_srv_stake_list = l_srv_stake_list->next) { - struct srv_stake *l_srv_stake = l_srv_stake_list->data; - if (l_srv_stake->hardfork.in_process) - HASH_FIND(hh, l_srv_stake->hardfork.sandbox, a_hash, sizeof(dap_hash_fast_t), l_stake); - else - HASH_FIND(hh, l_srv_stake->itemlist, a_hash, sizeof(dap_hash_fast_t), l_stake); - } - dap_list_free(l_srv_stake_list); - return l_stake ? l_stake->pkey : NULL; -} - /** * @brief dap_stream_ch_vpn_init Init actions for VPN stream channel * @return 0 if everything is okay, lesser then zero if errors @@ -245,7 +230,6 @@ int dap_chain_net_srv_stake_pos_delegate_init() ); s_debug_more = dap_config_get_item_bool_default(g_config, "stake", "debug_more", s_debug_more); - dap_sign_set_pkey_by_hash_callback(s_get_pkey_by_hash_callback); dap_chain_static_srv_callbacks_t l_callbacks = { .start = s_pos_delegate_start, .delete = s_pos_delegate_delete, .purge = s_pos_delegate_purge, @@ -4461,3 +4445,20 @@ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_ l_srv_stake->hardfork.in_process = a_to_sandbox; return 0; } + +/** + * @brief search pkey by hash in delegate table + * @param a_net_id net id to switch + * @param a_to_temp true - to sandbox, false - to main + * @return if OK - 0, other if error + */ +dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, const uint8_t *a_hash) +{ + struct srv_stake *l_srv_stake = s_srv_stake_by_net_id(a_net_id); + dap_chain_net_srv_stake_item_t *l_stake = NULL; + if (l_srv_stake->hardfork.in_process) + HASH_FIND(hh, l_srv_stake->hardfork.sandbox, a_hash, sizeof(dap_hash_fast_t), l_stake); + else + HASH_FIND(hh, l_srv_stake->itemlist, a_hash, sizeof(dap_hash_fast_t), l_stake); + return l_stake ? l_stake->pkey : NULL; +} diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 3b8c7080e0..5a570a344d 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -84,3 +84,4 @@ int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_lis int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash); int dap_chain_net_srv_stake_hardfork_data_verify(dap_chain_net_t *a_net, dap_hash_fast_t *a_hardfork_decree_hash); int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_sandbox); +dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, const uint8_t *a_hash); \ No newline at end of file -- GitLab From a5b95253cf4765329ce00c4cf8395153d8de5b5d Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Sat, 1 Mar 2025 09:16:29 +0300 Subject: [PATCH 02/10] [*] preapre dap_chain_find_pkey_by_hash --- modules/chain/dap_chain.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 29bc7d426a..2133c2a38c 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -949,3 +949,18 @@ const char *dap_chain_type_to_str(const dap_chain_type_t a_default_chain_type) return "unknown"; } } + +dap_pkey_t *dap_chain_find_pkey_by_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_pkey_hash) +{ + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->active_cell_id, NULL); + uint64_t l_atom_size = 0; + dap_pkey_t *l_ret; + for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size); + l_atom && l_atom_size; + l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_NEXT, &l_atom_size)) { + + + } + a_chain->callback_atom_iter_delete(l_atom_iter); + return l_ret; +} \ No newline at end of file -- GitLab From 8045cb7ecb073eeafafffc675ebf275de3861c42 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Thu, 6 Mar 2025 09:46:08 +0300 Subject: [PATCH 03/10] [*] move pkey searching from ledger to cs_blocks --- modules/ledger/dap_chain_ledger.c | 35 ------------------- modules/ledger/include/dap_chain_ledger.h | 2 -- modules/net/dap_chain_node.c | 2 +- .../dap_chain_net_srv_stake_pos_delegate.c | 21 +++++++---- .../dap_chain_net_srv_stake_pos_delegate.h | 2 +- modules/type/blocks/dap_chain_cs_blocks.c | 26 ++++++++++++++ .../type/blocks/include/dap_chain_cs_blocks.h | 2 ++ 7 files changed, 45 insertions(+), 45 deletions(-) diff --git a/modules/ledger/dap_chain_ledger.c b/modules/ledger/dap_chain_ledger.c index fe17bfa4da..8399a47e98 100644 --- a/modules/ledger/dap_chain_ledger.c +++ b/modules/ledger/dap_chain_ledger.c @@ -1216,41 +1216,6 @@ const dap_chain_datum_tx_t* dap_ledger_tx_find_by_pkey(dap_ledger_t *a_ledger, pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); return l_cur_tx; } -/** - * @brief dap_ledger_find_pkey_by_hash - * @param a_ledger to search - * @param a_pkey_hash - pkey hash - * @return pointer to dap_pkey_t if finded, other - NULL - */ -dap_pkey_t *dap_ledger_find_pkey_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_pkey_hash) -{ - dap_return_val_if_pass(!a_pkey_hash || dap_hash_fast_is_blank(a_pkey_hash), NULL); - - dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - dap_ledger_tx_item_t *l_iter_current, *l_item_tmp; - dap_pkey_t *l_ret = NULL; - pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); - HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp) { - dap_chain_datum_tx_t *l_tx_tmp = l_iter_current->tx; - dap_chain_hash_fast_t *l_tx_hash_tmp = &l_iter_current->tx_hash_fast; - // Get sign item from transaction - dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t*) dap_chain_datum_tx_item_get(l_tx_tmp, NULL, - NULL, TX_ITEM_TYPE_SIG, NULL); - // Get dap_sign_t from item - dap_sign_t *l_sig = dap_chain_datum_tx_item_sig_get_sign(l_tx_sig); - if(l_sig) { - // compare public key in transaction with a_public_key - dap_chain_hash_fast_t l_sign_hash = {}; - dap_sign_get_pkey_hash(l_sig, &l_sign_hash); - if(!memcmp(&l_sign_hash, a_pkey_hash, sizeof(dap_chain_hash_fast_t))) { - l_ret = dap_pkey_get_from_sign(l_sig); - break; - } - } - } - pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); - return l_ret; -} /** * @brief Get all transactions from the cache with the out_cond item diff --git a/modules/ledger/include/dap_chain_ledger.h b/modules/ledger/include/dap_chain_ledger.h index ad3a3a3f26..470d24f4d5 100644 --- a/modules/ledger/include/dap_chain_ledger.h +++ b/modules/ledger/include/dap_chain_ledger.h @@ -496,7 +496,6 @@ bool dap_ledger_cache_enabled(dap_ledger_t *a_ledger); void dap_ledger_set_cache_tx_check_callback(dap_ledger_t *a_ledger, dap_ledger_cache_tx_check_callback_t a_callback); dap_chain_tx_out_cond_t* dap_chain_ledger_get_tx_out_cond_linked_to_tx_in_cond(dap_ledger_t *a_ledger, dap_chain_tx_in_cond_t *a_in_cond); void dap_ledger_load_end(dap_ledger_t *a_ledger); -dap_pkey_t *dap_ledger_find_pkey_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_pkey_hash); //int dap_ledger_decree_create(dap_ledger_t *a_ledger); void dap_ledger_decree_init(dap_ledger_t *a_ledger); @@ -523,7 +522,6 @@ dap_ledger_hardfork_anchors_t *dap_ledger_anchors_aggregate(dap_ledger_t *a_ledg uint256_t dap_ledger_coin_get_uncoloured_value(dap_ledger_t *a_ledger, dap_hash_fast_t *a_voting_hash, dap_hash_fast_t *a_tx_hash, int a_out_idx); dap_list_t *dap_ledger_tx_get_trackers(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash, uint32_t a_out_idx); void dap_ledger_tx_clear_colour(dap_ledger_t *a_ledger, dap_hash_fast_t *a_tx_hash); -dap_pkey_t *dap_ledger_find_pkey_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_pkey_hash); dap_list_t *dap_ledger_decrees_get_by_type(dap_ledger_t *a_ledger, int a_type); #ifdef __cplusplus diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 8c7a2fa1cd..48af3f9cef 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -1267,7 +1267,7 @@ int dap_chain_node_cli_cmd_values_parse_net_chain_for_json(json_object *a_json_a return DAP_DELETE(l_str_reply), DAP_CHAIN_NODE_CLI_CMD_VALUES_PARSE_NET_CHAIN_ERR_CHAIN_NOT_FOUND; } } else if (a_default_chain_type != CHAIN_TYPE_INVALID) { - if (!( *a_chain = dap_chain_net_get_default_chain_by_chain_type(*a_net, a_default_chain_type) )) + if (( *a_chain = dap_chain_net_get_default_chain_by_chain_type(*a_net, a_default_chain_type) )) return 0; else { dap_json_rpc_error_add(a_json_arr_reply, diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index c95dd1af00..6d97c5b3b8 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -2340,8 +2340,13 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, l_pkey = dap_pkey_get_from_str(l_pkey_full_str); } else { dap_hash_fast_t l_pkey_hash = {}; - if (!dap_chain_hash_fast_from_str(l_pkey_str, &l_pkey_hash)) - l_pkey = dap_ledger_find_pkey_by_hash(l_net->pub.ledger, &l_pkey_hash); + if (!dap_chain_hash_fast_from_str(l_pkey_str, &l_pkey_hash)) { + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); + if (!l_chain) + l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX); + if (l_chain) + l_pkey = dap_chain_cs_blocks_find_pkey_by_hash(l_chain, &l_pkey_hash); + } } if (!l_pkey) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR, "Invalid pkey string format"); @@ -2624,7 +2629,11 @@ static int s_cli_srv_stake_pkey_show(int a_argc, char **a_argv, int a_arg_index, HASH_FIND(hh, l_srv_stake->itemlist, &l_pkey_hash, sizeof(dap_hash_fast_t), l_stake); dap_pkey_t *l_pkey = l_stake ? l_stake->pkey : NULL; if (!l_pkey) { - l_pkey = dap_ledger_find_pkey_by_hash(l_net->pub.ledger, &l_pkey_hash); + dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); + if (!l_chain) + l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX); + if (l_chain) + l_pkey =dap_chain_cs_blocks_find_pkey_by_hash(l_chain, &l_pkey_hash); } if (!l_pkey) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR, "pkey not finded"); @@ -4449,10 +4458,10 @@ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_ /** * @brief search pkey by hash in delegate table * @param a_net_id net id to switch - * @param a_to_temp true - to sandbox, false - to main - * @return if OK - 0, other if error + * @param a_hash hash to search + * @return pointer to pkey, NULL if error */ -dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, const uint8_t *a_hash) +dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hash) { struct srv_stake *l_srv_stake = s_srv_stake_by_net_id(a_net_id); dap_chain_net_srv_stake_item_t *l_stake = NULL; diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 5a570a344d..c4805f84d3 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -84,4 +84,4 @@ int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_lis int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hardfork_decree_hash); int dap_chain_net_srv_stake_hardfork_data_verify(dap_chain_net_t *a_net, dap_hash_fast_t *a_hardfork_decree_hash); int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_sandbox); -dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, const uint8_t *a_hash); \ No newline at end of file +dap_pkey_t *dap_chain_net_srv_stake_get_pkey_by_hash(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_hash); \ No newline at end of file diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 253fb58de7..794d895ff9 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -2907,3 +2907,29 @@ dap_chain_cs_blocks_hardfork_fees_t *dap_chain_cs_blocks_fees_aggregate(dap_chai } return ret; } + +/** + * @brief search pkey in block signs + * @param a_chain chain to search + * @param a_pkey_hash - pkey hash + * @return pointer to dap_pkey_t if finded, other - NULL + */ +dap_pkey_t *dap_chain_cs_blocks_find_pkey_by_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_pkey_hash) +{ + dap_return_val_if_pass(!a_chain || !a_pkey_hash, NULL); + dap_pkey_t *l_ret = NULL; + dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { + for (size_t i = 0; i < l_block_cache->sign_count; i++) { + dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); + dap_chain_hash_fast_t l_sign_hash = {}; + dap_sign_get_pkey_hash(l_sign, &l_sign_hash); + if(!memcmp(&l_sign_hash, a_pkey_hash, sizeof(dap_chain_hash_fast_t))) { + l_ret = dap_pkey_get_from_sign(l_sign); + break; + } + } + } + return l_ret; +} + diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h index 697270d7b3..8b9f794592 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -102,3 +102,5 @@ DAP_STATIC_INLINE char *dap_chain_cs_blocks_get_reward_group(const char *a_net_n { return dap_strdup_printf("local.%s.rewards", a_net_name); } + +dap_pkey_t *dap_chain_cs_blocks_find_pkey_by_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_pkey_hash); -- GitLab From 20f96cf10d5c9e13bf88069791622d0899062601 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Thu, 6 Mar 2025 10:33:27 +0300 Subject: [PATCH 04/10] [*] fix leaks --- modules/node-cli/dap_chain_node_cli_cmd.c | 4 +- .../dap_chain_net_srv_stake_pos_delegate.c | 61 +++++++------------ modules/type/blocks/dap_chain_cs_blocks.c | 12 ++-- .../type/blocks/include/dap_chain_cs_blocks.h | 2 +- 4 files changed, 32 insertions(+), 47 deletions(-) diff --git a/modules/node-cli/dap_chain_node_cli_cmd.c b/modules/node-cli/dap_chain_node_cli_cmd.c index bd940670a7..c75a7c2ca6 100644 --- a/modules/node-cli/dap_chain_node_cli_cmd.c +++ b/modules/node-cli/dap_chain_node_cli_cmd.c @@ -5897,9 +5897,7 @@ static char *s_decree_policy_put(dap_chain_datum_decree_t *a_decree, dap_chain_n { size_t l_decree_size = dap_chain_datum_decree_get_size(a_decree); dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_DECREE, a_decree, l_decree_size); - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); if (!l_chain) { log_it(L_ERROR, "No chain supported decree datum type"); return NULL; diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 6d97c5b3b8..1f8bfb4211 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -1210,9 +1210,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { log_it(L_ERROR, "No chain supported anchor datum type"); DAP_DEL_Z(l_decree); @@ -1269,9 +1267,7 @@ static dap_chain_datum_decree_t *s_decree_pkey_update(dap_chain_net_t *a_net, da l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { log_it(L_ERROR, "No chain supported anchor datum type"); DAP_DEL_Z(l_decree); @@ -1306,9 +1302,7 @@ static char *s_stake_decree_put(dap_chain_datum_decree_t *a_decree, dap_chain_ne { size_t l_decree_size = dap_chain_datum_decree_get_size(a_decree); dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_DECREE, a_decree, l_decree_size); - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_DECREE); if (!l_chain) { log_it(L_ERROR, "No chain supported decree datum type"); return NULL; @@ -1487,9 +1481,7 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne l_decree->header.ts_created = dap_time_now(); l_decree->header.type = DAP_CHAIN_DATUM_DECREE_TYPE_COMMON; l_decree->header.common_decree_params.net_id = a_net->pub.id; - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { log_it(L_ERROR, "No chain supported anchor datum type"); DAP_DEL_Z(l_decree); @@ -2341,11 +2333,7 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, } else { dap_hash_fast_t l_pkey_hash = {}; if (!dap_chain_hash_fast_from_str(l_pkey_str, &l_pkey_hash)) { - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX); - if (l_chain) - l_pkey = dap_chain_cs_blocks_find_pkey_by_hash(l_chain, &l_pkey_hash); + l_pkey = dap_chain_cs_blocks_get_pkey_by_hash(l_net, &l_pkey_hash); } } if (!l_pkey) { @@ -2356,12 +2344,14 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (l_pkey->header.type.type != dap_pkey_type_from_sign_type(l_type).type) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR, "pkey and sign types is different"); dap_enc_key_delete(l_enc_key); + DAP_DELETE(l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR; } dap_chain_hash_fast_t l_hash_public_key = {0}; if (!dap_pkey_get_hash(l_pkey, &l_hash_public_key)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR, "Invalid pkey hash format"); dap_enc_key_delete(l_enc_key); + DAP_DELETE(l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR; } dap_chain_addr_fill(&l_signing_addr, l_type, &l_hash_public_key, l_net->pub.id); @@ -2372,6 +2362,7 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (dap_chain_node_addr_from_str(&l_node_addr, l_node_addr_str)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNRECOGNIZED_ADDR_ERR, "Unrecognized node addr %s", l_node_addr_str); dap_enc_key_delete(l_enc_key); + DAP_DELETE(l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_UNRECOGNIZED_ADDR_ERR; } } @@ -2380,25 +2371,27 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (!l_order) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_ORDER_ERR, "Specified order not found"); dap_enc_key_delete(l_enc_key); + DAP_DELETE(l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_ORDER_ERR; } if (l_order->direction == SERV_DIR_BUY) { // Staker order if (!l_cert_str) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR, "Command 'delegate' requires parameter -cert with this order type"); dap_enc_key_delete(l_enc_key); + DAP_DELETE(l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_PARAM_ERR; } if (l_order->ext_size != 0) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR, "Specified order has invalid size"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_ORDER_SIZE_ERR; } l_prev_tx = dap_ledger_tx_find_by_hash(l_net->pub.ledger, &l_order->tx_cond_hash); if (!l_prev_tx) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_TX_IN_LEDGER_ERR, "The order's conditional transaction not found in ledger"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_NO_TX_IN_LEDGER_ERR; } int l_out_num = 0; @@ -2406,13 +2399,13 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (!l_cond) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_TYPE_ERR, "The order's conditional transaction has invalid type"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_TYPE_ERR; } if (dap_ledger_tx_hash_is_used_out_item(l_net->pub.ledger, &l_order->tx_cond_hash, l_out_num, NULL)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TX_ALREADY_SENT_ERR, "The order's conditional transaction is already spent"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_TX_ALREADY_SENT_ERR; } char l_delegated_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; @@ -2425,20 +2418,20 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (l_cond->tsd_size != dap_chain_datum_tx_item_out_cond_create_srv_stake_get_tsd_size(true, 0)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_FORMAT_ERR, "The order's conditional transaction has invalid format"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_COND_TX_FORMAT_ERR; } if (compare256(l_cond->header.value, l_order->price)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_DIF_VALUE_ERR, "The order's conditional transaction has different value"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_DIF_VALUE_ERR; } if (!dap_chain_addr_is_blank(&l_cond->subtype.srv_stake_pos_delegate.signing_addr) || l_cond->subtype.srv_stake_pos_delegate.signer_node_addr.uint64) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_NO_ADDR_OR_KEY_ERR, "The order's conditional transaction gas not blank address or key"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_COND_TX_NO_ADDR_OR_KEY_ERR; } l_value = l_order->price; @@ -2512,7 +2505,7 @@ static int s_cli_srv_stake_delegate(int a_argc, char **a_argv, int a_arg_index, if (dap_strcmp(l_order->price_ticker, l_delegated_ticker_str)) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_ORDER_ERR, "Specified order is invalid"); dap_enc_key_delete(l_enc_key); - DAP_DELETE(l_order); + DAP_DEL_MULTY(l_order, l_pkey); return DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_ORDER_ERR; } l_add_hash_to_gdb = true; @@ -2627,19 +2620,13 @@ static int s_cli_srv_stake_pkey_show(int a_argc, char **a_argv, int a_arg_index, // search in curren dap_chain_net_srv_stake_item_t *l_stake = NULL; HASH_FIND(hh, l_srv_stake->itemlist, &l_pkey_hash, sizeof(dap_hash_fast_t), l_stake); - dap_pkey_t *l_pkey = l_stake ? l_stake->pkey : NULL; - if (!l_pkey) { - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TX); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX); - if (l_chain) - l_pkey =dap_chain_cs_blocks_find_pkey_by_hash(l_chain, &l_pkey_hash); - } + dap_pkey_t *l_pkey = (l_stake && l_stake->pkey) ? DAP_DUP_SIZE(l_stake->pkey, dap_pkey_get_size(l_stake->pkey)) : dap_chain_cs_blocks_get_pkey_by_hash(l_net, &l_pkey_hash); if (!l_pkey) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_DELEGATE_INVALID_PKEY_ERR, "pkey not finded"); return -25; } const char *l_pkey_str = dap_pkey_to_str(l_pkey, a_hash_out_type); + DAP_DELETE(l_pkey); json_object* l_json_obj_pkey = json_object_new_object(); json_object_object_add(l_json_obj_pkey, "hash", json_object_new_string(l_pkey_hash_str)); json_object_object_add(l_json_obj_pkey, "pkey", json_object_new_string(l_pkey_str)); @@ -3688,9 +3675,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR, "No chain supported anchor datum type"); return DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR; @@ -3752,9 +3737,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR, "Network %s not found", l_net_str); return DAP_CHAIN_NODE_CLI_SRV_STAKE_NET_ERR; } - dap_chain_t *l_chain = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); - if (!l_chain) - l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_ANCHOR); if (!l_chain) { dap_json_rpc_error_add(*a_json_arr_reply, DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR, "No chain supported anchor datum type"); return DAP_CHAIN_NODE_CLI_SRV_STAKE_ANCHOR_NOT_SUPPORT_ERR; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 794d895ff9..f5a99f74c2 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -2914,12 +2914,15 @@ dap_chain_cs_blocks_hardfork_fees_t *dap_chain_cs_blocks_fees_aggregate(dap_chai * @param a_pkey_hash - pkey hash * @return pointer to dap_pkey_t if finded, other - NULL */ -dap_pkey_t *dap_chain_cs_blocks_find_pkey_by_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_pkey_hash) +dap_pkey_t *dap_chain_cs_blocks_get_pkey_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_pkey_hash) { - dap_return_val_if_pass(!a_chain || !a_pkey_hash, NULL); + dap_return_val_if_pass(!a_pkey_hash, NULL); + dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); + if (!l_chain || !DAP_CHAIN_CS_BLOCKS(l_chain) || !PVT(DAP_CHAIN_CS_BLOCKS(l_chain))) + return NULL; dap_pkey_t *l_ret = NULL; - dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); - for (dap_chain_block_cache_t *l_block_cache = PVT(l_blocks)->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { + pthread_rwlock_rdlock(&PVT(DAP_CHAIN_CS_BLOCKS(l_chain))->rwlock); + for (dap_chain_block_cache_t *l_block_cache = PVT(DAP_CHAIN_CS_BLOCKS(l_chain))->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { for (size_t i = 0; i < l_block_cache->sign_count; i++) { dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); dap_chain_hash_fast_t l_sign_hash = {}; @@ -2930,6 +2933,7 @@ dap_pkey_t *dap_chain_cs_blocks_find_pkey_by_hash(dap_chain_t *a_chain, dap_hash } } } + pthread_rwlock_unlock(&PVT(DAP_CHAIN_CS_BLOCKS(l_chain))->rwlock); return l_ret; } diff --git a/modules/type/blocks/include/dap_chain_cs_blocks.h b/modules/type/blocks/include/dap_chain_cs_blocks.h index 8b9f794592..9d9b16d701 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -103,4 +103,4 @@ DAP_STATIC_INLINE char *dap_chain_cs_blocks_get_reward_group(const char *a_net_n return dap_strdup_printf("local.%s.rewards", a_net_name); } -dap_pkey_t *dap_chain_cs_blocks_find_pkey_by_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_pkey_hash); +dap_pkey_t *dap_chain_cs_blocks_get_pkey_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_pkey_hash); -- GitLab From b113efc5bdd6cae63dff0deafb81b13157a5716f Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Thu, 6 Mar 2025 12:08:09 +0300 Subject: [PATCH 05/10] [*] remove unsused code --- modules/chain/dap_chain.c | 15 --------------- .../stake/dap_chain_net_srv_stake_pos_delegate.c | 2 +- modules/type/blocks/dap_chain_cs_blocks.c | 2 ++ 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 2133c2a38c..c654260970 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -948,19 +948,4 @@ const char *dap_chain_type_to_str(const dap_chain_type_t a_default_chain_type) default: return "unknown"; } -} - -dap_pkey_t *dap_chain_find_pkey_by_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_pkey_hash) -{ - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->active_cell_id, NULL); - uint64_t l_atom_size = 0; - dap_pkey_t *l_ret; - for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size); - l_atom && l_atom_size; - l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_NEXT, &l_atom_size)) { - - - } - a_chain->callback_atom_iter_delete(l_atom_iter); - return l_ret; } \ No newline at end of file diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 1f8bfb4211..3864d682ec 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -4440,7 +4440,7 @@ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_ /** * @brief search pkey by hash in delegate table - * @param a_net_id net id to switch + * @param a_net_id net id to search * @param a_hash hash to search * @return pointer to pkey, NULL if error */ diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index f5a99f74c2..cd81f52ed2 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -2925,6 +2925,8 @@ dap_pkey_t *dap_chain_cs_blocks_get_pkey_by_hash(dap_chain_net_t *a_net, dap_has for (dap_chain_block_cache_t *l_block_cache = PVT(DAP_CHAIN_CS_BLOCKS(l_chain))->blocks; l_block_cache; l_block_cache = l_block_cache->hh.next) { for (size_t i = 0; i < l_block_cache->sign_count; i++) { dap_sign_t *l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); + if (dap_sign_is_use_pkey_hash(l_sign)) + continue; dap_chain_hash_fast_t l_sign_hash = {}; dap_sign_get_pkey_hash(l_sign, &l_sign_hash); if(!memcmp(&l_sign_hash, a_pkey_hash, sizeof(dap_chain_hash_fast_t))) { -- GitLab From 0da4d9b98903d77d34764b60a40e8f42c736a68c Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 7 Mar 2025 08:03:08 +0000 Subject: [PATCH 06/10] [*] fix sign verify error --- dap-sdk | 2 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 33 +++++++++++-------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/dap-sdk b/dap-sdk index 9269e68a34..f7f91c6fbb 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 9269e68a34810db94f5c22606411c80d4ee9af57 +Subproject commit f7f91c6fbb472cbfbbeb38dfaad29eef07f9426e diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 5c689d0a4b..86a4e16466 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -126,6 +126,16 @@ DAP_STATIC_INLINE size_t s_get_esbocs_message_size(dap_chain_esbocs_message_t *a return sizeof(*a_message) + a_message->hdr.sign_size + a_message->hdr.message_size; } +static dap_pkey_t *s_get_pkey(dap_sign_t *a_sign, dap_chain_net_id_t a_net_id) +{ + if (dap_sign_is_use_pkey_hash(a_sign)) { + dap_hash_fast_t l_pkey_hash = {}; + dap_sign_get_pkey_hash(a_sign, &l_pkey_hash); + return dap_chain_net_srv_stake_get_pkey_by_hash(a_net_id, &l_pkey_hash); + } + return NULL; +} + static dap_chain_esbocs_session_t *s_session_items; struct precached_key { @@ -2677,8 +2687,8 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain } // check candidate's sign size_t l_offset = dap_chain_block_get_sign_offset(l_store->candidate, l_store->candidate_size); - int l_sign_verified = dap_sign_verify(l_candidate_sign, l_store->candidate, - l_offset + sizeof(l_store->candidate->hdr)); + int l_sign_verified = dap_sign_verify_by_pkey(l_candidate_sign, l_store->candidate, + l_offset + sizeof(l_store->candidate->hdr), s_get_pkey(l_candidate_sign, l_session->chain->net_id)); if (l_sign_verified != 0) { if (!l_candidate_hash_str) l_candidate_hash_str = dap_chain_hash_fast_to_str_static(l_candidate_hash); @@ -2819,10 +2829,7 @@ static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_mess NODE_ADDR_FP_ARGS_S(l_validator->node_addr)); l_message->hdr.recv_addr = l_validator->node_addr; l_message->hdr.sign_size = 0; - uint32_t l_hash_type = DAP_SIGN_HASH_TYPE_DEFAULT; - if (dap_chain_policy_activated(DAP_CHAIN_POLICY_PUBLIC_KEY_HASH_SIGN_VALIDATORS, a_session->chain->net_id.uint64)) - l_hash_type = DAP_SIGN_ADD_PKEY_HASHING_FLAG(l_hash_type); - dap_sign_t *l_sign = dap_sign_create_with_hash_type( PVT(a_session->esbocs)->blocks_sign_key, l_message, l_message_size, l_hash_type); + dap_sign_t *l_sign = dap_sign_create( PVT(a_session->esbocs)->blocks_sign_key, l_message, l_message_size); size_t l_sign_size = dap_sign_get_size(l_sign); l_message->hdr.sign_size = l_sign_size; dap_chain_esbocs_message_t *l_message_signed = DAP_REALLOC_RET_IF_FAIL(l_message, l_message_size + l_sign_size, l_sign, l_message); @@ -2907,7 +2914,11 @@ static uint64_t s_get_precached_key_hash(dap_list_t **a_precached_keys_list, dap l_key_new->pkey_size = a_source_sign->header.sign_pkey_size; l_key_new->frequency = 0; memcpy(l_key_new->sign_pkey, dap_sign_get_pkey(a_source_sign, NULL), l_key_new->pkey_size); - dap_sign_get_pkey_hash(a_source_sign, &l_key_new->pkey_hash); + if (DAP_SIGN_GET_PKEY_HASHING_FLAG(a_source_sign->header.hash_type)) { + memcpy(&l_key_new->pkey_hash, l_key_new->sign_pkey, sizeof(dap_hash_fast_t)); + } else { + dap_sign_get_pkey_hash(a_source_sign, &l_key_new->pkey_hash); + } *a_precached_keys_list = dap_list_append(*a_precached_keys_list, l_key_new); if (a_result) *a_result = l_key_new->pkey_hash; @@ -3059,13 +3070,7 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl break; } } - dap_pkey_t *l_pkey = NULL;; - if (dap_sign_is_use_pkey_hash(l_sign)) { - dap_hash_fast_t l_pkey_hash = {}; - dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); - l_pkey = dap_chain_net_srv_stake_get_pkey_by_hash(l_esbocs->chain->net_id, &l_pkey_hash); - } - if (!dap_sign_verify_by_pkey(l_sign, l_block, l_block_excl_sign_size, l_pkey)) + if (!dap_sign_verify_by_pkey(l_sign, l_block, l_block_excl_sign_size, s_get_pkey(l_sign, l_esbocs->chain->net_id))) l_signs_verified_count++; } DAP_DELETE(l_signs); -- GitLab From 73274eb5492315969c447e4b43225acff0e07453 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 7 Mar 2025 08:09:27 +0000 Subject: [PATCH 07/10] [*] fix pipe --- modules/consensus/esbocs/dap_chain_cs_esbocs.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 86a4e16466..0d548a8f5e 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -37,6 +37,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_chain_net_srv_stake_pos_delegate.h" #include "dap_chain_ledger.h" #include "dap_cli_server.h" +#include "dap_chain_node_cli_cmd.h" +#include "dap_sign.h" #define LOG_TAG "dap_chain_cs_esbocs" -- GitLab From 6a32cbdb591da4f9c624d64b4873948f0886a338 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Mon, 10 Mar 2025 07:27:17 +0000 Subject: [PATCH 08/10] [*] fix verificator error --- modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 0df6ca8f0c..96c9c5a3b3 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -274,7 +274,7 @@ static int s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_datum_ log_it(L_WARNING, "Conditional out and conditional in have different headers"); \ return -3; \ } \ - if (l_tx_new_cond->tsd_size != a_cond->tsd_size || \ + if (l_tx_new_cond->tsd_size < a_cond->tsd_size || \ memcmp(l_tx_new_cond->tsd, a_cond->tsd, a_cond->tsd_size)) { \ log_it(L_WARNING, "Conditional out and conditional in have different TSD sections"); \ return -4; \ -- GitLab From a104a6e42e12d7d2530f299bff505a2d6eb05edc Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Mon, 10 Mar 2025 07:31:24 +0000 Subject: [PATCH 09/10] [*] subs update --- dap-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dap-sdk b/dap-sdk index f7f91c6fbb..2821149a34 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit f7f91c6fbb472cbfbbeb38dfaad29eef07f9426e +Subproject commit 2821149a34a8a6fa6f545866b824e52e7da02d7f -- GitLab From 99a110e76f6269608b3ed6870f9e1e5318c42b89 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Fri, 14 Mar 2025 17:44:10 +0300 Subject: [PATCH 10/10] [*] subs update --- dap-sdk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dap-sdk b/dap-sdk index c49c23d128..84afcccb3f 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit c49c23d1280a576fd77a8f37b0738f0ee7684cf9 +Subproject commit 84afcccb3f8de976ba0029801844421406ff83a7 -- GitLab