diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 28e07814004ca1acc1605b5a46f3a77c9337dcc1..dcf3ad9356aff6a37d662a005b96324cbab25b41 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -229,20 +229,24 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg) size_t l_atom_size =0; if ( l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash, &l_atom_size) == NULL ) { dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy, l_atom_copy_size); - if(l_atom_add_res == ATOM_ACCEPT && dap_chain_has_file_store(l_chain)) { + if ((l_atom_add_res == ATOM_ACCEPT || l_atom_add_res == ATOM_MOVE_TO_THRESHOLD) && + dap_chain_has_file_store(l_chain)) { // append to file dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_ch_chain->request_cell_id); - if(l_cell){ - // add one atom only - int l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); - // rewrite all file - //l_res = dap_chain_cell_file_update(l_cell); - if(l_res < 0) { - log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash, - l_cell ? l_cell->file_storage_path : "[null]"); + int l_res; + if (l_cell) { + if (l_atom_add_res == ATOM_ACCEPT) { + // add one atom only + l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size); + // rewrite all file + //l_res = dap_chain_cell_file_update(l_cell); + if(l_res < 0) { + log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash, + l_cell ? l_cell->file_storage_path : "[null]"); + } } // add all atoms from treshold - if(l_res && l_chain->callback_atom_add_from_treshold){ + if (l_chain->callback_atom_add_from_treshold){ dap_chain_atom_ptr_t l_atom_treshold; do{ size_t l_atom_treshold_size; @@ -251,7 +255,7 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg) l_atom_treshold = l_chain->callback_atom_add_from_treshold(l_chain, &l_atom_treshold_size); // add into file if(l_atom_treshold) { - int l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); + l_res = dap_chain_cell_file_append(l_cell, l_atom_treshold, l_atom_treshold_size); log_it(L_DEBUG, "Added atom from treshold"); if(l_res < 0) { log_it(L_ERROR, "Can't save event 0x%x from treshold to the file '%s'", diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 10061b1e3eedd8f138ae46c1ea0919f6b0d59187..f73b95c2158786bdc8499dc0824f1b63753a44b3 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -418,7 +418,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) default: { // Get DNS request result from root nodes as synchronization links int l_max_tries = 5; - int l_tries =0; + int l_tries = 0; while (dap_list_length(l_pvt_net->links_info) < s_max_links_count && l_tries < l_max_tries) { int i = rand() % l_pvt_net->seed_aliases_count; dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(l_net, l_pvt_net->seed_aliases[i]); @@ -426,9 +426,9 @@ static int s_net_states_proc(dap_chain_net_t * l_net) if(l_remote_node_info) { dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); int l_res = dap_dns_client_get_addr(l_remote_node_info->hdr.ext_addr_v4.s_addr, l_net->pub.name, l_link_node_info); - //memcpy(l_link_node_info, l_remote_node_info, sizeof(dap_chain_node_info_t)); if (!l_res && l_link_node_info->hdr.address.uint64 != l_own_addr) { l_pvt_net->links_info = dap_list_append(l_pvt_net->links_info, l_link_node_info); + l_tries = 0; } DAP_DELETE(l_remote_node_info); } @@ -441,8 +441,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) } l_tries++; } - - if (!l_pvt_net->links){ + if (dap_list_length(l_pvt_net->links_info) < s_max_links_count) { for (int i = 0; i < MIN(s_max_links_count, l_pvt_net->seed_aliases_count); i++) { dap_chain_node_addr_t *l_link_addr = dap_chain_node_alias_find(l_net, l_pvt_net->seed_aliases[i]); if (l_link_addr->uint64 == l_own_addr) { diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 1d79b82d487a8be52ee6672f98b65f8ba6b06a7e..48342a194ee44b9a94fc64070d8dea0516c37327 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -213,6 +213,13 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) log_it( L_ERROR, "Can't read hash from static_genesis_event \"%s\", ret code %d ", l_static_genesis_event_hash_str, lhr); } } + uint16_t l_list_len = 0; + char **l_hard_accept_list = dap_config_get_array_str(a_chain_cfg, "dag", "hard_accept_list", &l_list_len); + for (uint16_t i = 0; i < l_list_len; i++) { + dap_chain_cs_dag_hal_item_t *l_hal_item = DAP_NEW_Z(dap_chain_cs_dag_hal_item_t); + dap_chain_str_to_hash_fast(l_hard_accept_list[i], &l_hal_item->hash); + HASH_ADD(hh, l_dag->hal, hash, sizeof(l_hal_item->hash), l_hal_item); + } l_dag->is_static_genesis_event = (l_static_genesis_event_hash_str != NULL) && dap_config_get_item_bool_default(a_chain_cfg,"dag","is_static_genesis_event",false); @@ -287,26 +294,19 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger return 0; } -static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ){ +static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ) +{ int res = a_dag->callback_cs_verify(a_dag,a_event_item->event, a_event_item->event_size); - if (res != 0) { - if ( memcmp( &a_event_item->hash, &a_dag->static_genesis_event_hash, sizeof(a_event_item->hash) ) == 0 ){ - res = 0; - } - } - - if(res == 0){ - char l_buf_hash[128]; - dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); + char l_buf_hash[128]; + dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); + if (res == 0 || memcmp( &a_event_item->hash, &a_dag->static_genesis_event_hash, sizeof(a_event_item->hash) ) == 0) { log_it(L_DEBUG,"Dag event %s checked, add it to ledger", l_buf_hash); s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); //All correct, no matter for result HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item); s_dag_events_lasts_process_new_last_event(a_dag, a_event_item); } else { - char l_buf_hash[128]; - dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); log_it(L_WARNING,"Dag event %s check failed: code %d", l_buf_hash, res ); } return res; @@ -643,9 +643,19 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ dap_chain_atom_verify_res_t res = ATOM_ACCEPT; if(sizeof (l_event->header) >= a_atom_size){ - log_it(L_WARNING,"Size of atom is %zd that is equel or less then header %zd",a_atom_size,sizeof (l_event->header)); + log_it(L_WARNING,"Size of atom is %zd that is equal or less then header %zd",a_atom_size,sizeof (l_event->header)); return ATOM_REJECT; } + // Hard accept list + if (l_dag->hal) { + dap_chain_hash_fast_t l_event_hash; + dap_chain_cs_dag_event_calc_hash(l_event,a_atom_size, &l_event_hash); + dap_chain_cs_dag_hal_item_t *l_hash_found = NULL; + HASH_FIND(hh, l_dag->hal, &l_event_hash, sizeof(l_event_hash), l_hash_found); + if (l_hash_found) { + return ATOM_ACCEPT; + } + } // genesis or seed mode if (l_event->header.hash_count == 0){ if(s_seed_mode && !PVT(l_dag)->events){ diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index fab0c320166bb1a5a4fd60d86f059843521515ed..43a823579d3504c11474438beef8f99a271333a2 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -22,6 +22,7 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ #pragma once +#include "uthash.h" #include "dap_chain.h" #include "dap_chain_cs_dag_event.h" @@ -36,6 +37,10 @@ typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(d dap_chain_datum_t *, dap_chain_hash_fast_t *, size_t, size_t*); +typedef struct dap_chain_cs_dag_hal_item { + dap_chain_hash_fast_t hash; + UT_hash_handle hh; +} dap_chain_cs_dag_hal_item_t; typedef struct dap_chain_cs_dag { @@ -45,6 +50,7 @@ typedef struct dap_chain_cs_dag bool is_add_directy; bool is_static_genesis_event; dap_chain_hash_fast_t static_genesis_event_hash; + dap_chain_cs_dag_hal_item_t *hal; uint16_t datum_add_hashes_count; char * gdb_group_events_round_new;