diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c index 6f9b3c7bfa3603c6e331074de3b31932594b0a79..46c2fa71d5957f37732974d73df4614d3ce7fa54 100644 --- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c +++ b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c @@ -153,7 +153,7 @@ static void s_callback_channel_pkt_free_unsafe(uint64_t node_addr_uint64) { void dap_stream_ch_chain_voting_pkt_broadcast(dap_chain_net_t * a_net, dap_list_t *a_sendto_nodes) { //if (dap_chain_net_get_state(a_net) == NET_STATE_ONLINE) { - pthread_rwlock_unlock(&s_pkt_items->rwlock_out); + pthread_rwlock_rdlock(&s_pkt_items->rwlock_out); // dap_list_t *l_node_list = dap_chain_net_get_node_list(a_net); //size_t l_nodes_count = dap_list_length(a_sendto_nodes); diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 2afb73402da10f3fd0b39c3ea16481e0b3f5d67f..7a4db683f1aedf0aea8dbf70be41f375abce29a1 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -53,10 +53,16 @@ #define LOG_TAG "dap_chain_cs_dag_poa" +typedef struct dap_chain_cs_dag_poa_presign_callback{ + dap_chain_cs_dag_poa_callback_t callback; + void *arg; +} dap_chain_cs_dag_poa_presign_callback_t; + typedef struct dap_chain_cs_dag_poa_pvt { dap_cert_t * events_sign_cert; dap_cert_t ** auth_certs; + dap_chain_cs_dag_poa_presign_callback_t *callback_pre_sign; char * auth_certs_prefix; uint16_t auth_certs_count; uint16_t auth_certs_count_verify; // Number of signatures, needed for event verification @@ -73,10 +79,10 @@ typedef struct dap_chain_cs_dag_poa_pvt typedef struct dap_chain_cs_dag_poa_callback_timer_arg { dap_chain_cs_dag_t * dag; char * l_event_hash_hex_str; - dap_chain_cs_dag_event_round_cfg_t event_round_cfg; + dap_chain_cs_dag_event_round_info_t event_round_info; } dap_chain_cs_dag_poa_callback_timer_arg_t; -static void s_callback_get_round_cfg(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); +static void s_callback_get_round_info(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_info_t * a_event_round_info); static void s_callback_delete(dap_chain_cs_dag_t * a_dag); static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg); @@ -88,9 +94,9 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ const char *a_key, const void *a_value, const size_t a_value_size); static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, char * a_event_hash_hex_str, - dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); + dap_chain_cs_dag_event_round_info_t * a_event_round_info); static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, - char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); + char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_info_t * a_event_round_info); static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_event_hash_hex_str); // CLI commands @@ -124,6 +130,29 @@ void dap_chain_cs_dag_poa_deinit(void) } +/* +// example +static int s_callback_presign_test(dap_chain_t *a_chain, + dap_chain_cs_dag_event_t* a_event, size_t a_event_size, void *a_arg) { + dap_chain_hash_fast_t l_event_hash; + dap_chain_cs_dag_event_calc_hash(a_event, a_event_size, &l_event_hash); + char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); + log_it(L_NOTICE,"Callback: %s, net_name:%s, event_hash:%s", (char*)a_arg, a_chain->net_name, l_event_hash_str); + return -1; // return 0 if passed +} + +// add callback +// dap_chain_cs_dag_poa_presign_callback_set(l_dag->chain, +// (dap_chain_cs_dag_poa_callback_t)s_callback_presign_test, "Presign callback test"); +*/ +void dap_chain_cs_dag_poa_presign_callback_set(dap_chain_t *a_chain, dap_chain_cs_dag_poa_callback_t a_callback, void *a_arg){ + dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG(a_chain); + dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT(DAP_CHAIN_CS_DAG_POA(l_dag)); + l_poa_pvt->callback_pre_sign = + (dap_chain_cs_dag_poa_presign_callback_t*)DAP_NEW_Z(dap_chain_cs_dag_poa_presign_callback_t); + l_poa_pvt->callback_pre_sign->callback = a_callback; + l_poa_pvt->callback_pre_sign->arg = a_arg; +} /** @@ -156,7 +185,6 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) } dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(l_chain); - //dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA( l_dag ) ; dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( l_dag ) ); const char * l_event_cmd_str = NULL; @@ -207,34 +235,34 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) ret = -1; if ( strcmp(l_event_cmd_str,"sign") == 0) { // Sign event command char * l_gdb_group_events = l_dag->gdb_group_events_round_new; - size_t l_event_size = 0; - dap_chain_cs_dag_event_t * l_event; - dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; - - if ( (l_event = dap_chain_cs_dag_event_gdb_get( l_event_hash_hex_str, &l_event_size, - l_gdb_group_events, &l_event_round_cfg )) == NULL ){ + size_t l_round_item_size = 0; + dap_chain_cs_dag_event_round_item_t *l_round_item = + (dap_chain_cs_dag_event_round_item_t *)dap_chain_global_db_gr_get( + l_event_hash_hex_str, &l_round_item_size, l_gdb_group_events); + if ( l_round_item == NULL ) { dap_chain_node_cli_set_reply_text(a_str_reply, "Can't find event in round.new - only place where could be signed the new event\n", l_event_hash_str); ret = -30; }else { - size_t l_event_size_new = 0; - dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, - &l_event_size_new, - l_chain_net, l_poa_pvt->events_sign_cert->enc_key); - if ( l_event_new ) { + size_t l_event_size = l_round_item->event_size; + dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); + size_t l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, + l_chain_net, l_poa_pvt->events_sign_cert->enc_key); + + if ( l_event_size_new ) { dap_chain_hash_fast_t l_event_new_hash; - dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash); + // dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash); + dap_chain_cs_dag_event_calc_hash(l_event, l_event_size_new, &l_event_new_hash); //size_t l_event_new_size = dap_chain_cs_dag_event_calc_size(l_event_new); char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); char * l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash); - //char * l_event_new_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_event_new_hash_hex_str); - bool l_event_is_ready = s_round_event_ready_minimum_check(l_dag, l_event_new, l_event_size_new, - l_event_new_hash_hex_str, &l_event_round_cfg); + bool l_event_is_ready = s_round_event_ready_minimum_check(l_dag, l_event, l_event_size_new, + l_event_new_hash_hex_str, &l_round_item->round_info); - if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new, - l_event_size_new, l_gdb_group_events, &l_event_round_cfg) ){ + if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event, + l_event_size_new, l_round_item, l_gdb_group_events)) { //&l_event_round_info) ){ if ( !dap_chain_global_db_gr_del( l_event_hash_hex_str, l_gdb_group_events) ) { // Delete old event ret = 1; dap_chain_node_cli_set_reply_text(a_str_reply, "Added new sign with cert \"%s\", event %s placed back in round.new\n" @@ -255,7 +283,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) ret = 0; // dap_chain_net_sync_gdb(l_chain_net); // Propagate changes in pool if (l_event_is_ready && l_poa_pvt->auto_round_complete) { // cs done (minimum signs & verify passed) - s_round_event_cs_done(l_dag, l_event_new, l_event_new_hash_hex_str, &l_event_round_cfg); + s_round_event_cs_done(l_dag, l_event, l_event_new_hash_hex_str, &l_round_item->round_info); } }else { @@ -272,7 +300,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) ret=-31; } - DAP_DELETE(l_event_new); + DAP_DELETE(l_event); DAP_DELETE(l_event_new_hash_hex_str); DAP_DELETE(l_event_new_hash_base58_str); } else { @@ -281,11 +309,9 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) l_event_hash_str); ret=-1; } - //DAP_DELETE(l_event_new); } - // DAP_DELETE( l_gdb_group_events ); - // DAP_DELETE(l_event_round_cfg); - DAP_DELETE(l_event); + // DAP_DELETE(l_event); + DAP_DELETE(l_round_item); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Command dag_poa requires subcommand 'sign'"); } @@ -299,6 +325,8 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) return ret; } + + /** * @brief s_cs_callback * dap_chain_callback_new_cfg_item_t->callback_init function. @@ -316,14 +344,18 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->callback_delete = s_callback_delete; l_dag->callback_cs_verify = s_callback_event_verify; l_dag->callback_cs_event_create = s_callback_event_create; - l_dag->callback_cs_get_round_cfg = s_callback_get_round_cfg; + l_dag->callback_cs_get_round_info = s_callback_get_round_info; + l_dag->callback_cs_event_round_sync = s_callback_event_round_sync; l_poa->_pvt = DAP_NEW_Z ( dap_chain_cs_dag_poa_pvt_t ); dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( l_poa ); if (dap_config_get_item_str(a_chain_cfg,"dag-poa","auth_certs_prefix") ) { l_poa_pvt->auth_certs_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag-poa","auth_certs_number",0); l_poa_pvt->auth_certs_count_verify = dap_config_get_item_uint16_default(a_chain_cfg,"dag-poa","auth_certs_number_verify",0); - l_poa_pvt->confirmations_timeout = dap_config_get_item_uint16_default(a_chain_cfg,"dag-poa","confirmations_timeout",600); + l_poa_pvt->confirmations_timeout = dap_config_get_item_uint32_default(a_chain_cfg,"dag-poa","confirmations_timeout",600); + l_poa_pvt->auto_confirmation = dap_config_get_item_bool_default(a_chain_cfg,"dag-poa","auto_confirmation",true); + l_poa_pvt->auto_round_complete = dap_config_get_item_bool_default(a_chain_cfg,"dag-poa","auto_round_complete",true); + l_poa_pvt->wait_sync_before_complete = dap_config_get_item_uint32_default(a_chain_cfg,"dag-poa","wait_sync_before_complete",180); l_poa_pvt->auth_certs_prefix = strdup ( dap_config_get_item_str(a_chain_cfg,"dag-poa","auth_certs_prefix") ); if (l_poa_pvt->auth_certs_count && l_poa_pvt->auth_certs_count_verify ) { l_poa_pvt->auth_certs = DAP_NEW_Z_SIZE ( dap_cert_t *, l_poa_pvt->auth_certs_count * sizeof(dap_cert_t)); @@ -343,11 +375,17 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) } log_it(L_NOTICE,"Initialized DAG-PoA consensus with %u/%u minimum consensus",l_poa_pvt->auth_certs_count,l_poa_pvt->auth_certs_count_verify); // Save old callback if present and set the call of its own (chain callbacks) + l_poa_pvt->callback_pre_sign = NULL; l_poa_pvt->prev_callback_created = l_dag->chain->callback_created; l_dag->chain->callback_created = s_callback_created; + +dap_chain_cs_dag_poa_presign_callback_set(l_dag->chain, + (dap_chain_cs_dag_poa_callback_t)s_callback_presign_test, "Presign callback test"); + return 0; } + typedef struct event_clean_dup_items { uint16_t signs_count; uint64_t ts_update; @@ -360,31 +398,31 @@ static event_clean_dup_items_t *s_event_clean_dup_items = NULL; static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_event_hash_hex_str) { char * l_gdb_group_events = a_dag->gdb_group_events_round_new; size_t l_event_size = 0; + size_t l_round_item_size = 0; + dap_chain_cs_dag_event_round_item_t * l_round_item = NULL; dap_chain_cs_dag_event_t * l_event; - dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; - if ( (l_event = dap_chain_cs_dag_event_gdb_get( a_event_hash_hex_str, &l_event_size, - l_gdb_group_events, &l_event_round_cfg )) == NULL ) { + + if ( (l_round_item = (dap_chain_cs_dag_event_round_item_t *)dap_chain_global_db_gr_get( + a_event_hash_hex_str, &l_round_item_size, l_gdb_group_events) ) == NULL ) { return; } + + l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs; + l_event_size = l_round_item->event_size; - //char * l_event_first_hash_str = dap_chain_hash_fast_to_str_new(&l_event_round_cfg.first_event_hash); size_t l_events_round_size = 0; - // dap_global_db_obj_t * l_events_round = dap_chain_global_db_gr_load(a_dag->gdb_group_events_round_new, &l_events_round_size ); dap_store_obj_t *l_events_round = dap_chain_global_db_driver_read(a_dag->gdb_group_events_round_new, NULL, &l_events_round_size); uint16_t l_max_signs_count = 0; //char * l_max_signs_hash; for (size_t l_index = 0; l_index<l_events_round_size; l_index++) { - // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) - // ((dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value)->event; - // size_t l_event_size = ((dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value)->event_size; dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)l_events_round[l_index].value; - dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event; - if ( memcmp(&l_event_round_cfg.first_event_hash, - &l_event_round_item->cfg.first_event_hash, sizeof(dap_chain_hash_fast_t)) == 0 ) { + dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event_n_signs; + if ( memcmp(&l_round_item->round_info.first_event_hash, + &l_event_round_item->round_info.first_event_hash, sizeof(dap_chain_hash_fast_t)) == 0 ) { event_clean_dup_items_t * l_item = DAP_NEW_Z(event_clean_dup_items_t); l_item->signs_count = l_event->header.signs_count; // l_item->ts_update = l_events_round[l_index].timestamp; - l_item->ts_update = l_event_round_item->cfg.ts_update; + l_item->ts_update = l_event_round_item->round_info.ts_update; l_item->hash_str = (char *)l_events_round[l_index].key; HASH_ADD_STR(s_event_clean_dup_items, hash_str, l_item); if ( l_event->header.signs_count > l_max_signs_count ) { @@ -421,15 +459,15 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, char * a_event_hash_hex_str, - dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { - if ( a_event->header.signs_count < a_event_round_cfg->confirmations_minimum ) { + dap_chain_cs_dag_event_round_info_t * a_event_round_info) { + if ( a_event->header.signs_count < a_event_round_info->confirmations_minimum ) { return false; } - a_dag->callback_cs_set_event_round_cfg(a_dag, a_event_round_cfg); + a_dag->callback_cs_set_event_round_info(a_dag, a_event_round_info); int l_ret_event_verify = a_dag->callback_cs_verify(a_dag, a_event, a_event_size); if ( l_ret_event_verify == 0 ) { - if (a_event_round_cfg->ts_confirmations_minimum_completed == (uint64_t)0) { - a_event_round_cfg->ts_confirmations_minimum_completed = (uint64_t)time(NULL); + if (a_event_round_info->ts_confirmations_minimum_completed == (uint64_t)0) { + a_event_round_info->ts_confirmations_minimum_completed = (uint64_t)time(NULL); } return true; } @@ -439,16 +477,16 @@ static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t * a_dag, dap_ch } static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, - char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { + char * a_event_hash_hex_str, dap_chain_cs_dag_event_round_info_t * a_event_round_info) { dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA( a_dag ); dap_chain_cs_dag_poa_callback_timer_arg_t * l_callback_arg = DAP_NEW_Z(dap_chain_cs_dag_poa_callback_timer_arg_t); l_callback_arg->dag = a_dag; l_callback_arg->l_event_hash_hex_str = dap_strdup(a_event_hash_hex_str); - memcpy(&l_callback_arg->event_round_cfg, a_event_round_cfg, sizeof(dap_chain_cs_dag_event_round_cfg_t)); - uint32_t l_timeout = a_event_round_cfg->confirmations_timeout; + memcpy(&l_callback_arg->event_round_info, a_event_round_info, sizeof(dap_chain_cs_dag_event_round_info_t)); + uint32_t l_timeout = a_event_round_info->confirmations_timeout; - if (a_event_round_cfg->ts_confirmations_minimum_completed == (uint64_t)0) { - a_event_round_cfg->ts_confirmations_minimum_completed = (uint64_t)time(NULL); + if (a_event_round_info->ts_confirmations_minimum_completed == (uint64_t)0) { + a_event_round_info->ts_confirmations_minimum_completed = (uint64_t)time(NULL); } if ( a_event->header.signs_count >= PVT(l_poa)->auth_certs_count) { @@ -461,8 +499,8 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e log_it(L_NOTICE,"Run timer %dsec. for Event %s", PVT(l_poa)->wait_sync_before_complete, a_event_hash_hex_str); } } - else if ( l_timeout > ((uint64_t)time(NULL) - a_event_round_cfg->ts_confirmations_minimum_completed) ) { - l_timeout = l_timeout - ((uint64_t)time(NULL) - a_event_round_cfg->ts_confirmations_minimum_completed); + else if ( l_timeout > ((uint64_t)time(NULL) - a_event_round_info->ts_confirmations_minimum_completed) ) { + l_timeout = l_timeout - ((uint64_t)time(NULL) - a_event_round_info->ts_confirmations_minimum_completed); // placement in chain by timer l_timeout += PVT(l_poa)->wait_sync_before_complete; if (dap_timerfd_start(l_timeout*1000, @@ -483,28 +521,33 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_e } } -static void s_callback_get_round_cfg(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { +static void s_callback_get_round_info(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_info_t * a_event_round_info) { dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag); dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT (l_poa); - a_event_round_cfg->confirmations_minimum = l_poa_pvt->auth_certs_count_verify; - a_event_round_cfg->confirmations_timeout = l_poa_pvt->confirmations_timeout; - a_event_round_cfg->ts_confirmations_minimum_completed = 0; + a_event_round_info->confirmations_minimum = l_poa_pvt->auth_certs_count_verify; + a_event_round_info->confirmations_timeout = l_poa_pvt->confirmations_timeout; + a_event_round_info->ts_confirmations_minimum_completed = 0; + a_event_round_info->reject_count = 0; } static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_callback_timer_arg_t * a_callback_arg) { dap_chain_cs_dag_t * l_dag = a_callback_arg->dag; dap_chain_net_t *l_net = dap_chain_net_by_id(l_dag->chain->net_id); char * l_gdb_group_events = l_dag->gdb_group_events_round_new; + dap_chain_cs_dag_event_round_item_t * l_round_item = NULL; dap_chain_cs_dag_event_t * l_event; size_t l_event_size = 0; - dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; + size_t l_round_item_size = 0; - if ( (l_event = dap_chain_cs_dag_event_gdb_get( a_callback_arg->l_event_hash_hex_str, &l_event_size, - l_gdb_group_events, &l_event_round_cfg )) == NULL ){ + if ( (l_round_item = (dap_chain_cs_dag_event_round_item_t *)dap_chain_global_db_gr_get( + a_callback_arg->l_event_hash_hex_str, &l_round_item_size, l_gdb_group_events) ) == NULL ) { log_it(L_NOTICE,"Can't find event %s in round.new. The hash may have changed by reason the addition of a new signature.", a_callback_arg->l_event_hash_hex_str); } else { + l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs; + l_event_size = l_round_item->event_size; + dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event, l_event_size); memcpy(l_new_atom, l_event, l_event_size); @@ -575,6 +618,9 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag) if ( l_poa_pvt->auth_certs_prefix ) free ( l_poa_pvt->auth_certs_prefix ); + if ( l_poa_pvt->callback_pre_sign ) + DAP_DELETE( l_poa_pvt->callback_pre_sign ); + DAP_DELETE ( l_poa->_pvt); } @@ -614,7 +660,6 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_size) { - dap_chain_net_t *l_net = dap_chain_net_by_id( a_dag->chain->net_id); if ( a_value == NULL || a_op_code != 'a' ) { @@ -622,44 +667,89 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ } dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag); + if ( !PVT(l_poa)->auto_confirmation ) { s_round_event_clean_dup(a_dag, a_key); // Delete dup for manual mode return 0; } - dap_chain_cs_dag_event_round_item_t *l_event_round_item = (dap_chain_cs_dag_event_round_item_t *)a_value; - size_t l_event_size = l_event_round_item->event_size; - dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_event_round_item->event; - // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_event_round_item->event, l_event_size); + dap_chain_cs_dag_event_round_item_t *l_round_item = + (dap_chain_cs_dag_event_round_item_t *)DAP_DUP_SIZE(a_value,a_value_size); + size_t l_event_size = l_round_item->event_size; + //dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs; + dap_chain_cs_dag_event_t * l_event = + (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); + if ( dap_chain_cs_dag_event_sign_exists(l_event, l_event_size, + l_net, PVT(l_poa)->events_sign_cert->enc_key) + || dap_chain_cs_dag_event_round_sign_exists(l_round_item, + l_net, PVT(l_poa)->events_sign_cert->enc_key) ) { + // if my sign exists + if (PVT(l_poa)->auto_round_complete) { + if ( s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, + a_key, &l_round_item->round_info) ) { + // cs done (minimum signs & verify passed) + s_round_event_cs_done(a_dag, l_event, a_key, &l_round_item->round_info); + } + } + DAP_DELETE(l_round_item); + DAP_DELETE(l_event); + return 0; + } + size_t l_event_size_new = 0; - dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size, - &l_event_size_new, l_net, - PVT(l_poa)->events_sign_cert->enc_key); + int ret = 0; + if ( !PVT(l_poa)->callback_pre_sign || !PVT(l_poa)->callback_pre_sign->callback + || (ret = PVT(l_poa)->callback_pre_sign->callback(a_dag->chain, + l_event, l_event_size, PVT(l_poa)->callback_pre_sign->arg)) == 0 ) { + l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, + l_net, PVT(l_poa)->events_sign_cert->enc_key); + } + else { + size_t l_round_item_size_new = 0; + // set sign for reject + if ( (l_round_item_size_new = dap_chain_cs_dag_event_round_sign_add(&l_round_item, a_value_size, + l_net, PVT(l_poa)->events_sign_cert->enc_key)) ) { + // event reject + log_it(L_NOTICE,"Can't sign Event %s Sign rejected by pre_sign callback, ret code=%d", a_key, ret); + l_round_item->round_info.reject_count++; + + if ( l_round_item->round_info.reject_count // check reject count + <= (PVT(l_poa)->auth_certs_count - l_round_item->round_info.confirmations_minimum) ) { + // update reject_count + dap_chain_cs_dag_event_gdb_set(a_key, l_event, l_event_size, + l_round_item, a_group); + } + else { + // delete from gdb if reject_count is max + dap_chain_global_db_gr_del(a_key, a_group); + } + } + // s_round_event_clean_dup(a_dag, a_key); + DAP_DELETE(l_round_item); + DAP_DELETE(l_event); + return 0; + } - if ( l_event_new ) { - char * l_gdb_group_events = a_dag->gdb_group_events_round_new; + if ( l_event_size_new ) { + //char * l_gdb_group_events = a_dag->gdb_group_events_round_new; dap_chain_hash_fast_t l_event_new_hash; - dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size_new, &l_event_new_hash); + dap_chain_cs_dag_event_calc_hash(l_event, l_event_size_new, &l_event_new_hash); char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); - bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event_new, l_event_size_new, - l_event_new_hash_hex_str, &l_event_round_item->cfg); - if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event_new, - l_event_size_new, l_gdb_group_events, &l_event_round_item->cfg) ){ - dap_chain_global_db_gr_del( a_key, l_gdb_group_events); // Delete old event + bool l_event_is_ready = s_round_event_ready_minimum_check(a_dag, l_event, l_event_size_new, + l_event_new_hash_hex_str, &l_round_item->round_info); + + if (dap_chain_cs_dag_event_gdb_set(l_event_new_hash_hex_str, l_event, + l_event_size_new, l_round_item, a_group)) { + dap_chain_global_db_gr_del(a_key, a_group); // Delete old event if (l_event_is_ready && PVT(l_poa)->auto_round_complete) { // cs done (minimum signs & verify passed) - s_round_event_cs_done(a_dag, l_event_new, l_event_new_hash_hex_str, &l_event_round_item->cfg); + s_round_event_cs_done(a_dag, l_event, l_event_new_hash_hex_str, &l_round_item->round_info); } } s_round_event_clean_dup(a_dag, l_event_new_hash_hex_str); // Delete dup - DAP_DELETE(l_event_new); } else { - // if (PVT(l_poa)->auto_round_complete) { - // if (s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, &l_event_round_item->cfg)){ - // s_round_event_cs_done(a_dag, l_event, a_key, &l_event_round_item->cfg); - // } - // } s_round_event_clean_dup(a_dag, a_key); // Delete dup } - + DAP_DELETE(l_round_item); + DAP_DELETE(l_event); return 0; } @@ -680,10 +770,10 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ a_dag_event, l_offset_from_beginning, a_dag_event_size); return -7; // Incorrest size } - uint16_t l_certs_count_verify = a_dag->use_event_round_cfg ? a_dag->event_round_cfg.confirmations_minimum + uint16_t l_certs_count_verify = a_dag->use_event_round_info ? a_dag->event_round_info.confirmations_minimum : l_poa_pvt->auth_certs_count_verify; - a_dag->use_event_round_cfg = false; - // if ( a_dag_event->header.signs_count >= l_poa_pvt->auth_certs_count_verify ){ + + a_dag->use_event_round_info = false; if ( a_dag_event->header.signs_count >= l_certs_count_verify ){ size_t l_verified = 0; for ( uint16_t i = 0; i < a_dag_event->header.signs_count; i++ ) { @@ -704,7 +794,6 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ l_verified++; } } - //return l_verified >= l_poa_pvt->auth_certs_count_verify ? 0 : -1; return l_verified >= l_certs_count_verify ? 0 : -1; }else if (a_dag_event->header.hash_count == 0){ dap_chain_hash_fast_t l_event_hash; diff --git a/modules/consensus/dag-poa/include/dap_chain_cs_dag_poa.h b/modules/consensus/dag-poa/include/dap_chain_cs_dag_poa.h index c437ff91d2f0f6f47e969196bab192cff9697609..5e47206823f2f4a85257267abe8506cce8b66e4c 100644 --- a/modules/consensus/dag-poa/include/dap_chain_cs_dag_poa.h +++ b/modules/consensus/dag-poa/include/dap_chain_cs_dag_poa.h @@ -25,6 +25,8 @@ #include "dap_chain_cs_dag.h" #include "dap_cert.h" +typedef int (*dap_chain_cs_dag_poa_callback_t)(dap_chain_t *, dap_chain_cs_dag_event_t*, size_t, void *); + typedef struct dap_chain_cs_dag_poa { dap_chain_t * chain; @@ -39,3 +41,5 @@ typedef struct dap_chain_cs_dag_poa int dap_chain_cs_dag_poa_init(void); void dap_chain_cs_dag_poa_deinit(void); dap_cert_t **dap_chain_cs_dag_poa_get_auth_certs(dap_chain_t *a_chain, size_t *a_auth_certs_count); +void dap_chain_cs_dag_poa_presign_callback_set(dap_chain_t *a_chain, + dap_chain_cs_dag_poa_callback_t a_callback, void *a_arg); diff --git a/modules/net/srv/include/dap_chain_net_srv_client.h b/modules/net/srv/include/dap_chain_net_srv_client.h index 93c2c95f338b2ec78016efdad8cc04f7212578df..815880d96824eae4984a056b40cfda809d85919b 100644 --- a/modules/net/srv/include/dap_chain_net_srv_client.h +++ b/modules/net/srv/include/dap_chain_net_srv_client.h @@ -24,7 +24,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #pragma once #include <stdint.h> -#include <time.h> +#include <sys/time.h> #include "dap_enc_key.h" diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index a839cad8010d8da0c46703f123a3913bfe51e3af..04f37bdd70393e65cccf33afaf48d55ed01ab185 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -121,7 +121,7 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_ static int s_cli_dag(int argc, char ** argv, char **str_reply); void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item); -static void s_dag_chain_cs_set_event_round_cfg(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); +static void s_dag_chain_cs_set_event_round_info(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_info_t * a_event_round_info); static bool s_seed_mode = false; static bool s_debug_more = false; @@ -248,8 +248,8 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->is_celled = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_celled",false); l_dag->is_add_directly = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_add_directly",false); l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1); - l_dag->use_event_round_cfg = false; - l_dag->callback_cs_set_event_round_cfg = s_dag_chain_cs_set_event_round_cfg; + l_dag->use_event_round_info = false; + l_dag->callback_cs_set_event_round_info = s_dag_chain_cs_set_event_round_info; char * l_round_new_str = dap_strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new")); dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); if(!l_dag->is_celled){ @@ -273,11 +273,11 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) return 0; } -static void s_dag_chain_cs_set_event_round_cfg(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg){ - memcpy(&a_dag->event_round_cfg, - a_event_round_cfg, - sizeof(dap_chain_cs_dag_event_round_cfg_t)); - a_dag->use_event_round_cfg = true; +static void s_dag_chain_cs_set_event_round_info(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_round_info_t * a_event_round_info){ + memcpy(&a_dag->event_round_info, + a_event_round_info, + sizeof(dap_chain_cs_dag_event_round_info_t)); + a_dag->use_event_round_info = true; } static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain) @@ -580,10 +580,8 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain 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 = l_events_round_new[l_index].value_len; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) - ((dap_chain_cs_dag_event_round_item_t *)l_events_round_new[l_index].value)->event; + ((dap_chain_cs_dag_event_round_item_t *)l_events_round_new[l_index].value)->event_n_signs; size_t l_event_size = ((dap_chain_cs_dag_event_round_item_t *)l_events_round_new[l_index].value)->event_size; dap_hash_fast(l_event, l_event_size,&l_hash); @@ -673,16 +671,22 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain dap_chain_hash_fast_t l_event_hash; dap_chain_cs_dag_event_calc_hash(l_event,l_event_size, &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(dap_strdup(l_event_hash_str), (uint8_t *)l_event, - // l_event_size, - // l_dag->gdb_group_events_round_new)) { - dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; - if ( l_dag->callback_cs_get_round_cfg ) { - l_dag->callback_cs_get_round_cfg(l_dag, &l_event_round_cfg); + dap_chain_cs_dag_event_round_info_t l_event_round_info; + if ( l_dag->callback_cs_get_round_info ) { + l_dag->callback_cs_get_round_info(l_dag, &l_event_round_info); } + + // set first event hash for round + memcpy(&l_event_round_info.first_event_hash, &l_event_hash, sizeof(dap_chain_hash_fast_t)); + dap_chain_cs_dag_event_round_item_t * l_round_item = + DAP_NEW_SIZE(dap_chain_cs_dag_event_round_item_t, + sizeof(dap_chain_cs_dag_event_round_item_t)+l_event_size); + memcpy(&l_round_item->round_info, &l_event_round_info, sizeof(dap_chain_cs_dag_event_round_info_t)); + l_round_item->data_size = l_round_item->event_size = 0; + if(dap_chain_cs_dag_event_gdb_set(l_event_hash_str, l_event, - l_event_size, l_dag->gdb_group_events_round_new, - &l_event_round_cfg)) { + l_event_size, l_round_item, l_dag->gdb_group_events_round_new)) { + //&l_event_round_info)) { log_it(L_INFO, "Event %s placed in the new forming round", l_event_hash_str); DAP_DELETE(l_event_hash_str); l_event_hash_str = NULL; @@ -1400,12 +1404,10 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) // Check if its ready or not for (size_t i = 0; i< l_objs_size; i++ ){ - // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t*) l_objs[i].value; - // size_t l_event_size = l_objs[i].value_len; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) - ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event; + ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event_n_signs; size_t l_event_size = ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event_size; - l_dag->callback_cs_set_event_round_cfg(l_dag, &((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->cfg); + l_dag->callback_cs_set_event_round_info(l_dag, &((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->round_info); int l_ret_event_verify; if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event,l_event_size) ) !=0 ){// if consensus accept the event dap_string_append_printf( l_str_ret_tmp, @@ -1604,20 +1606,23 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) } DAP_DELETE(l_event_hash_hex_str); DAP_DELETE(l_event_hash_base58_str); - // DAP_DELETE( l_gdb_group_events ); // dap_chain_net_sync_gdb(l_net); }break; case SUBCMD_EVENT_DUMP:{ + dap_chain_cs_dag_event_round_item_t * l_round_item = NULL; dap_chain_cs_dag_event_t * l_event = NULL; - dap_chain_cs_dag_event_round_cfg_t l_event_round_cfg; + // dap_chain_cs_dag_event_round_info_t l_event_round_info; 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 ); - l_event = dap_chain_cs_dag_event_gdb_get(l_event_hash_str, &l_event_size, - l_gdb_group_events, &l_event_round_cfg); + size_t l_round_item_size = 0; + l_round_item = (dap_chain_cs_dag_event_round_item_t *)dap_chain_global_db_gr_get( + l_event_hash_str, &l_round_item_size, l_gdb_group_events); + if (l_round_item) { + l_event_size = l_round_item->event_size; + l_event = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); + } }else if ( strncmp(l_from_events_str,"round.",6) == 0){ }else if ( strcmp(l_from_events_str,"events_lasts") == 0){ @@ -1668,22 +1673,24 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) dap_string_append_printf(l_str_tmp,"\nEvent %s:\n", l_event_hash_str); - // Round cfg + // Round info if ( strcmp(l_from_events_str,"round.new") == 0 ){ dap_string_append_printf(l_str_tmp, - "\t\tRound cfg:\n\t\t\t\tconfirmations_minimum: %d\n\t\t\t\tconfirmations_timeout: %d\n", - l_event_round_cfg.confirmations_minimum, - l_event_round_cfg.confirmations_timeout); - char * l_hash_str = dap_chain_hash_fast_to_str_new(&l_event_round_cfg.first_event_hash); + "\t\tRound info:\n\t\t\t\tconfirmations_minimum: %d\n\t\t\t\tconfirmations_timeout: %d\n" + "\t\t\t\tsigns reject: %d\n", + l_round_item->round_info.confirmations_minimum, + l_round_item->round_info.confirmations_timeout, + l_round_item->round_info.reject_count); + char * l_hash_str = dap_chain_hash_fast_to_str_new(&l_round_item->round_info.first_event_hash); dap_string_append_printf(l_str_tmp, "\t\t\t\tfirst_event_hash: %s\n", l_hash_str); DAP_DELETE(l_hash_str); dap_string_append_printf(l_str_tmp, "\t\t\t\tts_update: %s", - dap_ctime_r((time_t *)&l_event_round_cfg.ts_update, buf) ); - if (l_event_round_cfg.ts_confirmations_minimum_completed != 0) + dap_ctime_r((time_t *)&l_round_item->round_info.ts_update, buf) ); + if (l_round_item->round_info.ts_confirmations_minimum_completed != 0) dap_string_append_printf(l_str_tmp, "\t\t\t\tts_confirmations_minimum_completed: %s", - dap_ctime_r((time_t *)&l_event_round_cfg.ts_confirmations_minimum_completed, buf) ); + dap_ctime_r((time_t *)&l_round_item->round_info.ts_confirmations_minimum_completed, buf) ); } // Header @@ -1748,6 +1755,8 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) l_event_hash_str); ret=-10; } + DAP_DELETE(l_round_item); + DAP_DELETE(l_event); }break; case SUBCMD_EVENT_LIST:{ if( (l_from_events_str == NULL) || @@ -1761,17 +1770,14 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) dap_string_append_printf(l_str_tmp,"%s.%s: Found %zu records :\n",l_net->pub.name,l_chain->name,l_objs_count); for (size_t i = 0; i< l_objs_count; i++){ - // dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_objs[i].value; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) - ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event; + ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event_n_signs; char buf[50]; time_t l_ts_create = (time_t) l_event->header.ts_created; dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s", l_objs[i].key, dap_ctime_r( &l_ts_create,buf ) ); } - // bugs-3932 - //DAP_DELETE( l_gdb_group_events); if (l_objs && l_objs_count ) dap_chain_global_db_objs_delete(l_objs, l_objs_count); ret = 0; diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 1f07d12882dd1b97bff2c039c8eec4ebdb318462..34e8b17bbd180b3ba29c622e43b3398b81a136c1 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -109,52 +109,78 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t * @param l_key * @return */ -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, - size_t * a_event_size_new, +size_t dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, dap_chain_net_t * a_net, dap_enc_key_t * a_key) { - size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); - dap_chain_datum_t * l_datum = (dap_chain_datum_t*)(a_event->hashes_n_datum_n_signs + l_hashes_size); + assert(a_event_ptr); + dap_chain_cs_dag_event_t *l_event = *a_event_ptr; + size_t l_hashes_size = 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_hashes_size); size_t l_datum_size = dap_chain_datum_size(l_datum); - size_t l_event_size_excl_sign = sizeof(a_event->header)+l_hashes_size+l_datum_size; - // size_t l_event_size_excl_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event,a_event_size); + size_t l_event_size_excl_sign = sizeof(l_event->header)+l_hashes_size+l_datum_size; size_t l_event_size = a_event_size; - size_t l_event_signs_size = l_event_size - l_event_size_excl_sign; - dap_sign_t * l_sign = dap_sign_create(a_key,a_event,l_event_size_excl_sign,0); + dap_sign_t * l_sign = dap_sign_create(a_key,l_event,l_event_size_excl_sign,0); size_t l_sign_size = dap_sign_get_size(l_sign); dap_chain_addr_t l_addr = {0}; dap_chain_hash_fast_t l_pkey_hash; dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_net->pub.id); - char * l_addr_str = dap_chain_addr_to_str(&l_addr); size_t l_offset = l_hashes_size+l_datum_size; // checking re-sign from one address and calc signs size - while ( l_offset+sizeof(a_event->header) < l_event_size ) { - dap_sign_t * l_item_sign = (dap_sign_t *)(a_event->hashes_n_datum_n_signs +l_offset); - size_t l_sign_size = dap_sign_get_size(l_item_sign); + while ( l_offset+sizeof(l_event->header) < l_event_size ) { + dap_sign_t * l_item_sign = (dap_sign_t *)(l_event->hashes_n_datum_n_signs +l_offset); + size_t l_sign_item_size = dap_sign_get_size(l_item_sign); dap_chain_addr_t l_item_addr = {0}; dap_chain_hash_fast_t l_item_pkey_hash; dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash); dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id); // checking re-sign from one address if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) { + char * l_addr_str = dap_chain_addr_to_str(&l_addr); log_it(L_DEBUG, "Sign from this addr exists: %s", l_addr_str); DAP_DELETE(l_sign); DAP_DELETE(l_addr_str); - return NULL; + return 0; } - l_offset += l_sign_size; + l_offset += l_sign_item_size; } - // dap_chain_cs_dag_event_t * l_event_new = DAP_REALLOC(a_event, l_event_size+l_sign_size); - dap_chain_cs_dag_event_t * l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size+l_sign_size); - memcpy(l_event_new, a_event, l_event_size); - memcpy(l_event_new->hashes_n_datum_n_signs+l_offset, l_sign, l_sign_size); - *a_event_size_new = l_event_size+l_sign_size; - l_event_new->header.signs_count++; + + *a_event_ptr = l_event = DAP_REALLOC(l_event, l_event_size+l_sign_size); + memcpy(l_event->hashes_n_datum_n_signs+l_offset, l_sign, l_sign_size); + l_event->header.signs_count++; DAP_DELETE(l_sign); - DAP_DELETE(l_addr_str); - return l_event_new; + return l_event_size+l_sign_size; +} + +bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, + dap_chain_net_t * a_net, dap_enc_key_t * a_key) { + dap_sign_type_t l_sign_type = dap_sign_type_from_key_type(a_key->type); + size_t l_pub_key_size = 0; + uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); + dap_chain_hash_fast_t l_pkey_hash; + dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); + dap_chain_addr_t l_addr = {0}; + dap_chain_addr_fill(&l_addr, l_sign_type, &l_pkey_hash, a_net->pub.id); + DAP_DELETE(l_pub_key); + + size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); + dap_chain_datum_t * l_datum = (dap_chain_datum_t*)(a_event->hashes_n_datum_n_signs + l_hashes_size); + size_t l_datum_size = dap_chain_datum_size(l_datum); + size_t l_offset = l_hashes_size+l_datum_size; + while ( l_offset+sizeof(a_event->header) < a_event_size ) { + dap_sign_t * l_item_sign = (dap_sign_t *)(a_event->hashes_n_datum_n_signs +l_offset); + size_t l_sign_item_size = dap_sign_get_size(l_item_sign); + dap_chain_addr_t l_item_addr = {0}; + dap_chain_hash_fast_t l_item_pkey_hash; + dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash); + dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id); + if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) { + return true; + } + l_offset += l_sign_item_size; + } + return false; } /** @@ -186,25 +212,94 @@ dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event return NULL; } +size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size, + dap_chain_net_t * a_net, dap_enc_key_t * a_key) { + dap_chain_cs_dag_event_round_item_t *l_round_item = *a_round_item_ptr; + dap_sign_t * l_sign = dap_sign_create(a_key, &l_round_item->round_info.first_event_hash, sizeof(dap_chain_hash_fast_t), 0); + size_t l_sign_size = dap_sign_get_size(l_sign); + dap_chain_addr_t l_addr = {0}; + dap_chain_hash_fast_t l_pkey_hash; + dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); + dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_net->pub.id); + + size_t l_offset = l_round_item->event_size; + while ( l_offset < l_round_item->data_size ) { + dap_sign_t * l_item_sign = (dap_sign_t *)(l_round_item->event_n_signs+l_offset); + size_t l_sign_item_size = dap_sign_get_size(l_item_sign); + dap_chain_addr_t l_item_addr = {0}; + dap_chain_hash_fast_t l_item_pkey_hash; + dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash); + dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id); + if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) { + DAP_DELETE(l_sign); + return 0; + } + l_offset += l_sign_item_size; + } + *a_round_item_ptr = l_round_item = DAP_REALLOC(l_round_item, a_round_item_size+l_sign_size); + memcpy(l_round_item->event_n_signs+l_offset, l_sign, l_sign_size); + DAP_DELETE(l_sign); + l_round_item->data_size += l_sign_size; + return a_round_item_size+l_sign_size; +} + + +bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, + dap_chain_net_t * a_net, dap_enc_key_t * a_key) { + dap_sign_type_t l_sign_type = dap_sign_type_from_key_type(a_key->type); + size_t l_pub_key_size = 0; + uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); + dap_chain_hash_fast_t l_pkey_hash; + dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); + dap_chain_addr_t l_addr = {0}; + dap_chain_addr_fill(&l_addr, l_sign_type, &l_pkey_hash, a_net->pub.id); + DAP_DELETE(l_pub_key); + + size_t l_offset = a_round_item->event_size; + while ( l_offset < a_round_item->data_size ) { + dap_sign_t * l_item_sign = (dap_sign_t *)(a_round_item->event_n_signs +l_offset); + size_t l_sign_item_size = dap_sign_get_size(l_item_sign); + dap_chain_addr_t l_item_addr = {0}; + dap_chain_hash_fast_t l_item_pkey_hash; + dap_sign_get_pkey_hash(l_item_sign, &l_item_pkey_hash); + dap_chain_addr_fill(&l_item_addr, l_item_sign->header.type, &l_item_pkey_hash, a_net->pub.id); + if (memcmp(&l_addr, &l_item_addr, sizeof(l_item_addr)) == 0) { + return true; + } + l_offset += l_sign_item_size; + } + return false; +} + bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, - const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) + dap_chain_cs_dag_event_round_item_t * a_round_item, + const char *a_group) { - dap_chain_cs_dag_event_round_item_t * l_event_round_item = DAP_NEW_SIZE(dap_chain_cs_dag_event_round_item_t, - sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_size ); - l_event_round_item->event_size = a_event_size; - a_event_round_cfg->ts_update = (uint64_t)time(NULL); - // l_event_round_item->event = DAP_DUP_SIZE(a_event, a_event_size); - memcpy(&l_event_round_item->cfg, a_event_round_cfg, sizeof(dap_chain_cs_dag_event_round_cfg_t)); - memcpy(l_event_round_item->event, a_event, a_event_size); - bool ret = dap_chain_global_db_gr_set(a_event_hash_str, l_event_round_item, - dap_chain_cs_dag_event_round_item_get_size(l_event_round_item), + size_t l_signs_size = a_round_item->data_size-a_round_item->event_size; + uint8_t *l_signs = (uint8_t*)DAP_DUP_SIZE(a_round_item->event_n_signs+a_round_item->event_size, l_signs_size); + + dap_chain_cs_dag_event_round_item_t * l_round_item = DAP_NEW_SIZE(dap_chain_cs_dag_event_round_item_t, + sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_size+l_signs_size ); + + l_round_item->event_size = a_event_size; + l_round_item->data_size = a_event_size+l_signs_size; + + memcpy(&l_round_item->round_info, &a_round_item->round_info, sizeof(dap_chain_cs_dag_event_round_info_t)); + memcpy(l_round_item->event_n_signs, a_event, a_event_size); + memcpy(l_round_item->event_n_signs+a_event_size, l_signs, l_signs_size); + + l_round_item->round_info.ts_update = (uint64_t)time(NULL); + + bool ret = dap_chain_global_db_gr_set(a_event_hash_str, l_round_item, + dap_chain_cs_dag_event_round_item_get_size(l_round_item), a_group); - DAP_DELETE(l_event_round_item); + + DAP_DELETE(l_round_item); return ret; } dap_chain_cs_dag_event_t* dap_chain_cs_dag_event_gdb_get(const char *a_event_hash_str, size_t *a_event_size, const char *a_group, - dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg) { + dap_chain_cs_dag_event_round_info_t * a_event_round_info) { size_t l_event_round_item_size = 0; dap_chain_cs_dag_event_round_item_t* l_event_round_item = (dap_chain_cs_dag_event_round_item_t*)dap_chain_global_db_gr_get(a_event_hash_str, &l_event_round_item_size, a_group ); @@ -212,8 +307,8 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_event_gdb_get(const char *a_event_has return NULL; size_t l_event_size = l_event_round_item->event_size; dap_chain_cs_dag_event_t* l_event = DAP_NEW_SIZE(dap_chain_cs_dag_event_t, l_event_size); - memcpy(a_event_round_cfg, &l_event_round_item->cfg, sizeof(dap_chain_cs_dag_event_round_cfg_t)); - memcpy(l_event, l_event_round_item->event, l_event_size); + memcpy(a_event_round_info, &l_event_round_item->round_info, sizeof(dap_chain_cs_dag_event_round_info_t)); + memcpy(l_event, l_event_round_item->event_n_signs, l_event_size); DAP_DELETE(l_event_round_item); *a_event_size = l_event_size; return l_event; diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index dcfc83dd4cd72274a2299a4f5bb6857f2a54dd5a..c497d75205d699b969328ae0762b394d0c6da89c 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -36,8 +36,8 @@ typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(d dap_chain_hash_fast_t *, size_t, size_t*); -typedef void (*dap_chain_cs_dag_callback_get_round_cfg_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_round_cfg_t *); -typedef void (*dap_chain_cs_dag_callback_set_event_round_cfg_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_round_cfg_t *); +typedef void (*dap_chain_cs_dag_callback_get_round_info_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_round_info_t *); +typedef void (*dap_chain_cs_dag_callback_set_event_round_info_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_round_info_t *); typedef int (*dap_chain_cs_dag_callback_event_round_sync_t)(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_size); @@ -57,8 +57,8 @@ typedef struct dap_chain_cs_dag dap_chain_hash_fast_t static_genesis_event_hash; dap_chain_cs_dag_hal_item_t *hal; - dap_chain_cs_dag_event_round_cfg_t event_round_cfg; // for verify function - bool use_event_round_cfg; + dap_chain_cs_dag_event_round_info_t event_round_info; // for verify function + bool use_event_round_info; uint16_t datum_add_hashes_count; char * gdb_group_events_round_new; @@ -66,8 +66,8 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_callback_t callback_delete; dap_chain_cs_dag_callback_event_create_t callback_cs_event_create; dap_chain_cs_dag_callback_event_t callback_cs_verify; - dap_chain_cs_dag_callback_get_round_cfg_t callback_cs_get_round_cfg; - dap_chain_cs_dag_callback_set_event_round_cfg_t callback_cs_set_event_round_cfg; + dap_chain_cs_dag_callback_get_round_info_t callback_cs_get_round_info; + dap_chain_cs_dag_callback_set_event_round_info_t callback_cs_set_event_round_info; dap_chain_cs_dag_callback_event_round_sync_t callback_cs_event_round_sync; void * _pvt; diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h index 66897d0a660d2e29370ca7cee3818eaa6ec4da3f..d46c7d2fa1e98c0ce576b7b12062d8d18857a3ee 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -47,18 +47,20 @@ typedef struct dap_chain_cs_dag_event { uint8_t hashes_n_datum_n_signs[]; // Hashes, signes and datum } DAP_ALIGN_PACKED dap_chain_cs_dag_event_t; -typedef struct dap_chain_cs_dag_event_round_cfg { +typedef struct dap_chain_cs_dag_event_round_info { uint16_t confirmations_minimum; // param auth_certs_count_verify in PoA uint32_t confirmations_timeout; // wait confirmations over minimum value (confirmations_minimum) uint64_t ts_confirmations_minimum_completed; uint64_t ts_update; + uint16_t reject_count; dap_chain_hash_fast_t first_event_hash; // first event hash in round -} DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_cfg_t; +} DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_info_t; typedef struct dap_chain_cs_dag_event_round_item { - dap_chain_cs_dag_event_round_cfg_t cfg; + dap_chain_cs_dag_event_round_info_t round_info;// cfg; uint32_t event_size; - uint8_t event[]; // event // dap_chain_cs_dag_event_t + uint32_t data_size; + uint8_t event_n_signs[]; // event // dap_chain_cs_dag_event_t } DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_item_t; 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, @@ -80,9 +82,17 @@ static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_d dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src, size_t a_event_size); // Important: returns new deep copy of event -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, - size_t * a_event_size_new, - dap_chain_net_t * a_net, dap_enc_key_t * a_key); +// dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, +// size_t * a_event_size_new, +// dap_chain_net_t * a_net, dap_enc_key_t * a_key); +size_t dap_chain_cs_dag_event_sign_add( dap_chain_cs_dag_event_t **a_event_ptr, size_t a_event_size, + dap_chain_net_t * a_net, dap_enc_key_t * a_key); +size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t **a_round_item_ptr, size_t a_round_item_size, + dap_chain_net_t * a_net, dap_enc_key_t * a_key); +bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_t a_event_size, + dap_chain_net_t * a_net, dap_enc_key_t * a_key); +bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, + dap_chain_net_t * a_net, dap_enc_key_t * a_key); dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number); /** @@ -141,12 +151,13 @@ static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a } static inline size_t dap_chain_cs_dag_event_round_item_get_size(dap_chain_cs_dag_event_round_item_t * a_event_round_item){ - return sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_round_item->event_size; + return sizeof(dap_chain_cs_dag_event_round_item_t)+a_event_round_item->data_size; } bool dap_chain_cs_dag_event_gdb_set(char *a_event_hash_str, dap_chain_cs_dag_event_t * a_event, size_t a_event_size, - const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); + dap_chain_cs_dag_event_round_item_t * a_round_item, + const char *a_group); dap_chain_cs_dag_event_t* dap_chain_cs_dag_event_gdb_get(const char *a_event_hash_str, size_t *a_event_size, - const char *a_group, dap_chain_cs_dag_event_round_cfg_t * a_event_round_cfg); + const char *a_group, dap_chain_cs_dag_event_round_info_t * a_event_round_info);