diff --git a/CMakeLists.txt b/CMakeLists.txt index 91e6b111ae10f3855a95b4c24cc40d6f5024a128..d22b714389fc48416863033c9c0018a1d115ded2 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,6 @@ set(DAP_CHAIN_DAG_HEADERS add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_SRCS} ${DAP_CHAIN_DAG_HEADERS}) -target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_global_db) +target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_net dap_chain_crypto dap_chain_global_db) target_include_directories(dap_chain_cs_dag INTERFACE .) diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c index 734f548574b2f4a4022086b736efb9bbdd3c6e80..eb70ffc82cbbb8f45cfd03d8d764e937eb4533e2 100755 --- a/dap_chain_cs_dag.c +++ b/dap_chain_cs_dag.c @@ -21,19 +21,23 @@ You should have received a copy of the GNU General Public License along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ -#include <stdint.h> +#include <stdlib.h> #include <time.h> #include <pthread.h> #include "uthash.h" #include "dap_common.h" +#include "dap_strfuncs.h" #include "dap_hash.h" #include "dap_chain_datum.h" #include "dap_chain_cs.h" #include "dap_chain_cs_dag.h" +#include "dap_chain_global_db.h" +#include "dap_chain_node_cli.h" #define LOG_TAG "dap_chain_cs_dag" + typedef struct dap_chain_cs_dag_event_item { dap_chain_hash_fast_t hash; time_t ts_added; @@ -42,35 +46,39 @@ typedef struct dap_chain_cs_dag_event_item { } dap_chain_cs_dag_event_item_t; typedef struct dap_chain_cs_dag_pvt { - dap_chain_cs_dag_event_item_t * events; - pthread_rwlock_t events_rwlock; + dap_enc_key_t* datum_add_sign_key; + + pthread_rwlock_t events_rwlock; + dap_chain_cs_dag_event_item_t * events; dap_chain_cs_dag_event_item_t * events_treshold; - pthread_rwlock_t events_treshold_rwlock; dap_chain_cs_dag_event_item_t * events_lasts; + } dap_chain_cs_dag_pvt_t; #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt ) // Atomic element organization callbacks -static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t *); // Accept new event in dag -static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t *); // Verify new event in dag -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_t *); // Get dag event size -static size_t s_chain_callback_atom_get_static_hdr_size(); // Get dag event header size +static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t *); // Accept new event in dag +static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t *); // Verify new event in dag +static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t *); // Get dag event size +static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get dag event header size static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); // Get the fisrt event from dag -static dap_chain_atom_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag -static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag +static size_t s_chain_callback_datum_pool_proc(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t ** a_datums, size_t a_datums_size); // Datum ops - +/* static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain ); static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_iter ); static dap_chain_datum_t* s_chain_callback_datum_iter_get_first( dap_chain_datum_iter_t * a_datum_iter ); // Get the fisrt datum from dag static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter ); // Get the next datum from dag +*/ - +static int s_cli_dag(int argc, const char ** argv, char **str_reply); /** * @brief dap_chain_cs_dag_init @@ -78,8 +86,22 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_ */ int dap_chain_cs_dag_init(void) { + srand((unsigned int) time(NULL)); dap_chain_class_add( "dag", dap_chain_cs_dag_new ); + dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, "DAG commands", + "Create event from datum mempool element\n" + "\tdag net_name <chain net name> chain_name <chain name> event create datum_hash <datum hash>\n\n" + "Remove event from forming new round and put back its datum to mempool\n\n" + "dag net_name <chain net name> chain_name <chain name> event cancel event_hash <event hash>\n\n" + "Dump event info" + "dag net_name <chain net name> chain_name <chain name> event dump event_hash <event hash>\n" + "Show event list" + "dag net_name <chain net name> chain_name <chain name> event list\n\n" + "\t<datum hash> Datum hash from mempool\n" + "\t<event hash> Event hash from forming new round, must return back datum to mempool\n" + ); + log_it(L_NOTICE,"Initialized DAG chain items organization class"); return 0; } @@ -103,7 +125,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->chain = a_chain; pthread_rwlock_init(& PVT(l_dag)->events_rwlock,NULL); - pthread_rwlock_init(& PVT(l_dag)->events_treshold_rwlock,NULL); a_chain->callback_delete = dap_chain_cs_dag_delete; @@ -118,20 +139,28 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one + a_chain->callback_datums_pool_proc = s_chain_callback_datum_pool_proc; + // Datum operations callbacks +/* a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create a_chain->callback_datum_iter_delete = s_chain_callback_datum_iter_delete; // Datum iterator delete a_chain->callback_datum_iter_get_first = s_chain_callback_datum_iter_get_first; // Get the fisrt datum from chain a_chain->callback_datum_iter_get_next = s_chain_callback_datum_iter_get_next; // Get the next datum from chain from the current one - +*/ // Others a_chain->_inheritor = l_dag; l_dag->is_single_line = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_single_line",false); - if ( l_dag->is_single_line ) + l_dag->is_celled = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_celled",false); + l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1); + l_dag->events_round_new_gdb_group = strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", + "events.round.new")); + if ( l_dag->is_single_line ) { log_it (L_NOTICE, "DAG chain initialized (single line)"); - else + } else { log_it (L_NOTICE, "DAG chain initialized (multichain)"); + } return 0; } @@ -145,7 +174,6 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain ); pthread_rwlock_destroy(& PVT(l_dag)->events_rwlock); - pthread_rwlock_destroy(& PVT(l_dag)->events_treshold_rwlock); if(l_dag->callback_delete ) l_dag->callback_delete(l_dag); @@ -161,7 +189,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) * @param a_atom * @return 0 if verified and added well, otherwise if not */ -static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a_atom) +static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t * a_atom) { int ret = s_chain_callback_atom_verify (a_chain, a_atom); if ( ret < 0 ){ @@ -171,7 +199,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a 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; - ret = l_dag->callback_cs_input(l_dag,l_event); + ret = l_dag->callback_cs_verify(l_dag,l_event); if ( ret != 0 ){ log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret); return -2; @@ -180,11 +208,10 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a l_event_item->event = l_event; dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_item->hash ); - // Put in main table or in the treshhold if not all the rest linked event are present dap_chain_cs_dag_event_item_t * l_event_search = NULL; dap_chain_cs_dag_event_item_t * l_events =( ret==0 ? PVT(l_dag)->events : PVT(l_dag)->events_treshold ); - pthread_rwlock_t * l_events_rwlock =( ret==0 ? &PVT(l_dag)->events_rwlock : &PVT(l_dag)->events_treshold_rwlock ); + pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ; pthread_rwlock_wrlock( l_events_rwlock ); HASH_FIND(hh, l_events,&l_event_item->hash,sizeof (l_event_search->hash), l_event_search); if ( l_event_search ) { @@ -203,6 +230,94 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a return 0; } +/** + * @brief s_chain_callback_datums_add + * @param a_chain + * @param a_datums + * @param a_datums_size + */ +static size_t s_chain_callback_datum_pool_proc(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t ** a_datums, size_t a_datums_count) +{ + dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); + size_t l_datum_processed =0; + size_t l_events_round_new_size = 0; + // Load current events new round pool + dap_global_db_obj_t ** l_events_round_new = dap_chain_global_db_gr_load(l_dag->events_round_new_gdb_group, &l_events_round_new_size ); + // Prepare hashes + size_t l_hashes_int_size = ( l_events_round_new_size + a_datums_count )> l_dag->datum_add_hashes_count ? + l_dag->datum_add_hashes_count : + l_events_round_new_size+a_datums_count; + size_t l_hashes_ext_size = 1; // Change in cfg + dap_chain_hash_fast_t * l_hashes = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, + sizeof(dap_chain_hash_fast_t) * + (l_hashes_int_size+l_hashes_ext_size) ); + + for (size_t d = 0; d <a_datums_count ; d++){ + dap_chain_datum_t * l_datum = a_datums[d]; + // Linking randomly with current new round set + size_t l_hashes_linked = 0; + size_t l_rnd_steps; + // Linking events inside round + l_rnd_steps = 0; + do{ + int l_index = rand() % (int) l_events_round_new_size; + dap_chain_hash_fast_t l_hash; + dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_events_round_new[l_index]->value; + size_t l_event_size = dap_chain_cs_dag_event_calc_size(l_event); + dap_hash_fast(l_event, l_event_size,&l_hash); + + bool l_is_already_in_event = false; + for (int i=0; i<l_hashes_linked;i++ ){ // check if we already added it + if (memcmp(&l_hashes[i],&l_hash,sizeof (l_hash) )==0 ){ + l_is_already_in_event = true; + break; + } + } + + if ( ! l_is_already_in_event ){ + memcpy(&l_hashes[l_hashes_linked],&l_hash,sizeof (l_hash) ); + l_hashes_linked++; + } + l_rnd_steps++; + if (l_rnd_steps > 100) // Too many attempts + break; + } while (l_hashes_linked <(l_hashes_int_size) ); + if (l_hashes_linked<l_hashes_int_size ){ + log_it(L_ERROR,"Can't link new events randomly for 100 attempts"); + break; + } + // Now link with ext events + if ( PVT(l_dag)->events ){ + + } + dap_chain_cs_dag_event_t * l_event_new = dap_chain_cs_dag_event_new(a_chain->id,a_cell_id,l_datum,NULL,&l_hashes,l_hashes_ext_size+l_hashes_int_size); + } + log_it (L_NOTICE,""); +// dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create(l_dag,a_cell_id,a_datums[i],l_hashes,l_dag->datum_add_hashes_count); + // s_chain_callback_atom_add(a_chain,(dap_chain_atom_t *)l_event ); + + + return l_datum_processed; +} + + +/** + * @brief dap_chain_cs_dag_find_event_by_hash + * @param a_dag + * @param a_hash + * @return + */ +dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag, dap_chain_hash_fast_t * a_hash) +{ + dap_chain_cs_dag_event_item_t* l_event_item = NULL; + pthread_rwlock_rdlock( &PVT(a_dag)->events_rwlock ); + HASH_FIND(hh, PVT(a_dag)->events ,a_hash,sizeof(*a_hash), l_event_item); + dap_chain_cs_dag_event_t * l_event = l_event_item->event; + pthread_rwlock_unlock( &PVT(a_dag)->events_rwlock ); + return l_event; +} + + /** * @brief s_chain_callback_atom_verify Verify atomic element @@ -210,7 +325,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a * @param a_atom * @return */ -static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t * a_atom) +static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t * a_atom) { 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; @@ -232,13 +347,54 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t } } + +int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event) +{ + bool l_is_events_all_hashes = true; + bool l_is_events_main_hashes = true; + for (size_t i = 0; i< a_event->header.hash_count; i++) { + dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) a_event->hashes_n_datum_n_signs) + i; + dap_chain_cs_dag_event_item_t * l_event_search = NULL; + HASH_FIND(hh, PVT(a_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search); + if ( l_event_search == NULL ){ // If not found in events - search in treshhold + l_is_events_main_hashes = false; + HASH_FIND(hh, PVT(a_dag)->events_treshold ,l_hash ,sizeof (*l_hash), l_event_search); + if( l_event_search == NULL ){ // Hash is not in events or treshold table, keep the current item where it is + l_is_events_all_hashes = false; + break; + } + } + } + if( l_is_events_all_hashes && l_is_events_main_hashes ){ + return 0; + }else if ( ! l_is_events_all_hashes) { + return -1; + }else { + return 1; + } +} + /** * @brief dap_chain_cs_dag_proc_treshold * @param a_dag */ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag) { + // TODO Process finish treshold. For now - easiest from possible + pthread_rwlock_rdlock(&PVT(a_dag)->events_rwlock); + dap_chain_cs_dag_event_item_t * l_event_item = NULL, * l_event_item_tmp = NULL; + HASH_ITER(hh,PVT(a_dag)->events_treshold,l_event_item, l_event_item_tmp){ + dap_chain_cs_dag_event_t * l_event = l_event_item->event; + int ret = dap_chain_cs_dag_event_verify_hashes_with_treshold (a_dag,l_event); + if ( ret == 0){ // All its hashes are in main table, move thats one too into it + pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock); + pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock); + HASH_DEL(PVT(a_dag)->events_treshold,l_event_item); + HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash), l_event_item); + } + } + pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock); } @@ -247,7 +403,7 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag) * @param a_atom * @return */ -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_t * a_atom) +static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t * a_atom) { return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom); } @@ -269,7 +425,9 @@ static size_t s_chain_callback_atom_get_static_hdr_size() */ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ) { - return NULL; // TODO + dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); + l_atom_iter->chain = a_chain; + return l_atom_iter; } /** @@ -277,9 +435,12 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ * @param a_atom_iter * @return */ -static dap_chain_atom_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter ) { - return NULL; // TODO + a_atom_iter->cur = a_atom_iter->cur ? + (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL; + a_atom_iter->cur_item = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events; + return a_atom_iter->cur; } /** @@ -287,9 +448,25 @@ static dap_chain_atom_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_ite * @param a_atom_iter * @return */ -static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ) { - return NULL; // TODO + if (a_atom_iter->cur ){ + dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; + a_atom_iter->cur_item = l_event_item->hh.next; + l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; + if ( a_atom_iter->cur_item) + a_atom_iter->cur = l_event_item->event; + else { + dap_chain_cs_dag_event_item_t * l_event_search = NULL; + dap_chain_cs_dag_pvt_t * l_dag_pvt = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain)); + HASH_FIND(hh,l_dag_pvt->events,&l_event_item->hash,sizeof(l_event_item->hash),l_event_search); + if (l_event_search){ + a_atom_iter->cur_item = l_dag_pvt->events_treshold; + a_atom_iter->cur = l_dag_pvt->events_treshold ? l_dag_pvt->events_treshold->event : NULL ; + } + } + } + return a_atom_iter->cur; } /** @@ -298,48 +475,69 @@ static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_ite */ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ) { - // TODO + DAP_DELETE(a_atom_iter); } - - /** - * @brief s_chain_callback_datum_iter_create Create datum iterator - * @param a_chain + * @brief s_cli_dag + * @param argc + * @param argv + * @param str_reply * @return */ -static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain ) +static int s_cli_dag(int argc, const char ** argv, char **str_reply) { - return NULL; // TODO -} + enum { + SUBCMD_EVENT_CREATE, + SUBCMD_EVENT_CANCEL, + SUBCMD_EVENT_LIST, + SUBCMD_UNDEFINED=0 + } l_subcmd={0}; +// "dag net_name <chain net name> chain_name <chain name> event create datum_hash <datum hash from pool>\n" +// "dag net_name <chain net name> chain_name <chain name> event cancel event_hash <event hash from round_new>\n" +// "dag net_name <chain net name> chain_name <chain name> event list -/** - * @brief s_chain_callback_datum_iter_get_first Get the first datum - * @param a_datum_iter - * @return - */ -static dap_chain_datum_t* s_chain_callback_datum_iter_get_first(dap_chain_datum_iter_t * a_datum_iter ) -{ - return NULL; // TODO -} + int arg_index = 1; + const char *str_tmp = NULL; + char *str_reply_tmp = NULL; -/** - * @brief s_chain_callback_datum_iter_get_next Get the next dag event datum - * @param a_datum_iter - * @return - */ -static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter ) -{ - return NULL; // TODO -} + const char * l_net_name = NULL; -/** - * @brief s_chain_callback_datum_iter_delete Delete dag event datum iterator - * @param a_datum_iter - */ -static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_datum_iter ) -{ - // TODO -} + const char * l_chain_name = NULL; + + const char * l_event_cmd_str = NULL; + + const char* l_event_hash_str = NULL; + const char * l_datum_hash_str = NULL; + + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "net_name", &l_net_name); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "chain_name", &l_chain_name); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event", &l_event_cmd_str); + + if ( l_event_cmd_str && ( strcmp( l_event_cmd_str, "create" ) == 0 ) ) { + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event_hash", &l_event_hash_str); + l_subcmd = SUBCMD_EVENT_CREATE; + } else if ( l_event_cmd_str && ( strcmp( l_event_cmd_str, "cancel" ) == 0 ) ) { + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "datum_hash", &l_datum_hash_str); + l_subcmd = SUBCMD_EVENT_CANCEL; + } else if ( l_event_cmd_str && ( strcmp( l_event_cmd_str, "list" ) == 0 ) ) { + l_subcmd = SUBCMD_EVENT_LIST; + } + + switch ( l_subcmd ){ + case SUBCMD_EVENT_CREATE:{ + + }break; + case SUBCMD_EVENT_CANCEL:{ + + }break; + case SUBCMD_EVENT_LIST:{ + + }break; + default: { + + } + } +} diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h index af2604fddc75e25652aa365346b357dff340c20b..a50f675b55ff6a75aea12f57eea9e3973623905f 100755 --- a/dap_chain_cs_dag.h +++ b/dap_chain_cs_dag.h @@ -30,12 +30,23 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *); typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *); +typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *, + dap_chain_cell_id_t, + dap_chain_datum_t *, + dap_chain_hash_fast_t *, + size_t); + typedef struct dap_chain_cs_dag { dap_chain_t * chain; bool is_single_line; + bool is_celled; + + uint16_t datum_add_hashes_count; + char * events_round_new_gdb_group; + dap_chain_cs_dag_callback_t callback_delete; - dap_chain_cs_dag_callback_event_t callback_cs_input; + dap_chain_cs_dag_callback_event_create_t callback_cs_event_create; dap_chain_cs_dag_callback_event_t callback_cs_verify; void * _pvt; @@ -51,3 +62,5 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); void dap_chain_cs_dag_delete(dap_chain_t * a_chain); void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag); +dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag, + dap_chain_hash_fast_t * a_hash); diff --git a/dap_chain_cs_dag_event.c b/dap_chain_cs_dag_event.c index f42ce2752ff2e479c3a11eba6224124f90eb22bd..ae6d3401bf238c1c304e72da1170b8db28ca3f0a 100755 --- a/dap_chain_cs_dag_event.c +++ b/dap_chain_cs_dag_event.c @@ -35,14 +35,15 @@ /** * @brief dap_chain_cs_dag_event_new - * @param a_dag + * @param a_chain_id + * @param a_cell_id * @param a_datum * @param a_key * @param a_hashes * @param a_hashes_count * @return */ -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum ,dap_enc_key_t * a_key , dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count) { @@ -55,7 +56,9 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datu l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size ); - l_event_new->header.timestamp = (uint64_t) timegm(NULL); + l_event_new->header.ts_created = (uint64_t) timegm(NULL); + l_event_new->header.cell_id.uint64 = a_cell_id.uint64; + l_event_new->header.chain_id.uint64 = a_chain_id.uint64; memcpy(l_event_new->hashes_n_datum_n_signs, a_hashes, l_hashes_size ); memcpy(l_event_new->hashes_n_datum_n_signs+l_hashes_size, a_datum,l_datum_size ); diff --git a/dap_chain_cs_dag_event.h b/dap_chain_cs_dag_event.h index dcb92022db9792839e37012abb757c4264ffd33e..1c8bb07c6b2a8d17748a3e268d9729daac87a5e3 100755 --- a/dap_chain_cs_dag_event.h +++ b/dap_chain_cs_dag_event.h @@ -33,7 +33,9 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef struct dap_chain_class_dag_event_hdr { uint16_t version; - uint64_t timestamp; + uint64_t ts_created; + dap_chain_id_t chain_id; + dap_chain_cell_id_t cell_id; // Cell id if celled dag uint16_t hash_count; // Number of hashes uint16_t signs_count; // Number of signs nested with event } DAP_ALIGN_PACKED dap_chain_class_dag_event_hdr_t; @@ -44,7 +46,7 @@ typedef struct dap_chain_cs_dag_event { } DAP_ALIGN_PACKED dap_chain_cs_dag_event_t; -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum, +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum, dap_enc_key_t * a_key, dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count); @@ -84,6 +86,11 @@ static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size; } +/** + * @brief dap_chain_cs_dag_event_calc_size_excl_signs + * @param a_event + * @return + */ static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event) { size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);