diff --git a/dap-sdk b/dap-sdk index a7b6da64ee24a3aba64dcbbd5f3f356069d853ad..c68d541df022ed50c0daef6367ba6b10e1408c90 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit a7b6da64ee24a3aba64dcbbd5f3f356069d853ad +Subproject commit c68d541df022ed50c0daef6367ba6b10e1408c90 diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 6a31319fb60d1ca52080ae5d5ee4d98351f0f6dd..3981dd2b116ddc8b109e97ae8730915bbe8191d4 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -982,4 +982,4 @@ const char *dap_chain_type_to_str(const dap_chain_type_t a_default_chain_type) default: return "unknown"; } -} +} \ No newline at end of file diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 423e44a0ffe6d66df877c9cc63a2901364dc5e3d..f413be3ff7fc6e4c7e5df2f0c147b4fe0ba1945f 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -491,7 +491,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/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index dea80a38fde2eb5ea503349ceba3f17ed8450ec7..29c1c0100181c26d9ca10b094636cd8280f67336 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -38,6 +38,7 @@ 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_chain_node_cli_cmd.h" +#include "dap_sign.h" #define LOG_TAG "dap_chain_cs_esbocs" @@ -124,6 +125,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 { @@ -2584,8 +2595,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); @@ -2810,7 +2821,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; @@ -2921,7 +2936,7 @@ 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)) + 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); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 0d4530aca7b7bfc399dca1ab21b7c65742334871..3aa7c154b8aebfa38910994f2acf330d88649d17 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -5815,39 +5815,3 @@ dap_chain_token_ticker_str_t dap_ledger_tx_calculate_main_ticker_(dap_ledger_t * *a_ledger_rc = l_rc; return l_ret; } - -/** - * @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_sign_get_sig(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; -} diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 059b3142eefc41c190b515702cda3aa0e7f73538..fd8f05e18278ef7c0d31e90c518249321c0df549 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -457,7 +457,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); #ifdef __cplusplus } 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 6339b4093580089da11d3ecb2794c8f74021e7d2..73fe463d109981f771cd73ad912c6d9687ff4f20 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 @@ -135,17 +135,6 @@ static bool s_tag_check_key_delegation(dap_ledger_t *a_ledger, dap_chain_datum_t return false; } -static dap_pkey_t *s_get_pkey_by_hash_callback(const uint8_t *a_hash) -{ - - dap_chain_net_srv_stake_item_t *l_stake = NULL; - for (dap_list_t *l_srv_stake_list = s_srv_stake_list; l_srv_stake_list && !l_stake; l_srv_stake_list = l_srv_stake_list->next) { - dap_chain_net_srv_stake_t *l_srv_stake = l_srv_stake_list->data; - HASH_FIND(hh, l_srv_stake->itemlist, a_hash, sizeof(dap_hash_fast_t), l_stake); - } - 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 @@ -197,7 +186,6 @@ int dap_chain_net_srv_stake_pos_delegate_init() dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; dap_ledger_service_add(l_uid, "pos_delegate", s_tag_check_key_delegation); 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); return 0; } @@ -278,7 +266,7 @@ static int s_stake_verificator_callback(dap_ledger_t *a_ledger, dap_chain_tx_out 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; \ @@ -1172,9 +1160,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); @@ -1237,9 +1223,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); @@ -1274,9 +1258,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; @@ -1457,9 +1439,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); @@ -2225,8 +2205,9 @@ 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)) { + l_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, "Invalid pkey string format, can't get pkey_full"); @@ -2236,12 +2217,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); @@ -2252,6 +2235,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; } } @@ -2260,25 +2244,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; @@ -2286,13 +2272,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]; @@ -2305,20 +2291,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; @@ -2393,7 +2379,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_node_addr = l_order->node_addr; @@ -2499,15 +2485,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) { - l_pkey = dap_ledger_find_pkey_by_hash(l_net->pub.ledger, &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)); @@ -3557,9 +3541,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; @@ -3621,9 +3603,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; @@ -4156,3 +4136,17 @@ size_t dap_chain_net_srv_stake_get_total_keys(dap_chain_net_id_t a_net_id, size_ } return l_total_count; } + +/** + * @brief search pkey by hash in delegate table + * @param a_net_id net id to search + * @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, dap_hash_fast_t *a_hash) +{ + dap_chain_net_srv_stake_t*l_srv_stake = s_srv_stake_by_net_id(a_net_id); + dap_chain_net_srv_stake_item_t *l_stake = NULL; + 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 3fb0c4e77b259aef36b48a81cb8b34e41756793f..0598e89482123ba586fa31c9395cea25cac9f86b 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 @@ -104,3 +104,4 @@ int dap_chain_net_srv_stake_mark_validator_active(dap_chain_addr_t *a_signing_ad dap_chain_net_srv_stake_item_t *dap_chain_net_srv_stake_check_pkey_hash(dap_chain_net_id_t a_net_id, dap_hash_fast_t *a_pkey_hash); uint256_t dap_chain_net_srv_stake_get_total_weight(dap_chain_net_id_t a_net_id, uint256_t *a_locked_weight); size_t dap_chain_net_srv_stake_get_total_keys(dap_chain_net_id_t a_net_id, size_t *a_in_active_count); +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); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index cc844a27f605128d51836bb2775bf75966ceb13c..b21899511e0ddf09ff27e30e2abd03018a534520 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -2786,3 +2786,34 @@ static dap_list_t *s_callback_get_txs(dap_chain_t *a_chain, size_t a_count, size return l_list; } +/** + * @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_get_pkey_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_pkey_hash) +{ + 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; + 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); + 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))) { + l_ret = dap_pkey_get_from_sign(l_sign); + break; + } + } + } + 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 489595cd33ee8c2c4361e1bcd74faf23205070e6..00c74e85a2caf537461469ed3cf14ad87fe243c6 100644 --- a/modules/type/blocks/include/dap_chain_cs_blocks.h +++ b/modules/type/blocks/include/dap_chain_cs_blocks.h @@ -98,3 +98,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_get_pkey_by_hash(dap_chain_net_t *a_net, dap_hash_fast_t *a_pkey_hash);