From 6e4de6f3164b7c90595c3935bd555ca551a45677 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Wed, 12 Feb 2025 08:24:20 +0300 Subject: [PATCH 1/4] [+] add switching to sandbox --- .../dap_chain_net_srv_stake_pos_delegate.c | 83 +++++++++++++++++-- .../dap_chain_net_srv_stake_pos_delegate.h | 1 + modules/type/blocks/dap_chain_cs_blocks.c | 11 +++ 3 files changed, 90 insertions(+), 5 deletions(-) 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 7bf277cea4..62bc7fb479 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 @@ -109,6 +109,10 @@ struct srv_stake { dap_chain_net_srv_stake_item_t *itemlist; dap_chain_net_srv_stake_item_t *tx_itemlist; struct cache_item *cache; + struct { + bool in_process; + dap_chain_net_srv_stake_item_t *sandbox; + } hardfork; }; static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply); @@ -179,7 +183,10 @@ 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 ( ; 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; - HASH_FIND(hh, l_srv_stake->itemlist, a_hash, sizeof(dap_hash_fast_t), l_stake); + 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; } @@ -279,6 +286,11 @@ static void s_pos_delegate_delete(void *a_service_internal) HASH_DEL(l_srv_stake->itemlist, l_stake); s_srv_stake_item_free((void *)l_stake); } + HASH_ITER(hh, l_srv_stake->hardfork.sandbox, l_stake, l_tmp) { + // Clang bug at this, l_stake should change at every loop cycle + HASH_DEL(l_srv_stake->itemlist, l_stake); + s_srv_stake_item_free((void *)l_stake); + } struct cache_item *l_cache_item = NULL, *l_cache_tmp = NULL; HASH_ITER(hh, l_srv_stake->cache, l_cache_item, l_cache_tmp) { // Clang bug at this, l_stake should change at every loop cycle @@ -484,6 +496,27 @@ static void s_stake_recalculate_weights(dap_chain_net_id_t a_net_id) while (s_weights_truncate(l_srv_stake, l_limit_min)); } +static void s_stake_key_delegate_switched(struct srv_stake *a_srv_stake, dap_chain_addr_t *a_signing_addr, dap_pkey_t *a_pkey) +{ + dap_chain_net_srv_stake_item_t *l_stake = NULL; + bool l_found = false; + log_it(L_NOTICE, "Add key %s delegation in hardfork process", dap_hash_fast_to_str_static(&a_signing_addr->data.hash_fast)); + HASH_FIND(hh, a_srv_stake->hardfork.sandbox, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); + if (!l_stake) + l_stake = DAP_NEW_Z_RET_IF_FAIL(dap_chain_net_srv_stake_item_t); + else + l_found = true; + if (dap_pkey_get_size(a_pkey)) { + DAP_DELETE(l_stake->pkey); + l_stake->pkey = DAP_DUP_SIZE(a_pkey, dap_pkey_get_size(a_pkey)); + } + if (!l_found) { + l_stake->signing_addr = *a_signing_addr; + HASH_ADD(hh, a_srv_stake->hardfork.sandbox, signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); + } + return; +} + void dap_chain_net_srv_stake_key_delegate(dap_chain_net_t *a_net, dap_chain_addr_t *a_signing_addr, dap_chain_datum_decree_t *a_decree, uint256_t a_value, dap_chain_node_addr_t *a_node_addr, dap_pkey_t *a_pkey) { @@ -4302,6 +4335,10 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da struct srv_stake *l_srv_stake = s_srv_stake_by_net_id(a_net_id); if (!l_srv_stake) return -2; + if (l_srv_stake->hardfork.in_process && l_srv_stake->hardfork.sandbox) { + log_it(L_ERROR, "Temp hardfork table already existed in net %"DAP_UINT64_FORMAT_U, a_net_id.uint64); + return -3; + } dap_chain_net_srv_stake_item_t *l_stake, *l_tmp; HASH_ITER(hh, l_srv_stake->itemlist, l_stake, l_tmp) { if (dap_hash_fast_is_blank(&l_stake->tx_hash)) { @@ -4310,11 +4347,17 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da } } // clean prev table - s_pos_delegate_purge(a_net_id); + if (!l_srv_stake->hardfork.in_process) + s_pos_delegate_purge(a_net_id); + // restore poa keys for ( dap_list_t* l_iter = dap_list_first(l_current_list); l_iter; l_iter = l_iter->next) { l_stake = (dap_chain_net_srv_stake_item_t *)l_iter->data; - dap_chain_net_srv_stake_key_delegate(l_net, &l_stake->signing_addr, NULL, l_stake->value, &l_stake->node_addr, l_stake->pkey); + if (l_srv_stake->hardfork.in_process) { + s_stake_key_delegate_switched(l_srv_stake, &l_stake->signing_addr, l_stake->pkey); + } else { + dap_chain_net_srv_stake_key_delegate(l_net, &l_stake->signing_addr, NULL, l_stake->value, &l_stake->node_addr, l_stake->pkey); + } } dap_list_free_full(l_current_list, s_srv_stake_item_free); @@ -4341,9 +4384,39 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da dap_list_free_full(l_current_list, NULL); return -4; } - dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); - dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); + if (l_srv_stake->hardfork.in_process) { + s_stake_key_delegate_switched(l_srv_stake, &l_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); + } else { + dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); + dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); + } } dap_list_free_full(l_current_list, NULL); return 0; } + +/** + * @brief switch key delegate table + * @param a_net_id net id to switch + * @param a_to_temp true - switch to sandbox, false - switch to main + * @return if OK - 0, other if error + */ +int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_sandbox) +{ + struct srv_stake *l_srv_stake = s_srv_stake_by_net_id(a_net_id); + if (!l_srv_stake) + return -1; + if (l_srv_stake->hardfork.in_process == a_to_sandbox) { + log_it(L_ERROR, "Key delegate table already switched to %s table", a_to_sandbox ? "snadbox" : "main"); + return -2; + } + if (!a_to_sandbox) { // free temp table if switch to main + dap_chain_net_srv_stake_item_t *l_stake = NULL, *l_tmp = NULL; + HASH_ITER(hh, l_srv_stake->hardfork.sandbox, l_stake, l_tmp) { + HASH_DEL(l_srv_stake->itemlist, l_stake); + s_srv_stake_item_free((void *)l_stake); + } + } + l_srv_stake->hardfork.in_process = a_to_sandbox; + return 0; +} \ No newline at end of file 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 d8d3ba9785..ff21ac8e41 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 @@ -82,3 +82,4 @@ void dap_chain_net_srv_stake_add_approving_decree_info(dap_chain_datum_decree_t void dap_chain_net_srv_stake_remove_approving_decree_info(dap_chain_net_t *a_net, dap_chain_addr_t *a_signing_addr); int dap_chain_net_srv_stake_hardfork_data_export(dap_chain_net_t *a_net, dap_list_t **a_out); 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_switch_table(dap_chain_net_id_t a_net_id, bool a_to_sandbox); \ 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 b23851f2cf..f328bfcecd 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1838,6 +1838,10 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); return ATOM_REJECT; } + if (dap_chain_net_srv_stake_switch_table(a_chain->net_id, false)) { // to main + log_it(L_CRITICAL, "Can't accept hardfork genesis block %s: error in switching to main table", dap_hash_fast_to_str_static(a_atom_hash)); + return ATOM_REJECT; + } if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash)) { // True import log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); return ATOM_REJECT; @@ -2008,7 +2012,14 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t *a_chain, log_it(L_ERROR, "Can't find hardfork decree hash in candidate block meta"); return ATOM_REJECT; } + if (dap_chain_net_srv_stake_switch_table(a_chain->net_id, true)) { // to Sandbox + log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in switching to sandbox table", dap_hash_fast_to_str_static(a_atom_hash)); + return ATOM_REJECT; + } if (dap_chain_net_srv_stake_hardfork_data_import(a_chain->net_id, l_hardfork_decree_hash)) { // Sandbox + if (dap_chain_net_srv_stake_switch_table(a_chain->net_id, false)) { // return to main + log_it(L_CRITICAL, "Can't accept hardfork genesis block %s: error in switching to main table", dap_hash_fast_to_str_static(a_atom_hash)); + } log_it(L_ERROR, "Can't accept hardfork genesis block %s: error in hardfork data restoring", dap_hash_fast_to_str_static(a_atom_hash)); return ATOM_REJECT; } -- GitLab From ab4e4488812c9ae25f90d2053a3e97e76845712e Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Wed, 12 Feb 2025 10:03:58 +0300 Subject: [PATCH 2/4] [*] add using dap_chain_net_srv_stake_switch_table --- .../service/stake/dap_chain_net_srv_stake_pos_delegate.c | 2 +- modules/type/blocks/dap_chain_cs_blocks.c | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) 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 62bc7fb479..a7b50dbfcf 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 @@ -4407,7 +4407,7 @@ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_ if (!l_srv_stake) return -1; if (l_srv_stake->hardfork.in_process == a_to_sandbox) { - log_it(L_ERROR, "Key delegate table already switched to %s table", a_to_sandbox ? "snadbox" : "main"); + log_it(L_DEBUG, "Key delegate table already switched to %s table", a_to_sandbox ? "snadbox" : "main"); return -2; } if (!a_to_sandbox) { // free temp table if switch to main diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index f328bfcecd..291e3bd703 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1735,8 +1735,10 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); assert(l_net); if ( !dap_chain_net_get_load_mode(l_net) ) { - if ( (ret = dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL)) < 0 ) { - log_it(L_ERROR, "Can't save atom to file, code %d", ret); + ssize_t l_res = dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL); + if ( l_res < 0 ) { + log_it(L_ERROR, "Can't save atom to file, code %zd", l_res); + dap_chain_net_srv_stake_switch_table(l_net->pub.id, false); return ATOM_REJECT; } else if (a_chain->is_mapped) { l_block = (dap_chain_block_t*)( l_cell->map_pos += sizeof(uint64_t) ); // Switching to mapped area @@ -1748,6 +1750,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da l_block_cache = dap_chain_block_cache_new(&l_block_hash, l_block, a_atom_size, PVT(l_blocks)->blocks_count + 1, !a_chain->is_mapped); if (!l_block_cache) { log_it(L_DEBUG, "%s", "... corrupted block"); + dap_chain_net_srv_stake_switch_table(l_net->pub.id, false); return ATOM_REJECT; } debug_if(s_debug_more, L_DEBUG, "... new block %s", l_block_cache->block_hash_str); -- GitLab From 53abde3e93ac2a470b7835abc0eb6e52a13db924 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Wed, 12 Feb 2025 10:43:47 +0300 Subject: [PATCH 3/4] [*] MR preparing --- .../dap_chain_net_srv_stake_pos_delegate.c | 23 +++++++++---------- modules/type/blocks/dap_chain_cs_blocks.c | 5 ++-- 2 files changed, 13 insertions(+), 15 deletions(-) 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 a7b50dbfcf..e042e897cf 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 @@ -282,18 +282,15 @@ static void s_pos_delegate_delete(void *a_service_internal) HASH_DELETE(ht, l_srv_stake->tx_itemlist, l_stake); } HASH_ITER(hh, l_srv_stake->itemlist, l_stake, l_tmp) { - // Clang bug at this, l_stake should change at every loop cycle HASH_DEL(l_srv_stake->itemlist, l_stake); s_srv_stake_item_free((void *)l_stake); } HASH_ITER(hh, l_srv_stake->hardfork.sandbox, l_stake, l_tmp) { - // Clang bug at this, l_stake should change at every loop cycle - HASH_DEL(l_srv_stake->itemlist, l_stake); + HASH_DEL(l_srv_stake->hardfork.sandbox, l_stake); s_srv_stake_item_free((void *)l_stake); } struct cache_item *l_cache_item = NULL, *l_cache_tmp = NULL; HASH_ITER(hh, l_srv_stake->cache, l_cache_item, l_cache_tmp) { - // Clang bug at this, l_stake should change at every loop cycle HASH_DEL(l_srv_stake->cache, l_cache_item); DAP_DELETE(l_cache_item); } @@ -496,20 +493,22 @@ static void s_stake_recalculate_weights(dap_chain_net_id_t a_net_id) while (s_weights_truncate(l_srv_stake, l_limit_min)); } -static void s_stake_key_delegate_switched(struct srv_stake *a_srv_stake, dap_chain_addr_t *a_signing_addr, dap_pkey_t *a_pkey) +static void s_stake_key_delegate_sandbox(struct srv_stake *a_srv_stake, dap_chain_addr_t *a_signing_addr, dap_pkey_t *a_pkey) { + dap_return_if_pass(!a_srv_stake || !a_signing_addr || !a_pkey); + log_it(L_NOTICE, "Add key %s delegation in hardfork process", dap_hash_fast_to_str_static(&a_signing_addr->data.hash_fast)); dap_chain_net_srv_stake_item_t *l_stake = NULL; bool l_found = false; - log_it(L_NOTICE, "Add key %s delegation in hardfork process", dap_hash_fast_to_str_static(&a_signing_addr->data.hash_fast)); HASH_FIND(hh, a_srv_stake->hardfork.sandbox, &a_signing_addr->data.hash_fast, sizeof(dap_hash_fast_t), l_stake); if (!l_stake) l_stake = DAP_NEW_Z_RET_IF_FAIL(dap_chain_net_srv_stake_item_t); else l_found = true; - if (dap_pkey_get_size(a_pkey)) { + if (dap_pkey_get_size(l_stake->pkey)) { + log_it(L_DEBUG, "Full pkey by hash %s was replaced", dap_hash_fast_to_str_static(&a_signing_addr->data.hash_fast)); DAP_DELETE(l_stake->pkey); - l_stake->pkey = DAP_DUP_SIZE(a_pkey, dap_pkey_get_size(a_pkey)); } + l_stake->pkey = DAP_DUP_SIZE(a_pkey, dap_pkey_get_size(a_pkey)); if (!l_found) { l_stake->signing_addr = *a_signing_addr; HASH_ADD(hh, a_srv_stake->hardfork.sandbox, signing_addr.data.hash_fast, sizeof(dap_hash_fast_t), l_stake); @@ -4354,7 +4353,7 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da for ( dap_list_t* l_iter = dap_list_first(l_current_list); l_iter; l_iter = l_iter->next) { l_stake = (dap_chain_net_srv_stake_item_t *)l_iter->data; if (l_srv_stake->hardfork.in_process) { - s_stake_key_delegate_switched(l_srv_stake, &l_stake->signing_addr, l_stake->pkey); + s_stake_key_delegate_sandbox(l_srv_stake, &l_stake->signing_addr, l_stake->pkey); } else { dap_chain_net_srv_stake_key_delegate(l_net, &l_stake->signing_addr, NULL, l_stake->value, &l_stake->node_addr, l_stake->pkey); } @@ -4385,7 +4384,7 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da return -4; } if (l_srv_stake->hardfork.in_process) { - s_stake_key_delegate_switched(l_srv_stake, &l_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); + s_stake_key_delegate_sandbox(l_srv_stake, &l_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); } else { dap_chain_net_srv_stake_key_delegate(l_net, &l_addr, l_current_decree, l_value, &l_node_addr, dap_chain_datum_decree_get_pkey(l_current_decree)); dap_chain_net_srv_stake_add_approving_decree_info(l_current_decree, l_net); @@ -4398,7 +4397,7 @@ int dap_chain_net_srv_stake_hardfork_data_import(dap_chain_net_id_t a_net_id, da /** * @brief switch key delegate table * @param a_net_id net id to switch - * @param a_to_temp true - switch to sandbox, false - switch to main + * @param a_to_temp true - to sandbox, false - to main * @return if OK - 0, other if error */ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_sandbox) @@ -4407,7 +4406,7 @@ int dap_chain_net_srv_stake_switch_table(dap_chain_net_id_t a_net_id, bool a_to_ if (!l_srv_stake) return -1; if (l_srv_stake->hardfork.in_process == a_to_sandbox) { - log_it(L_DEBUG, "Key delegate table already switched to %s table", a_to_sandbox ? "snadbox" : "main"); + log_it(L_DEBUG, "Key delegate table already switched to %s table", a_to_sandbox ? "sandbox" : "main"); return -2; } if (!a_to_sandbox) { // free temp table if switch to main diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 291e3bd703..c1876ef66a 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1735,9 +1735,8 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); assert(l_net); if ( !dap_chain_net_get_load_mode(l_net) ) { - ssize_t l_res = dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL); - if ( l_res < 0 ) { - log_it(L_ERROR, "Can't save atom to file, code %zd", l_res); + if ( dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL) < 0 ) { + log_it(L_ERROR, "Can't save atom to file"); dap_chain_net_srv_stake_switch_table(l_net->pub.id, false); return ATOM_REJECT; } else if (a_chain->is_mapped) { -- GitLab From 7c1ce4c41bb5aaa37461962845890b67984f6da3 Mon Sep 17 00:00:00 2001 From: "pavel.uhanov" <pavel.uhanov@demlabs.net> Date: Wed, 12 Feb 2025 10:49:54 +0300 Subject: [PATCH 4/4] [*] fix pipes --- modules/type/blocks/dap_chain_cs_blocks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index c1876ef66a..147849011f 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1737,7 +1737,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da if ( !dap_chain_net_get_load_mode(l_net) ) { if ( dap_chain_atom_save(l_cell, a_atom, a_atom_size, a_atom_new ? &l_block_hash : NULL) < 0 ) { log_it(L_ERROR, "Can't save atom to file"); - dap_chain_net_srv_stake_switch_table(l_net->pub.id, false); + dap_chain_net_srv_stake_switch_table(a_chain->net_id, false); return ATOM_REJECT; } else if (a_chain->is_mapped) { l_block = (dap_chain_block_t*)( l_cell->map_pos += sizeof(uint64_t) ); // Switching to mapped area @@ -1749,7 +1749,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da l_block_cache = dap_chain_block_cache_new(&l_block_hash, l_block, a_atom_size, PVT(l_blocks)->blocks_count + 1, !a_chain->is_mapped); if (!l_block_cache) { log_it(L_DEBUG, "%s", "... corrupted block"); - dap_chain_net_srv_stake_switch_table(l_net->pub.id, false); + dap_chain_net_srv_stake_switch_table(a_chain->net_id, false); return ATOM_REJECT; } debug_if(s_debug_more, L_DEBUG, "... new block %s", l_block_cache->block_hash_str); -- GitLab