From 8f161f920f3c52980b4adbf91a7f01680442dc11 Mon Sep 17 00:00:00 2001 From: "daniil.frolov" <daniil.frolov@demlabs.net> Date: Mon, 3 Jun 2024 19:54:09 +0700 Subject: [PATCH] .. --- modules/chain/dap_chain.c | 4 ++++ modules/chain/dap_chain_cell.c | 5 ++++- modules/type/blocks/dap_chain_cs_blocks.c | 24 ++++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 953b3bd2fa..2bec84dd23 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -798,6 +798,10 @@ const char* dap_chain_get_path(dap_chain_t *a_chain) } void dap_chain_atom_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_hash, const uint8_t *a_atom, size_t a_atom_size) { +#ifdef DAP_CHAIN_BLOCKS_TEST + return; +#endif + if ( !a_chain_cell->chain->atom_notifiers ) return; dap_list_t *l_iter; diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index a299f87209..7034d04aa6 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -290,7 +290,10 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) if (a_chain->is_mapped) { a_cell->map_pos = a_cell->map + sizeof(dap_chain_cell_file_header_t); for (uint64_t l_el_size = 0; a_cell->map_pos < a_cell->map_end && ( l_el_size = *(uint64_t*)a_cell->map_pos ); ++q, a_cell->map_pos += l_el_size) { - a_chain->callback_atom_add(a_chain, (dap_chain_atom_ptr_t)(a_cell->map_pos += sizeof(uint64_t)), l_el_size); + dap_hash_fast_t l_atom_hash = {}; + dap_chain_atom_ptr_t l_atom = (dap_chain_atom_ptr_t)(a_cell->map_pos += sizeof(uint64_t)); + dap_hash_fast(l_atom, l_el_size, &l_atom_hash); + a_chain->callback_atom_add(a_chain, l_atom, l_el_size, &l_atom_hash); } fseek(a_cell->file_storage, a_cell->map_pos - a_cell->map, SEEK_SET); } else { diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 8e9ea3127c..931f8f326b 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1616,6 +1616,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da switch (ret) { case ATOM_ACCEPT:{ dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(a_chain, l_block->hdr.cell_id); +#ifndef DAP_CHAIN_BLOCKS_TEST if ( !dap_chain_net_get_load_mode( dap_chain_net_by_id(a_chain->net_id)) ) { if ( (ret = dap_chain_atom_save(l_cell, a_atom, a_atom_size, &l_block_hash)) < 0 ) { log_it(L_ERROR, "Can't save atom to file, code %d", ret); @@ -1627,7 +1628,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da } ret = ATOM_PASS; } - +#endif 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"); @@ -1699,6 +1700,27 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da debug_if(s_debug_more, L_DEBUG, "Verified atom %p: REJECTED", a_atom); break; case ATOM_FORK:{ + dap_chain_cell_t *l_cell = dap_chain_cell_find_by_id(a_chain, l_block->hdr.cell_id); +#ifndef DAP_CHAIN_BLOCKS_TEST + if ( !dap_chain_net_get_load_mode( dap_chain_net_by_id(a_chain->net_id)) ) { + if ( (ret = dap_chain_atom_save(l_cell, a_atom, a_atom_size, &l_block_hash)) < 0 ) { + log_it(L_ERROR, "Can't save atom to file, code %d", ret); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); + 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 + l_cell->map_pos += a_atom_size; + } + ret = ATOM_PASS; + } +#endif + 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"); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); + return ATOM_REJECT; + } + debug_if(s_debug_more, L_DEBUG, "... new block %s", l_block_cache->block_hash_str); dap_chain_block_cache_t *l_prev_bcache = NULL, *l_tmp = NULL; pthread_rwlock_wrlock(& PVT(l_blocks)->rwlock); HASH_FIND(hh, PVT(l_blocks)->blocks, &l_block_prev_hash, sizeof(dap_hash_fast_t), l_prev_bcache); -- GitLab