diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 4dc559894592499095395a00abec215e4734c9a6..11b2676516057ba45213e49ce0022d758417d88a 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -3032,7 +3032,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t // sum of values in 'out' items from the previous transactions dap_chain_ledger_tokenizer_t *l_values_from_prev_tx = NULL, *l_values_from_cur_tx = NULL, *l_value_cur = NULL, *l_tmp = NULL, *l_res = NULL; - char *l_token = NULL, *l_main_ticker = NULL; + const char *l_token = NULL, *l_main_ticker = NULL; dap_chain_ledger_token_item_t * l_token_item = NULL; dap_chain_hash_fast_t *l_emission_hash = NULL; @@ -3328,6 +3328,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t l_tx_prev_out_cond = (dap_chain_tx_out_cond_t *)l_tx_prev_out; if (l_tx_prev_out_cond->header.subtype != DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE) l_main_ticker = l_token; + else + l_main_ticker = l_ledger_pvt->net_native_ticker; bool l_owner = false; l_owner = dap_sign_match_pkey_signs(l_prev_sign,l_sign); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 2db53c41ef7ca4a99212f6f455d32dbe28ae1ea2..3f19d1919044d8ef002a0e16f3135b7aa0beb446 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -86,6 +86,7 @@ typedef struct dap_chain_esbocs_pvt { // Validators section bool poa_mode; uint16_t min_validators_count; + uint16_t start_validators_min; // Debug flag bool debug; // Round params @@ -149,7 +150,8 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_esbocs_pvt->round_attempt_timeout = dap_config_get_item_uint16_default(a_chain_cfg, "esbocs", "round_attempt_timeout", 10); int l_ret = 0; - l_esbocs_pvt->min_validators_count = dap_config_get_item_uint16(a_chain_cfg, "esbocs", "min_validators_count"); + l_esbocs_pvt->start_validators_min = l_esbocs_pvt->min_validators_count = + dap_config_get_item_uint16(a_chain_cfg, "esbocs", "min_validators_count"); if (!l_esbocs_pvt->min_validators_count) { l_ret = -1; goto lb_err; @@ -185,13 +187,14 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) goto lb_err; } log_it(L_MSG, "add validator addr:"NODE_ADDR_FP_STR"", NODE_ADDR_FP_ARGS_S(l_signer_node_addr)); - if (l_esbocs_pvt->poa_mode) { // auth by certs in PoA mode - dap_chain_esbocs_validator_t *l_validator = DAP_NEW_Z(dap_chain_esbocs_validator_t); - l_validator->signing_addr = l_signing_addr; - l_validator->node_addr = l_signer_node_addr; - l_validator->weight = uint256_1; - l_esbocs_pvt->poa_validators = dap_list_append(l_esbocs_pvt->poa_validators, l_validator); - } else { + + dap_chain_esbocs_validator_t *l_validator = DAP_NEW_Z(dap_chain_esbocs_validator_t); + l_validator->signing_addr = l_signing_addr; + l_validator->node_addr = l_signer_node_addr; + l_validator->weight = uint256_1; + l_esbocs_pvt->poa_validators = dap_list_append(l_esbocs_pvt->poa_validators, l_validator); + + if (!l_esbocs_pvt->poa_mode) { // auth certs in PoA mode wiil be first PoS validators keys dap_hash_fast_t l_stake_tx_hash = {}; dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); uint256_t l_weight = dap_chain_net_srv_stake_get_allowed_min_value(); @@ -345,7 +348,19 @@ static void s_callback_set_min_validators_count(dap_chain_t *a_chain, uint16_t a dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_esbocs_t *l_esbocs = DAP_CHAIN_ESBOCS(l_blocks); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); - l_esbocs_pvt->min_validators_count = a_new_value; + if (a_new_value) + l_esbocs_pvt->min_validators_count = a_new_value; + else { + dap_hash_fast_t l_stake_tx_hash = {}; + dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + uint256_t l_weight = dap_chain_net_srv_stake_get_allowed_min_value(); + for (dap_list_t *it = l_esbocs_pvt->poa_validators; it; it = it->next) { + dap_chain_esbocs_validator_t *l_validator = it->data; + dap_chain_net_srv_stake_key_delegate(l_net, &l_validator->signing_addr, &l_stake_tx_hash, + l_weight, &l_validator->node_addr); + } + l_esbocs_pvt->min_validators_count = l_esbocs_pvt->start_validators_min; + } } static dap_list_t *s_get_validators_list(dap_chain_esbocs_session_t *a_session, uint64_t a_skip_count) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 6ecae51021edac29b2e63fb84cffd604c5ecd846..16cc8769ff14f475130d6a8b3b33a47bd758f94d 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1571,11 +1571,14 @@ const char* dap_chain_net_get_type(dap_chain_t *l_chain) static void s_chain_net_ledger_cache_reload(dap_chain_net_t *l_net) { dap_chain_ledger_purge(l_net->pub.ledger, false); - dap_chain_net_srv_stake_cache_purge(l_net); + dap_chain_net_srv_stake_purge(l_net); + dap_chain_net_decree_purge(l_net); dap_chain_t *l_chain = NULL; DL_FOREACH(l_net->pub.chains, l_chain) { if (l_chain->callback_purge) l_chain->callback_purge(l_chain); + if (l_chain->callback_set_min_validators_count) + l_chain->callback_set_min_validators_count(l_chain, 0); dap_chain_ledger_set_fee(l_net->pub.ledger, uint256_0, c_dap_chain_addr_blank); dap_chain_load_all(l_chain); } @@ -1607,7 +1610,7 @@ static bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net) return false; } // create file, if it not presented. If file exists, ledger cache operation is stopped - char *l_cache_file = dap_strdup_printf( "%s/%s.cache", l_cache_dir, "e0fee993-54b7-4cbb-be94-f633cc17853f"); + char *l_cache_file = dap_strdup_printf( "%s/%s.cache", l_cache_dir, "01df6e58-4eb7-43a3-8c6b-252bcc3d05d4"); DAP_DELETE(l_cache_dir); if (dap_file_simple_test(l_cache_file)) { log_it(L_WARNING, "Cache file '%s' already exists", l_cache_file); @@ -2568,13 +2571,13 @@ int s_net_load(dap_chain_net_t *a_net) } closedir(l_chains_dir); - dap_chain_net_srv_stake_load_cache(l_net); // reload ledger cache at once if (s_chain_net_reload_ledger_cache_once(l_net)) { log_it(L_WARNING,"Start one time ledger cache reloading"); dap_chain_ledger_purge(l_net->pub.ledger, false); - dap_chain_net_srv_stake_cache_purge(l_net); - } + dap_chain_net_srv_stake_purge(l_net); + } else + dap_chain_net_srv_stake_load_cache(l_net); // sort list with chains names by priority l_prior_list = dap_list_sort(l_prior_list, callback_compare_prioritity_list); diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index 3de84a47fb9a899edf809c26fd426a54883aa5e1..5d7402d711339ae71fdb3d28ab7b3464a2616394 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -106,10 +106,21 @@ int dap_chain_net_decree_deinit(dap_chain_net_t *a_net) dap_list_free_full(l_decree->pkeys, NULL); DAP_DELETE(l_decree->fee_addr); DAP_DELETE(l_decree); - + struct decree_hh *l_decree_hh, *l_tmp; + HASH_ITER(hh, s_decree_hh, l_decree_hh, l_tmp) { + HASH_DEL(s_decree_hh, l_decree_hh); + DAP_DELETE(l_decree_hh->decree); + DAP_DELETE(l_decree_hh); + } return 0; } +void dap_chain_net_decree_purge(dap_chain_net_t *a_net) +{ + dap_chain_net_decree_deinit(a_net); + dap_chain_net_decree_init(a_net); +} + int s_decree_verify_tsd(dap_chain_datum_decree_t * a_decree, dap_chain_net_t *a_net) { int ret_val = 0; diff --git a/modules/net/include/dap_chain_net_decree.h b/modules/net/include/dap_chain_net_decree.h index b4223a6181e33b9b1edbfa813c5b8f743e6e087f..18cbaf32dee98b403c83fb4e05b169435d299e6b 100644 --- a/modules/net/include/dap_chain_net_decree.h +++ b/modules/net/include/dap_chain_net_decree.h @@ -37,6 +37,8 @@ typedef struct decree_params { int dap_chain_net_decree_init(dap_chain_net_t *a_net); int dap_chain_net_decree_deinit(dap_chain_net_t *a_net); +void dap_chain_net_decree_purge(dap_chain_net_t *a_net); + int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain); int dap_chain_net_decree_verify(dap_chain_datum_decree_t *a_decree, dap_chain_net_t *a_net, size_t a_data_size, dap_hash_fast_t *a_decree_hash); int dap_chain_net_decree_load(dap_chain_datum_decree_t * a_decree, dap_chain_t *a_chain); diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index 157f380f02b398239b9ce96f23961fbde0159be5..dfca751164a7812f52650d338d20bbe018ee9b14 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -93,9 +93,13 @@ int dap_chain_net_srv_stake_pos_delegate_init() return 0; } -void dap_chain_net_srv_stake_pos_delegate_deinit() +void s_stake_ht_clear() { dap_chain_net_srv_stake_item_t *l_stake, *l_tmp; + HASH_ITER(ht, s_srv_stake->tx_itemlist, l_stake, l_tmp) { + // Clang bug at this, l_stake should change at every loop cycle + HASH_DELETE(ht, s_srv_stake->tx_itemlist, l_stake); + } HASH_ITER(hh, s_srv_stake->itemlist, l_stake, l_tmp) { // Clang bug at this, l_stake should change at every loop cycle HASH_DEL(s_srv_stake->itemlist, l_stake); @@ -107,6 +111,11 @@ void dap_chain_net_srv_stake_pos_delegate_deinit() HASH_DEL(s_srv_stake->cache, l_cache_item); DAP_DELETE(l_cache_item); } +} + +void dap_chain_net_srv_stake_pos_delegate_deinit() +{ + s_stake_ht_clear(); DAP_DEL_Z(s_srv_stake); } @@ -165,8 +174,8 @@ 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; if (!l_found) HASH_ADD(hh, s_srv_stake->itemlist, signing_addr, sizeof(dap_chain_addr_t), l_stake); - HASH_ADD(ht, s_srv_stake->tx_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake); - + if (!dap_hash_fast_is_blank(a_stake_tx_hash)) + HASH_ADD(ht, s_srv_stake->tx_itemlist, tx_hash, sizeof(dap_chain_hash_fast_t), l_stake); } void dap_chain_net_srv_stake_key_invalidate(dap_chain_addr_t *a_signing_addr) @@ -283,18 +292,16 @@ int dap_chain_net_srv_stake_load_cache(dap_chain_net_t *a_net) return 0; } -void dap_chain_net_srv_stake_cache_purge(dap_chain_net_t *a_net) +void dap_chain_net_srv_stake_purge(dap_chain_net_t *a_net) { dap_ledger_t *l_ledger = a_net->pub.ledger; char *l_gdb_group = dap_chain_ledger_get_gdb_group(l_ledger, DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_GDB_GROUP); dap_global_db_del(l_gdb_group, NULL, NULL, NULL); DAP_DELETE(l_gdb_group); - dap_chain_net_srv_stake_cache_item_t *l_cache_item, *l_cache_tmp; - HASH_ITER(hh, s_srv_stake->cache, l_cache_item, l_cache_tmp) { - // Clang bug at this, l_stake should change at every loop cycle - HASH_DEL(s_srv_stake->cache, l_cache_item); - DAP_DELETE(l_cache_item); - } + + s_stake_ht_clear(); + + s_srv_stake->delegate_allowed_min = dap_chain_coins_to_balance("1.0"); } diff --git a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h index f7365f76b89358fa20e8fcede53bcc1189cb6b78..08bee56dbc3d942fa945013fcfce2cd831cc20d4 100644 --- a/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake_pos_delegate/include/dap_chain_net_srv_stake_pos_delegate.h @@ -78,7 +78,7 @@ bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, void dap_chain_net_srv_stake_get_fee_validators_str(dap_chain_net_t *a_net, dap_string_t *a_string); int dap_chain_net_srv_stake_load_cache(dap_chain_net_t *a_net); -void dap_chain_net_srv_stake_cache_purge(dap_chain_net_t *a_net); +void dap_chain_net_srv_stake_purge(dap_chain_net_t *a_net); dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t *a_net, dap_hash_fast_t *a_stake_tx_hash, dap_cert_t *a_cert); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 5dc48804e1e1d86840c49c8b1b72d9c47a201f8f..f58fc8e7fcd2973a4cad48b92f43f1033ab9c130 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -36,6 +36,7 @@ #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" #include "dap_chain_mempool.h" + #define LOG_TAG "dap_chain_cs_blocks" typedef struct dap_chain_tx_block_index