diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index be05de54de7711e1c61ffed55571418f4b137330..c51072d2830f55eb89833676b988392c21d25f31 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -657,7 +657,12 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net, dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size) { - dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); + dap_chain_t *l_chain = NULL; + if(a_net->pub.default_chain) + l_chain = a_net->pub.default_chain; + else + dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX); + if(!l_chain) return NULL; // Make transfer transaction diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 2ccacb4614cf84997de23c7443371090955ae018..0864c057da64d0c68dfb7a46f57cdb194c8d8622 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1661,6 +1661,12 @@ int s_net_load(const char * a_net_name) } dap_list_free(l_prior_list); + const char* l_default_chain_name = dap_config_get_item_str(l_cfg , "general" , "default_chain"); + if(l_default_chain_name) + l_net->pub.default_chain = dap_chain_net_get_chain_by_name(l_net, l_default_chain_name); + else + l_net->pub.default_chain = NULL; + } else { log_it(L_ERROR,"Can't any chains for network %s",l_net->pub.name); PVT(l_net)->load_mode = false; diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index b11b20a1503bbf9b54bb33aba8b997295786aafd..3465ff818ac15aa88af1228e8dbf3440dd4f93da 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -75,6 +75,7 @@ typedef struct dap_chain_net{ char * gdb_nodes; dap_chain_t * chains; // double-linked list of chains + dap_chain_t * default_chain; dap_ledger_t *ledger; } pub; uint8_t pvt[]; diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 2b66650d17abe9ac2afda7b5fe91a9b25e71b70b..7f6f5be091435e0c1dc16af5a153ddcd6542001c 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -449,6 +449,7 @@ static void s_tun_create(void) log_it(L_CRITICAL, "ioctl(TUNSETIFF) error: '%s' ", strerror(errno)); close(s_raw_server->tun_ctl_fd); s_raw_server->tun_ctl_fd = -1; + s_raw_server->tun_fd = -1; } else { char buf[256]; log_it(L_NOTICE, "Bringed up %s virtual network interface (%s/%s)", s_raw_server->ifr.ifr_name, diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 698a24fe7af91cc236bf5bdff48423c423b2f59a..fa5d5b1a7118ad69ebb8054ed21e4d2203cc9c06 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -114,6 +114,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, void *arg_func, 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 bool s_seed_mode = false; /** @@ -244,7 +245,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) DAP_DELETE(l_dag->_pvt); } -int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ +static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event); switch (l_datum->header.type_id) { @@ -279,6 +280,18 @@ int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, return 0; } +static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ){ + HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item); + s_dag_events_lasts_process_new_last_event(a_dag, a_event_item); + + int res = a_dag->callback_cs_verify(a_dag,a_event_item->event); + + if(res == 0) + res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); + + return res; +} + /** * @brief s_chain_callback_atom_add Accept new event in dag * @param a_chain DAG object @@ -318,62 +331,18 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t DAP_DELETE(l_hash_str); return -3; } - HASH_ADD(hh, l_events,hash,sizeof (l_event_item->hash), l_event_item); - // save l_events to dag_pvt - if(l_add_to_threshold) - PVT(l_dag)->events_treshold = l_events; - else - PVT(l_dag)->events = l_events; - - //HASH_ADD(hh, PVT(l_dag)->events_treshold, hash, sizeof(l_event_item->hash), l_event_item); - pthread_rwlock_unlock( l_events_rwlock ); - if ( l_events == PVT(l_dag)->events){ - dap_chain_cs_dag_event_item_t * l_event_last = NULL; - // Check the events and update the lasts - for ( dap_chain_hash_fast_t * l_link_hash = (dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs ; - l_link_hash < ( dap_chain_hash_fast_t *) ( - l_event->hashes_n_datum_n_signs + l_event->header.hash_count*sizeof (*l_link_hash) ); - l_link_hash += sizeof (dap_chain_hash_fast_t ) ) { - l_event_last = NULL; - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); - HASH_FIND(hh,PVT(l_dag)->events_lasts_unlinked,l_link_hash,sizeof(*l_link_hash), l_event_last); - if ( l_event_last ){ // If present in unlinked - remove - HASH_DEL(PVT(l_dag)->events_lasts_unlinked,l_event_last); - DAP_DEL_Z(l_event_last); - } - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - } - // and then adds itself - l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); - l_event_last->ts_added = l_event_item->ts_added; - l_event_last->event = l_event; - dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_last->hash ); - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); - HASH_ADD(hh,PVT(l_dag)->events_lasts_unlinked,hash,sizeof (l_event_last->hash),l_event_last); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + int res = 0; + if(l_add_to_threshold){ + HASH_ADD(hh, PVT(l_dag)->events_treshold,hash,sizeof (l_event_item->hash), l_event_item); + }else{ + res = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item); } - if(!l_add_to_threshold){ - int ret_cs = l_dag->callback_cs_verify(l_dag,l_event); - if ( ret_cs != 0 ){ - log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret_cs); - return -2; - } - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); - int res_ledger = dap_chain_add_to_ledger(l_dag, a_chain->ledger, l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - - if(res_ledger < 0) - return res_ledger; - } - - // Now check the treshold if some events now are ready to move to the main table - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); while(dap_chain_cs_dag_proc_treshold(l_dag, a_chain->ledger)); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_unlock( l_events_rwlock ); - return 0; + return res; } /** @@ -645,16 +614,26 @@ void s_dag_events_lasts_delete_linked_with_event(dap_chain_cs_dag_t * a_dag, dap 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_item = NULL; - pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock); HASH_FIND(hh, PVT(a_dag)->events_lasts_unlinked ,l_hash ,sizeof (*l_hash), l_event_item); if ( l_event_item ){ HASH_DEL(PVT(a_dag)->events_lasts_unlinked,l_event_item); DAP_DEL_Z(l_event_item); } - pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock); } } +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){ + //delete linked with event + s_dag_events_lasts_delete_linked_with_event(a_dag, a_event_item->event); + + //add self + dap_chain_cs_dag_event_item_t * l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); + l_event_last->ts_added = a_event_item->ts_added; + l_event_last->event = a_event_item->event; + dap_hash_fast(l_event_last->event, dap_chain_cs_dag_event_calc_size(l_event_last->event),&l_event_last->hash ); + HASH_ADD(hh,PVT(a_dag)->events_lasts_unlinked,hash, sizeof(l_event_last->hash),l_event_last); +} + typedef enum{ DAP_THRESHOLD_OK = 0, @@ -719,13 +698,11 @@ bool dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a HASH_DEL(PVT(a_dag)->events_treshold,l_event_item); if(ret == DAP_THRESHOLD_OK){ - HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash), l_event_item); - int l_ledger_ret = dap_chain_add_to_ledger(a_dag, a_ledger, l_event_item); + s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item); res = true; }else if(ret == DAP_THRESHOLD_CONFLICTING) HASH_ADD(hh, PVT(a_dag)->events_treshold_conflicted, hash,sizeof (l_event_item->hash), l_event_item); - s_dag_events_lasts_delete_linked_with_event(a_dag, l_event); } } return res;