diff --git a/dap-sdk b/dap-sdk index 72796e25f1a7e792200c24e109b50d94ee7f5fd5..72ddf0b2f2433f056e8d060accf804d5e37c5803 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 72796e25f1a7e792200c24e109b50d94ee7f5fd5 +Subproject commit 72ddf0b2f2433f056e8d060accf804d5e37c5803 diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 5c7aff07ba2e8078c6023164b5d7be16e546ff8e..9bac8e2cf8dce3f8e7f72b86b829cab026e2f59f 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -124,6 +124,14 @@ DAP_STATIC_INLINE size_t s_get_esbocs_message_size(dap_chain_esbocs_message_t *a static dap_chain_esbocs_session_t *s_session_items; +struct precached_key { + uint64_t frequency; + dap_hash_fast_t pkey_hash; + size_t pkey_size; + struct precached_key *prev, *next; + byte_t sign_pkey[]; +}; + typedef struct dap_chain_esbocs_pvt { // Base params dap_enc_key_t *blocks_sign_key; @@ -151,6 +159,8 @@ typedef struct dap_chain_esbocs_pvt { // Decree controoled params uint16_t min_validators_count; bool check_signs_structure; + // Internal cache + struct precached_key *precached_keys; } dap_chain_esbocs_pvt_t; #define PVT(a) ((dap_chain_esbocs_pvt_t *)a->_pvt) @@ -907,7 +917,7 @@ static int s_callback_addr_compare(dap_list_t *a_list_elem, dap_list_t *a_addr_e log_it(L_CRITICAL, "Invalid argument"); return -1; } - return memcmp(&l_validator->signing_addr, l_addr, sizeof(dap_chain_addr_t)); + return memcmp(&l_validator->signing_addr.data.hash_fast, &l_addr->data.hash_fast, sizeof(dap_hash_fast_t)); } static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_validators) @@ -923,7 +933,9 @@ static int s_callback_addr_compare_synced(dap_list_t *a_list_elem, dap_list_t *a log_it(L_CRITICAL, "Invalid argument"); return -1; } - return memcmp(&l_validator->signing_addr, l_addr, sizeof(dap_chain_addr_t)) || !l_validator->is_synced; + return memcmp(&l_validator->signing_addr.data.hash_fast, + &l_addr->data.hash_fast, sizeof(dap_hash_fast_t)) || + !l_validator->is_synced; } static dap_list_t *s_validator_check_synced(dap_chain_addr_t *a_addr, dap_list_t *a_validators) @@ -1999,7 +2011,7 @@ static dap_list_t *s_check_emergency_rights(dap_chain_esbocs_t *a_esbocs, dap_ch { for (dap_list_t *it = PVT(a_esbocs)->emergency_validator_addrs; it; it = it->next) { dap_chain_addr_t *l_authorized_pkey = it->data; - if (dap_chain_addr_compare(l_authorized_pkey, a_signing_addr)) + if (dap_hash_fast_compare(&l_authorized_pkey->data.hash_fast, &a_signing_addr->data.hash_fast)) return it; } return NULL; @@ -2047,7 +2059,7 @@ static bool s_check_signing_rights(dap_chain_esbocs_t *a_esbocs, dap_chain_block return false; } dap_chain_esbocs_validator_t *l_chosen_validator = dap_list_nth(l_allowed_validators_list, l_round_attempt)->data; - if (dap_chain_addr_compare(&l_chosen_validator->signing_addr, a_signing_addr)) + if (dap_hash_fast_compare(&l_chosen_validator->signing_addr.data.hash_fast, &a_signing_addr->data.hash_fast)) return true; return false; } @@ -2704,6 +2716,49 @@ static size_t s_callback_block_sign(dap_chain_cs_blocks_t *a_blocks, dap_chain_b return dap_chain_block_sign_add(a_block_ptr, a_block_size, l_esbocs_pvt->blocks_sign_key); } +static uint64_t s_get_precached_key_hash(struct precached_key **a_precached_keys_list, dap_sign_t *a_source_sign, dap_hash_fast_t *a_result) +{ + bool l_found = false; + struct precached_key *l_key = NULL; + DL_FOREACH(*a_precached_keys_list, l_key) { + if (l_key->pkey_size == a_source_sign->header.sign_pkey_size && + !memcmp(l_key->sign_pkey, dap_sign_get_pkey(a_source_sign, NULL), l_key->pkey_size)) { + l_found = true; + l_key->frequency++; + break; + } + } + if (l_found) { + struct precached_key *l_key_swap = NULL; + DL_FOREACH(*a_precached_keys_list, l_key_swap) { + if (l_key_swap == l_key) + break; + if (l_key_swap->frequency < l_key->frequency) { + struct precached_key *l_swapper = l_key->next; + l_key->next = l_key_swap->next; + l_key_swap->next = l_swapper; + l_swapper = l_key->prev; + l_key->prev = l_key_swap->prev; + l_key_swap->prev = l_swapper; + break; + } + } + if (a_result) + *a_result = l_key->pkey_hash; + return l_key->frequency; + } + struct precached_key *l_key_new = DAP_NEW_SIZE(struct precached_key, + sizeof(struct precached_key) + a_source_sign->header.sign_pkey_size); + 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); + DL_APPEND(*a_precached_keys_list, l_key_new); + if (a_result) + *a_result = l_key_new->pkey_hash; + return 0; +} + static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_t *a_block, size_t a_block_size) { dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(a_blocks); @@ -2759,8 +2814,8 @@ static int s_callback_block_verify(dap_chain_cs_blocks_t *a_blocks, dap_chain_bl l_ret = -3; break; } - dap_chain_addr_t l_signing_addr; - dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, a_blocks->chain->net_id); + dap_chain_addr_t l_signing_addr = { .net_id = a_blocks->chain->net_id }; + s_get_precached_key_hash(&l_esbocs_pvt->precached_keys, l_sign, &l_signing_addr.data.hash_fast); if (!l_esbocs_pvt->poa_mode) { // Compare signature with delegated keys if (!dap_chain_net_srv_stake_key_delegated(&l_signing_addr)) { 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 86c438f747070a3c7bc06c1cca5b3038c9b4b019..9fcb720170da028dd4e2bc6e7943ecb3e867ceb8 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 @@ -361,7 +361,7 @@ void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr dap_chain_net_srv_stake_item_t *l_stake = NULL; bool l_found = false; - HASH_FIND(hh, l_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) l_stake = DAP_NEW_Z(dap_chain_net_srv_stake_item_t); else { @@ -375,9 +375,9 @@ void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr l_stake->tx_hash = *a_stake_tx_hash; l_stake->is_active = true; if (!l_found) - HASH_ADD(hh, l_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_ADD(hh, l_srv_stake->itemlist, signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!dap_hash_fast_is_blank(a_stake_tx_hash)) { - HASH_ADD(ht, l_srv_stake->tx_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake); + HASH_ADD(ht, l_srv_stake->tx_itemlist, tx_hash, sizeof(dap_hash_fast_t), l_stake); dap_chain_datum_tx_t *l_tx = dap_ledger_tx_find_by_hash(a_net->pub.ledger, a_stake_tx_hash); if (l_tx) { dap_chain_tx_out_cond_t *l_cond = dap_chain_datum_tx_out_cond_get(l_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, NULL); @@ -408,7 +408,7 @@ void dap_chain_net_srv_stake_key_invalidate(dap_chain_addr_t *a_signing_addr) dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(a_signing_addr->net_id); dap_return_if_fail(l_srv_stake); dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(hh, l_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (l_stake) { dap_chain_esbocs_remove_validator_from_clusters(l_stake->signing_addr.net_id, &l_stake->node_addr); HASH_DEL(l_srv_stake->itemlist, l_stake); @@ -462,7 +462,7 @@ int dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_signing_addr) dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(a_signing_addr->net_id); dap_return_val_if_fail(l_srv_stake, 0); dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(hh, l_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (l_stake) // public key delegated for this network return l_stake->is_active ? 1 : -1; return 0; @@ -514,7 +514,7 @@ int dap_chain_net_srv_stake_mark_validator_active(dap_chain_addr_t *a_signing_ad dap_chain_net_srv_stake_t *l_srv_stake = s_srv_stake_by_net_id(a_signing_addr->net_id); dap_return_val_if_fail(l_srv_stake, -3); dap_chain_net_srv_stake_item_t *l_stake = NULL; - HASH_FIND(hh, l_srv_stake->itemlist, a_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (l_stake) { // public key delegated for this network l_stake->is_active = a_on_off; return 0; @@ -2015,7 +2015,7 @@ static int s_cli_srv_stake_invalidate(int a_argc, char **a_argv, int a_arg_index return -25; } dap_chain_net_srv_stake_item_t *l_stake; - HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate/pkey hash is not delegated nor this delegating is approved." " Try to invalidate with tx hash instead"); @@ -2522,7 +2522,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate is wrong"); return -20; } - HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr, sizeof(dap_chain_addr_t), l_stake); + HASH_FIND(hh, l_srv_stake->itemlist, &l_signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Specified certificate isn't delegated nor approved"); return -21;