diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c index eb70ffc82cbbb8f45cfd03d8d764e937eb4533e2..d0213e6ad8fbc81c379d7a1446b0f813c42f74d7 100755 --- a/dap_chain_cs_dag.c +++ b/dap_chain_cs_dag.c @@ -27,6 +27,7 @@ #include "uthash.h" #include "dap_common.h" +#include "dap_string.h" #include "dap_strfuncs.h" #include "dap_hash.h" #include "dap_chain_datum.h" @@ -34,6 +35,7 @@ #include "dap_chain_cs_dag.h" #include "dap_chain_global_db.h" #include "dap_chain_node_cli.h" +#include "dap_chain_net.h" #define LOG_TAG "dap_chain_cs_dag" @@ -69,7 +71,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first( dap_chain_ato 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); +static size_t s_chain_callback_events_round_new_add_datums(dap_chain_t * a_chain, 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 ); @@ -80,6 +82,7 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_ static int s_cli_dag(int argc, const char ** argv, char **str_reply); +static bool s_seed_mode = false; /** * @brief dap_chain_cs_dag_init * @return @@ -88,18 +91,18 @@ int dap_chain_cs_dag_init(void) { srand((unsigned int) time(NULL)); dap_chain_class_add( "dag", dap_chain_cs_dag_new ); - + s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); 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" + "\tCreate event from datum mempool element\n\n" + "dag -net <chain net name> -chain <chain name> event create -datum <datum hash>\n" + "\tRemove event from forming new round and put back its datum to mempool\n\n" + "dag -net <chain net name> -chain <chain name> event cancel -event <event hash>\n" + "\tDump event info\n\n" + "dag -net <chain net name> -chain <chain name> event dump -event <event hash> -from < events | events_lasts | round.new | round.<Round id in hex> >\n" + "\tShow event list \n\n" + "dag -net <chain net name> -chain <chain name> event list -from < events | events_lasts | round.new | round.<Round id in hex> \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" + "\t<event hash> Event hash from forming new round, must return back datum to mempool\n\n" ); log_it(L_NOTICE,"Initialized DAG chain items organization class"); return 0; @@ -139,7 +142,7 @@ 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; + a_chain->callback_datums_pool_proc = s_chain_callback_events_round_new_add_datums; // Datum operations callbacks /* @@ -154,7 +157,7 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) 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->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", + l_dag->gdb_group_events_round_new = 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)"); @@ -236,67 +239,91 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t * @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) +static size_t s_chain_callback_events_round_new_add_datums(dap_chain_t * a_chain, 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 ); + dap_global_db_obj_t ** l_events_round_new = dap_chain_global_db_gr_load(l_dag->gdb_group_events_round_new, &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; + + if (l_dag->is_single_line ) // If single line - no any link inside + l_hashes_int_size = 0; + 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) ); + size_t l_hashes_linked = 0; 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_hashes_int_size ){ + // Linking randomly with current new round set + 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 (uint16_t 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 + 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) ); + + // Check if we have enought hash links + if (l_hashes_linked<l_hashes_int_size ){ + log_it(L_ERROR,"Can't link new events randomly for 100 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 ){ + if ( PVT(l_dag)->events_lasts ){ // Take then the first one if any present + dap_chain_cs_dag_event_item_t *l_event_ext = PVT(l_dag)->events_lasts; + memcpy(&l_hashes[l_hashes_linked],& l_event_ext->hash,sizeof (l_event_ext->hash) ); + l_hashes_linked++; + HASH_DEL(PVT(l_dag)->events_lasts, l_event_ext); + } + if (l_hashes_linked || s_seed_mode ) { + dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked); + if ( l_event){ // Event is created + dap_chain_hash_fast_t l_event_hash; + dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash); + char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); + if( dap_chain_global_db_gr_set( l_event_hash_str, (uint8_t *) l_event, dap_chain_cs_dag_event_calc_size(l_event), + l_dag->gdb_group_events_round_new ) ){ + log_it(L_INFO,"Event %s placed in the new forming round",l_event_hash_str); + dap_chain_cs_dag_proc_event_round_new(l_dag); + l_datum_processed++; + }else { + log_it(L_ERROR,"Can't add new event to the new events round"); + break; + } + } } - 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; } @@ -347,6 +374,27 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt } } +/** + * @brief dap_chain_cs_dag_proc_event_round_new + * @param a_dag + */ +void dap_chain_cs_dag_proc_event_round_new(dap_chain_cs_dag_t *a_dag) +{ + +} + + +/** + * @brief s_dag_events_lasts_delete_linked_with_event + * @param a_dag + * @param a_event + */ +void s_dag_events_lasts_delete_linked_with_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event) +{ + +} + + 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) { @@ -391,7 +439,7 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag) 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); - + s_dag_events_lasts_delete_linked_with_event(a_dag, l_event); } } pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock); @@ -485,17 +533,15 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite * @param str_reply * @return */ -static int s_cli_dag(int argc, const char ** argv, char **str_reply) +static int s_cli_dag(int argc, const char ** argv, char **a_str_reply) { enum { SUBCMD_EVENT_CREATE, SUBCMD_EVENT_CANCEL, SUBCMD_EVENT_LIST, - SUBCMD_UNDEFINED=0 + SUBCMD_EVENT_DUMP, + SUBCMD_UNDEFINED=-1 } 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 int arg_index = 1; const char *str_tmp = NULL; @@ -508,36 +554,247 @@ static int s_cli_dag(int argc, const char ** argv, char **str_reply) const char * l_event_cmd_str = NULL; const char* l_event_hash_str = NULL; + dap_chain_hash_fast_t l_event_hash = {0}; const char * l_datum_hash_str = NULL; + const char * l_from_events_str = NULL; + + dap_chain_t * l_chain = NULL; + dap_chain_cs_dag_t * l_dag = NULL; + dap_chain_net_t * l_net = 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, "-net", &l_net_name); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain", &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; + if ( l_net_name == NULL){ + dap_chain_node_cli_set_reply_text(a_str_reply, "Need -net <net name> param!"); + return -1; } + l_net = dap_chain_net_by_name( l_net_name ); + if ( l_net == NULL ){ + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find network \"%s\"",l_net_name); + return -2; - switch ( l_subcmd ){ - case SUBCMD_EVENT_CREATE:{ + } - }break; - case SUBCMD_EVENT_CANCEL:{ + if ( l_chain_name == NULL){ + dap_chain_node_cli_set_reply_text(a_str_reply, "Need -chain <chain name> param!"); + return -3; + } + l_chain = dap_chain_net_get_chain_by_name(l_net,l_chain_name); + if ( l_chain == NULL ){ + dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find chain \"%s\" in network \"%s\"", + l_chain_name, l_net_name); + return -4; + } + l_dag = DAP_CHAIN_CS_DAG(l_chain); + + int ret = 0; + if ( l_event_cmd_str ) { + if ( strcmp( l_event_cmd_str, "create" ) == 0 ) { + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); + l_subcmd = SUBCMD_EVENT_CREATE; + } else if ( strcmp( l_event_cmd_str, "cancel" ) == 0 ) { + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); + l_subcmd = SUBCMD_EVENT_CANCEL; + } else if ( strcmp( l_event_cmd_str, "list" ) == 0 ) { + l_subcmd = SUBCMD_EVENT_LIST; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from", &l_from_events_str); + } else if ( strcmp( l_event_cmd_str,"dump") == 0 ) { + l_subcmd = SUBCMD_EVENT_DUMP; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from", &l_from_events_str); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); + } else { + l_subcmd = SUBCMD_UNDEFINED; + } - }break; - case SUBCMD_EVENT_LIST:{ + if (l_event_hash_str) + dap_chain_str_to_hash_fast(l_event_hash_str,&l_event_hash); + + switch ( l_subcmd ){ + case SUBCMD_EVENT_CREATE:{ + size_t l_datums_count=1; + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); + dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, + sizeof(dap_chain_datum_t*)*l_datums_count); + size_t l_datum_size = 0; + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_chain_global_db_gr_get( l_datum_hash_str , + &l_datum_size, + l_gdb_group_mempool); + l_datums[0] = l_datum; + if ( s_chain_callback_events_round_new_add_datums(l_chain,l_datums,l_datums_count ) == l_datums_count ){ + for ( size_t i = 0; i <l_datums_count; i++){ + dap_chain_hash_fast_t l_datum_hash; + dap_hash_fast(l_datums[i],dap_chain_datum_size(l_datums[i]),&l_datum_hash); + char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + if ( dap_chain_global_db_gr_del(l_datums_datum_hash_str,l_gdb_group_mempool ) ){ + dap_chain_node_cli_set_reply_text(a_str_reply, + "Converted datum %s from mempool to event in the new forming round ", + l_datums_datum_hash_str); + DAP_DELETE(l_datums_datum_hash_str); + ret = 0; + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Warning! Can't delete datum %s from mempool after conversion to event in the new forming round ", + l_datums_datum_hash_str); + ret = 1; + } + } + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Warning! Can't convert datum %s from mempool toevent in the new forming round ", + l_datum_hash_str); + ret = -12; - }break; - default: { + } + DAP_DELETE(l_gdb_group_mempool); + }break; + case SUBCMD_EVENT_CANCEL:{ + char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; + if ( dap_chain_global_db_gr_del(l_event_hash_str ,l_gdb_group_events ) ){ + dap_chain_node_cli_set_reply_text(a_str_reply, + "Successfuly removed event 0x%s from the new forming round ", + l_event_hash_str); + ret = 0; + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't remove event 0x%s from the new forming round ", + l_event_hash_str); + ret = -1; + } + }break; + case SUBCMD_EVENT_DUMP:{ + dap_chain_cs_dag_event_t * l_event = NULL; + size_t l_event_size = 0; + if ( l_from_events_str ){ + if ( strcmp(l_from_events_str,"round.new") == 0 ){ + const char * l_gdb_group_events = l_dag->gdb_group_events_round_new; + l_event = (dap_chain_cs_dag_event_t *) dap_chain_global_db_gr_get + ( l_event_hash_str ,&l_event_size,l_gdb_group_events ); + }else if ( strncmp(l_from_events_str,"round.",6) == 0){ + + }else if ( strcmp(l_from_events_str,"events_lasts") == 0){ + dap_chain_cs_dag_event_item_t * l_event_item = NULL; + HASH_FIND(hh,PVT(l_dag)->events_lasts,&l_event_hash,sizeof(l_event_hash),l_event_item); + if ( l_event_item ) + l_event = l_event_item->event; + else { + ret = -23; + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't find events %s in events_last table\n"); + break; + } + }else if ( strcmp(l_from_events_str,"events") == 0){ + dap_chain_cs_dag_event_item_t * l_event_item = NULL; + HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); + if ( l_event_item ) + l_event = l_event_item->event; + else { + ret = -24; + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't find events %s in events table\n"); + break; + } + + }else { + ret = -22; + dap_chain_node_cli_set_reply_text(a_str_reply, + "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, round.0x0123456789ABCDEF"); + break; + + } + } else { + ret = -21; + dap_chain_node_cli_set_reply_text(a_str_reply, + "No events_from option"); + break; + } + if ( l_event ){ + dap_string_t * l_str_tmp = dap_string_new(NULL); + char * l_ctime_tmp = NULL; + time_t l_ts_reated = (time_t) l_event->header.ts_created; + // Header + dap_string_append_printf(l_str_tmp,"Event 0x%s:\n", l_event_hash_str); + dap_string_append_printf(l_str_tmp,"\t\t\t\tversion: 0x%04sX\n",l_event->header.version); + dap_string_append_printf(l_str_tmp,"\t\t\t\tcell_id: 0x%016llX\n",l_event->header.cell_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\t\tchain_id: 0x%016llX\n",l_event->header.chain_id.uint64); + dap_string_append_printf(l_str_tmp,"\t\t\t\tts_created: %s\n",ctime_r(&l_ts_reated,l_ctime_tmp) ); + + // Hash links + dap_string_append_printf(l_str_tmp,"\t\t\t\thashes:\tcount: %us\n",l_event->header.hash_count); + for (uint16_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*sizeof (dap_chain_hash_fast_t)); + char * l_hash_str = dap_chain_hash_fast_to_str_new(l_hash); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\thash: %s\n",l_hash_str); + DAP_DELETE(l_hash_str); + } + size_t l_offset = l_event->header.hash_count*sizeof (dap_chain_hash_fast_t); + dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (l_event->hashes_n_datum_n_signs + l_offset); + size_t l_datum_size = dap_chain_datum_size(l_datum); + char buf[50]; + time_t l_datum_ts_create = (time_t) l_datum->header.ts_create; + + // Nested datum + dap_string_append_printf(l_str_tmp,"\t\t\t\tdatum:\tdatum_size: %u\n",l_datum_size); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tversion:=%0x02X\n", l_datum->header.version_id); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype_id:=%s\n", c_datum_type_str[l_datum->header.type_id]); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tts_create=%s\n",ctime_r( &l_datum_ts_create,buf )); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\tdata_size=%u\n", l_datum->header.data_size); + + // Signatures + dap_string_append_printf(l_str_tmp,"\t\t\t\tsigns:\tcount: %us\n",l_event->header.signs_count); + l_offset += l_datum_size; + while (l_offset + sizeof (l_event->header) < l_event_size ){ + dap_chain_sign_t * l_sign =(dap_chain_sign_t *) (l_event->hashes_n_datum_n_signs +l_offset); + size_t l_sign_size = dap_chain_sign_get_size(l_sign); + if (l_sign_size == 0 ){ + dap_string_append_printf(l_str_tmp,"\t\t\t\tERROR: wrong sign size 0, stop parsing headers\n"); + break; + } + dap_enc_key_t * l_sign_key = dap_chain_sign_to_enc_key(l_sign); + dap_chain_addr_t l_addr = {0}; + dap_chain_addr_fill(&l_addr,l_sign_key,&l_net->pub.id); + char * l_addr_str = dap_chain_addr_to_str(&l_addr); + dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype: %s\taddr: %s" + "n", dap_chain_sign_type_to_str( l_sign->header.type ), + l_addr_str ); + l_offset += l_sign_size; + DAP_DELETE( l_addr_str); + dap_enc_key_delete(l_sign_key); + } + + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); + dap_string_free(l_str_tmp,false); + ret=0; + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Can't find event 0x%s in the new forming round ", + l_event_hash_str); + ret=-10; + } + }break; + case SUBCMD_EVENT_LIST:{ + char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; + dap_global_db_obj_t ** l_objs; + size_t l_objs_count = 0; + l_objs = dap_chain_global_db_gr_load(l_gdb_group_events,&l_objs_count); + }break; + case SUBCMD_UNDEFINED: { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Undefined event subcommand %s ", + l_subcmd); + ret=-11; + } } + }else { + dap_chain_node_cli_set_reply_text(a_str_reply, + "Undefined subcommand"); + ret = -13; } + return ret; } diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h index a50f675b55ff6a75aea12f57eea9e3973623905f..8e7b9275b1646888e3e4f8e5bffe953c8188b960 100755 --- a/dap_chain_cs_dag.h +++ b/dap_chain_cs_dag.h @@ -30,8 +30,9 @@ 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); @@ -43,7 +44,7 @@ typedef struct dap_chain_cs_dag bool is_celled; uint16_t datum_add_hashes_count; - char * events_round_new_gdb_group; + char * gdb_group_events_round_new; dap_chain_cs_dag_callback_t callback_delete; dap_chain_cs_dag_callback_event_create_t callback_cs_event_create; @@ -62,5 +63,7 @@ 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); +void dap_chain_cs_dag_proc_event_round_new(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.h b/dap_chain_cs_dag_event.h index 1c8bb07c6b2a8d17748a3e268d9729daac87a5e3..4b51559b0b441681a818b2aa7984cecb3caa9044 100755 --- a/dap_chain_cs_dag_event.h +++ b/dap_chain_cs_dag_event.h @@ -33,6 +33,7 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef struct dap_chain_class_dag_event_hdr { uint16_t version; + uint64_t round_id; uint64_t ts_created; dap_chain_id_t chain_id; dap_chain_cell_id_t cell_id; // Cell id if celled dag