From da3019891e5840bd73ddf59dc2f4b2e65569bd45 Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Thu, 31 Oct 2019 15:00:40 +0700 Subject: [PATCH] [+] static genesis event --- dap_chain_cs_dag.c | 31 +++++++++++++++++++++++-------- dap_chain_cs_dag.h | 2 ++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c index 872fa84..ce80851 100755 --- a/dap_chain_cs_dag.c +++ b/dap_chain_cs_dag.c @@ -64,6 +64,7 @@ typedef struct dap_chain_cs_dag_pvt { pthread_rwlock_t events_rwlock; + dap_chain_cs_dag_event_item_t * events; dap_chain_cs_dag_event_item_t * events_treshold; dap_chain_cs_dag_event_item_t * events_lasts_unlinked; @@ -194,6 +195,10 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) // Others a_chain->_inheritor = l_dag; + const char * l_static_genesis_event_hash_str = dap_config_get_item_str_default(a_chain_cfg,"dag","static_genesis_event",NULL); + dap_chain_str_to_hash_fast(l_static_genesis_event_hash_str,&l_dag->static_genesis_event_hash); + + l_dag->is_static_genesis_event = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_static_genesis_event",false); l_dag->is_single_line = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_single_line",false); l_dag->is_celled = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_celled",false); l_dag->is_add_directy = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_add_directly",false); @@ -521,18 +526,28 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; + + if (l_event->header.hash_count == 0 && l_dag->is_static_genesis_event ){ + dap_chain_hash_fast_t l_event_hash; + dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash); + if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ) + return -22; + } + int ret = l_dag->callback_cs_verify ( l_dag, l_event ); if (ret == 0 ){ - for (size_t i = 0; i< l_event->header.hash_count; i++) { - dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs) + i; - dap_chain_cs_dag_event_item_t * l_event_search = NULL; - HASH_FIND(hh, PVT(l_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search); - if ( l_event_search == NULL ){ - log_it(L_DEBUG, "Hash %s wasn't in hashtable of previously parsed", l_hash); - return 1; + if ( PVT(l_dag)->events ) + for (size_t i = 0; i< l_event->header.hash_count; i++) { + dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs) + i; + dap_chain_cs_dag_event_item_t * l_event_search = NULL; + HASH_FIND(hh, PVT(l_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search); + if ( l_event_search == NULL ){ + log_it(L_DEBUG, "Hash %s wasn't in hashtable of previously parsed", l_hash); + return 1; + } + } - } return 0; }else { return ret; diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h index 48ef821..0621df6 100755 --- a/dap_chain_cs_dag.h +++ b/dap_chain_cs_dag.h @@ -43,6 +43,8 @@ typedef struct dap_chain_cs_dag bool is_single_line; bool is_celled; bool is_add_directy; + bool is_static_genesis_event; + dap_chain_hash_fast_t static_genesis_event_hash; uint16_t datum_add_hashes_count; char * gdb_group_events_round_new; -- GitLab