diff --git a/CMakeLists.txt b/CMakeLists.txt index 47adc29dc1f5d453e18e1878b83372cbb2756576..4eb71372f3de98d3f9b4d738d19bfa0c5b0acd13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.2-0") +set(CELLFRAME_SDK_NATIVE_VERSION "2.1-2") include(cmake/OS_Detection.cmake) add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c index 73c9257cb899dd7d91d63e676fbbdcf988ad40f8..d33a1a96b022361521045842c2cecf0014d7db30 100644 --- a/dap-sdk/net/client/dap_client.c +++ b/dap-sdk/net/client/dap_client.c @@ -207,8 +207,7 @@ void dap_client_delete(dap_client_t * a_client) pthread_mutex_unlock(&a_client->mutex); // a_client will be deleted in dap_events_socket_delete() -> free( a_es->_inheritor ); //DAP_DELETE(a_client); - DAP_DELETE(a_client); - a_client = NULL; + DAP_DEL_Z(a_client); } /** diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index f86c269f808a9bba0fec98d36f826061367a97c3..04e2fb58d3bf35dd8de1af9cd1bdaff81603749d 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -581,7 +581,7 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) } else if (a_client_pvt->last_error != ERROR_NETWORK_CONNECTION_TIMEOUT) { if(!l_is_last_attempt) { // small delay before next request - log_it(L_INFO, "Connection attempt № %d", a_client_pvt->connect_attempt); + log_it(L_INFO, "Connection attempt %d", a_client_pvt->connect_attempt); #ifdef _WIN32 Sleep(300);// 0.3 sec #else @@ -595,7 +595,7 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt) } else{ log_it(L_INFO, "Too many connection attempts. Tries are over."); - //a_client_pvt->stage_status = STAGE_STATUS_DONE; + a_client_pvt->stage_status = STAGE_STATUS_DONE; // unref pvt //l_is_unref = true; } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 5ab97105f5aef75bc8bbe5ba41ad5717d8d553dc..646f888ebce4b32d8cc91c9a8b64fc8f368a48f2 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -198,6 +198,30 @@ static int compare_datum_items(const void * l_a, const void * l_b) return 1; } + +/** + * @brief dap_chain_ledger_token_check + * @param a_ledger + * @param a_token + * @return + */ +int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger, dap_chain_datum_token_t *a_token) +{ + if ( !a_ledger){ + log_it(L_ERROR, "NULL ledger, can't add datum with token declaration!"); + return -1; + } + + dap_chain_ledger_token_item_t * l_token_item; + HASH_FIND_STR(PVT(a_ledger)->tokens,a_token->ticker,l_token_item); + if ( l_token_item != NULL ){ + log_it(L_WARNING,"Duplicate token declaration for ticker '%s' ", a_token->ticker); + return -3; + } + // Checks passed + return 0; +} + /** * @brief dap_chain_ledger_token_add * @param a_token @@ -226,13 +250,13 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger, dap_chain_datum_token_t HASH_ADD_STR(PVT(a_ledger)->tokens, ticker, l_token_item) ; switch(a_token->type){ - case DAP_CHAIN_DATUM_TOKEN_PRIVATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE: l_token_item->total_supply = a_token->header_private.total_supply; log_it( L_NOTICE, "Private token %s added (total_supply = %.1llf signs_valid=%hu signs_total=%hu type=DAP_CHAIN_DATUM_TOKEN_PRIVATE )", a_token->ticker, dap_chain_balance_to_coins(a_token->header_private.total_supply), a_token->header_private.signs_valid, a_token->header_private.signs_total); break; - case DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL: log_it( L_NOTICE, "Private token %s type=DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL )", a_token->ticker); break; default: @@ -283,6 +307,49 @@ dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags) return l_ledger; //dap_chain_ledger_load(l_ledger, "kelvin-testnet", "plasma"); } +int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, const dap_chain_datum_token_emission_t *a_token_emission + , size_t a_token_emission_size) +{ + int ret = 0; + dap_ledger_private_t *l_ledger_priv = PVT(a_ledger); + + const char * c_token_ticker = a_token_emission->hdr.ticker; + dap_chain_ledger_token_item_t * l_token_item = NULL; + pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock); + HASH_FIND_STR(l_ledger_priv->tokens, c_token_ticker, l_token_item); + pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); + + dap_chain_ledger_token_emission_item_t * l_token_emission_item = NULL; + + // check if such emission is already present in table + dap_chain_hash_fast_t l_token_emission_hash={0}; + //dap_chain_hash_fast_t * l_token_emission_hash_ptr = &l_token_emission_hash; + dap_hash_fast(a_token_emission, a_token_emission_size, &l_token_emission_hash); + char * l_hash_str = dap_chain_hash_fast_to_str_new(&l_token_emission_hash); + pthread_rwlock_rdlock( l_token_item ? + &l_token_item->token_emissions_rwlock : + &l_ledger_priv->treshold_emissions_rwlock + ); + HASH_FIND(hh,l_token_item ? l_token_item->token_emissions : l_ledger_priv->treshold_emissions, + &l_token_emission_hash, sizeof(l_token_emission_hash), l_token_emission_item); + if(l_token_emission_item ) { + log_it(L_ERROR, "Can't add token emission datum of %llu %s ( 0x%s ): already present in cache", + a_token_emission->hdr.value, c_token_ticker, l_hash_str); + ret = -1; + }else if ( (! l_token_item) && ( HASH_COUNT( l_ledger_priv->treshold_emissions) < s_treshold_emissions_max )) { + log_it(L_WARNING,"Treshold for emissions is overfulled (%lu max)", + s_treshold_emissions_max); + ret = -2; + } + + pthread_rwlock_unlock(l_token_item ? + &l_token_item->token_emissions_rwlock : + &l_ledger_priv->treshold_emissions_rwlock); + DAP_DELETE(l_hash_str); + + return ret; +} + /** * @brief dap_chain_ledger_token_emission_add * @param a_token_emission @@ -781,6 +848,32 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t return 0; } +/** + * @brief dap_chain_ledger_tx_check + * @param a_ledger + * @param a_tx + * @return + */ +int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx) +{ + if(!a_tx) + return -2; + dap_list_t *l_list_bound_items = NULL; + dap_list_t *l_list_tx_out = NULL; + + int l_ret_check; + if( (l_ret_check = dap_chain_ledger_tx_cache_check( + a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0){ + log_it (L_WARNING, "dap_chain_ledger_tx_add_check() tx not passed the check: code %d ",l_ret_check); + return -1; + } + dap_chain_hash_fast_t *l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx); + char l_tx_hash_str[70]; + dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str)); + //log_it ( L_INFO, "dap_chain_ledger_tx_add_check() check passed for tx %s",l_tx_hash_str); + return 0; +} + /** * Add new transaction to the cache list * diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h index 4949d81bacb612336e86e9c1f8a887fd77d3600f..4dbcedb0f5e0069968b5fedc21287e461a30149a 100644 --- a/modules/chain/include/dap_chain_ledger.h +++ b/modules/chain/include/dap_chain_ledger.h @@ -79,12 +79,16 @@ static inline dap_chain_hash_fast_t* dap_chain_node_datum_tx_calc_hash(dap_chain */ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx); + +int dap_chain_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx); + /** * Add new token datum * */ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token, size_t a_token_size); +int dap_chain_ledger_token_decl_add_check(dap_ledger_t * a_ledger,dap_chain_datum_token_t *a_token); /** * Add token emission datum @@ -92,6 +96,10 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,dap_chain_datum_token_t * int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger, const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size); +// Check if it addable +int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, + const dap_chain_datum_token_emission_t *a_token_emission, size_t a_token_emission_size); + dap_chain_datum_token_emission_t * dap_chain_ledger_token_emission_find(dap_ledger_t *a_ledger, const char *a_token_ticker, const dap_chain_hash_fast_t *a_token_emission_hash); diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 2ed6852bed2a226b0d4e606de01d6a68c40c0303..d8515e87228b90c82e41026dae4efc0968cc664b 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -61,4 +61,3 @@ dap_chain_datum_t * dap_chain_datum_create(uint16_t a_type_id, const void * a_da l_datum->header.ts_create =(uint64_t) time(NULL); return l_datum; } - diff --git a/modules/common/include/dap_chain_datum_token.h b/modules/common/include/dap_chain_datum_token.h index 78078d5d292677247b64df0a558655fa6451655f..695c7e02a6dd8ccca54a81e675c8008171bc22fc 100644 --- a/modules/common/include/dap_chain_datum_token.h +++ b/modules/common/include/dap_chain_datum_token.h @@ -62,13 +62,13 @@ typedef struct dap_chain_datum_token{ // Token declaration type // Simple private token decl -#define DAP_CHAIN_DATUM_TOKEN_PRIVATE 0x0001 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE 0x0001 // Extended declaration of privatetoken with in-time control -#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL 0x0002 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL 0x0002 // Token update -#define DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE 0x0003 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE 0x0003 // Open token with now ownership -#define DAP_CHAIN_DATUM_TOKEN_PUBLIC 0x0004 +#define DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC 0x0004 // Macros for token flags diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 357f3e6baaab4cac3402e0b1a3b21ae39d9bb7b9..817a8666efa59c87a67ec6423bfa442d6b46a531 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -273,7 +273,10 @@ static int s_net_states_proc(dap_chain_net_t * l_net) switch ( PVT(l_net)->state ){ case NET_STATE_OFFLINE:{ - PVT(l_net)->state_target = PVT(l_net)->state_new; + if (PVT(l_net)->state_new != NET_STATE_UNDEFINED) { + PVT(l_net)->state_target = PVT(l_net)->state_new; + PVT(l_net)->state_new = NET_STATE_UNDEFINED; + } // reset current link PVT(l_net)->links_count = 0; // delete all links @@ -717,7 +720,10 @@ static int s_net_states_proc(dap_chain_net_t * l_net) break; case NET_STATE_ONLINE: { - PVT(l_net)->state_target = PVT(l_net)->state_new; + if (PVT(l_net)->state_new != NET_STATE_UNDEFINED) { + PVT(l_net)->state_target = PVT(l_net)->state_new; + PVT(l_net)->state_new = NET_STATE_UNDEFINED; + } switch ( PVT(l_net)->state_target) { // disconnect case NET_STATE_OFFLINE: @@ -1960,13 +1966,21 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size; for(size_t i = 0; i < l_objs_size; i++) { dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value; - l_datums[i] = l_datum; - if(i < l_objs_size_tmp) { - char buf[50]; - time_t l_ts_create = (time_t) l_datum->header.ts_create; - log_it(L_INFO, "\t\t0x%s: type_id=%s ts_create=%s data_size=%u", - l_objs[i].key, c_datum_type_str[l_datum->header.type_id], - ctime_r(&l_ts_create, buf), l_datum->header.data_size); + int l_verify_datum= dap_chain_net_verify_datum_for_add( a_net, l_datum) ; + if (l_verify_datum != 0){ + log_it(L_WARNING, "Datum doesn't pass verifications (code %d), delete such datum from pool", + l_verify_datum); + dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + l_datums[i] = NULL; + }else{ + l_datums[i] = l_datum; + if(i < l_objs_size_tmp) { + char buf[50]; + time_t l_ts_create = (time_t) l_datum->header.ts_create; + log_it(L_INFO, "\t\t0x%s: type_id=%s ts_create=%s data_size=%u", + l_objs[i].key, c_datum_type_str[l_datum->header.type_id], + ctime_r(&l_ts_create, buf), l_datum->header.data_size); + } } } size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size); @@ -1983,6 +1997,15 @@ void dap_chain_net_proc_mempool (dap_chain_net_t * a_net) log_it(L_WARNING, "%s.%s: %d records not processed", a_net->pub.name, l_chain->name, l_datums_size - l_objs_processed); dap_chain_global_db_objs_delete(l_objs, l_objs_size); + + // Cleanup datums array + if(l_datums){ + for(size_t i = 0; i < l_objs_size; i++) { + if (l_datums[i]) + DAP_DELETE(l_datums[i]); + } + DAP_DEL_Z(l_datums); + } } else { log_it(L_INFO, "%s.%s: No records in mempool", a_net->pub.name, l_chain ? l_chain->name : "[no chain]"); @@ -2049,3 +2072,27 @@ dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_ } return l_list_groups; } + +/** + * @brief dap_chain_net_verify_datum_for_add + * @param a_net + * @param a_datum + * @return + */ +int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum ) +{ + if( ! a_datum) + return -10; + if( ! a_net ) + return -11; + + switch ( a_datum->header.type_id) { + case DAP_CHAIN_DATUM_TX: return dap_chain_ledger_tx_add_check( a_net->pub.ledger, + (dap_chain_datum_tx_t*) a_datum->data ); + case DAP_CHAIN_DATUM_TOKEN_DECL: return dap_chain_ledger_token_decl_add_check( a_net->pub.ledger, + (dap_chain_datum_token_t*) a_datum->data ); + case DAP_CHAIN_DATUM_TOKEN_EMISSION : return dap_chain_ledger_token_emission_add_check( a_net->pub.ledger, + (dap_chain_datum_token_emission_t*) a_datum->data, a_datum->header.data_size ); + default: return 0; + } +} diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 1f95a00da8600135fe02c8bcdb3db84648405c5a..bcdfbdd0f1c67d1190358a8197d28d25ee588678 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -270,22 +270,23 @@ void dap_chain_node_mempool_periodic(void *a_param) UNUSED(a_param); size_t l_net_count; bool l_mempool_auto; + bool l_mempool_auto_default = false; dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); for (int i = 0; i < l_net_count; i++) { - l_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", false); - if (!l_mempool_auto) { - dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net_list[i]); - switch (l_role.enums) { + dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net_list[i]); + + switch (l_role.enums) { case NODE_ROLE_ROOT: case NODE_ROLE_MASTER: case NODE_ROLE_ROOT_MASTER: case NODE_ROLE_CELL_MASTER: - l_mempool_auto = true; + l_mempool_auto_default = true; break; default: - break; - } + l_mempool_auto_default = false; } + + l_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default); if (l_mempool_auto) { dap_chain_t *l_chain; DL_FOREACH(l_net_list[i]->pub.chains, l_chain) { diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index e8f3bbcea090ab0d45724d8fa37bcbedc6e8da4b..14c7a183cb08342f4ea1a4d6456b065c3b351b82 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1,4 +1,4 @@ -/* +/* * Authors: * Dmitriy A. Gerasimov <gerasimov.dmitriy@demlabs.net> * Alexander Lysikov <alexander.lysikov@demlabs.net> @@ -86,7 +86,6 @@ #include "dap_chain_mempool.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_remote.h" -//#include "dap_chain_gdb.h" #include "dap_stream_ch_chain_net.h" #include "dap_stream_ch_chain.h" @@ -2116,76 +2115,63 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply l_gdb_group_mempool_tmp = l_gdb_group_mempool; } - dap_string_t * l_str_tmp = dap_string_new(NULL); - DL_FOREACH(l_net->pub.chains, l_chain) { - if(!l_gdb_group_mempool) { - l_gdb_group_mempool_tmp = dap_chain_net_get_gdb_group_mempool(l_chain); - } - size_t l_objs_size = 0; - dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool_tmp, &l_objs_size); - if(l_objs_size) { - dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name, - l_objs_size); - size_t l_datums_size = l_objs_size; - dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, - sizeof(dap_chain_datum_t*) * l_datums_size); - size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size; - for(size_t i = 0; i < l_objs_size; i++) { - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value; - l_datums[i] = l_datum; - if(i < l_objs_size_tmp) { - char buf[50]; - time_t l_ts_create = (time_t) l_datum->header.ts_create; - dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n", - l_objs[i].key, c_datum_type_str[l_datum->header.type_id], - ctime_r(&l_ts_create, buf), l_datum->header.data_size); - } - } - if(l_objs_size > 15) { - dap_string_append_printf(l_str_tmp, "...\n"); - } - - size_t l_objs_processed = 0; - int * l_procecced = DAP_NEW_Z_SIZE(int,l_objs_size); - for(size_t i = 0; i < l_objs_size; i++) { - int l_is_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums + i, 1); //l_datums_size - l_objs_processed += l_is_processed; - l_procecced[i] = l_is_processed; - } - DAP_DELETE(l_datums); - // Delete processed objects - size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed; - size_t l_objs_processed_cur = 0; - for(size_t i = 0; i < l_datums_size; i++) { - if(l_procecced[i]!=1) - continue; - dap_chain_global_db_gr_del( dap_strdup(l_objs[i].key), l_gdb_group_mempool_tmp); - l_objs_processed_cur++; - if(l_objs_processed_cur < l_objs_processed_tmp) { - dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n", - l_objs[i].key); + const char * l_datum_hash_str = NULL; + int ret = 0; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); + if(l_datum_hash_str) { + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain); + dap_string_t * l_str_tmp = dap_string_new(NULL); + 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); + size_t l_datum_size2= l_datum? dap_chain_datum_size( l_datum): 0; + if (l_datum_size != l_datum_size2 ){ + ret = -8; + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Corrupted datum %s, size by datum headers is %zd when in mempool is only %zd bytes", + l_datum_size2, l_datum_size); + }else{ + if(l_datum) { + char buf[50]; + time_t l_ts_create = (time_t) l_datum->header.ts_create; + dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n", + l_datum_hash_str, c_datum_type_str[l_datum->header.type_id], + ctime_r(&l_ts_create, buf), l_datum->header.data_size); + int l_verify_datum= dap_chain_net_verify_datum_for_add( l_net, l_datum) ; + if (l_verify_datum != 0){ + dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications (code %d) examine node log files", + l_verify_datum); + ret = -9; + }else{ + if (l_chain->callback_datums_pool_proc){ + if (l_chain->callback_datums_pool_proc(l_chain, &l_datum, 1) ==0 ){ + dap_string_append_printf(l_str_tmp, "Error! Datum doesn't pass verifications, examine node log files"); + ret = -6; + }else{ + dap_string_append_printf(l_str_tmp, "Datum processed well."); + if (dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str), l_gdb_group_mempool)){ + dap_string_append_printf(l_str_tmp, "Warning! Can't delete datum from mempool!"); + }else + dap_string_append_printf(l_str_tmp, "Removed datum from mempool"); + } + }else{ + dap_string_append_printf(l_str_tmp, "Error! Can't move to no-concensus chains from mempool"); + ret = -1; + } } + dap_string_append_printf(l_str_tmp, "\n"); + dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); + dap_string_free(l_str_tmp, true); + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str); + ret = -4; } - if(l_objs_processed > 15) { - dap_string_append_printf(l_str_tmp, "...\n"); - } - if(l_objs_processed < l_datums_size) - dap_string_append_printf(l_str_tmp, "%s.%s: %d records not processed\n", l_net->pub.name, l_chain->name, - l_datums_size - l_objs_processed); - dap_chain_global_db_objs_delete(l_objs, l_objs_size); - DAP_DELETE( l_procecced); - } - else { - dap_string_append_printf(l_str_tmp, "%s.%s: No records in mempool\n", l_net->pub.name, l_chain ? l_chain->name : "[no chain]"); } DAP_DELETE(l_gdb_group_mempool); - // only one time if group defined - if(l_gdb_group_mempool) - break; + } else { + dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]); + ret = -5; } - dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str); - dap_string_free(l_str_tmp, true); - return 0; + return ret; } @@ -2242,7 +2228,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply int l_arg_index = 1; const char * l_type_str = NULL; - uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE; + uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; const char * l_ticker = NULL; @@ -2284,7 +2270,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str); if (strcmp( l_type_str, "private") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE; + l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; }else{ dap_chain_node_cli_set_reply_text(a_str_reply, "token_update can't accept type \"%s\"", l_type_str); return -22; @@ -2294,7 +2280,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply size_t l_datum_data_offset = 0; switch(l_type){ - case DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE:{ dap_list_t *l_tsd_list = dap_list_alloc(); size_t l_tsd_total_size = 0; l_arg_index++; @@ -2431,7 +2417,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply // Create new datum token l_datum_token_update = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ; - l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE; + l_datum_token_update->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE; dap_snprintf(l_datum_token_update->ticker, sizeof(l_datum_token_update->ticker), "%s", l_ticker); l_datum_token_update->header_private_update.tsd_total_size = l_tsd_total_size; @@ -2466,7 +2452,7 @@ int com_token_update(int argc, char ** argv, void *arg_func, char ** a_str_reply return -8; } - dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_PRIVATE_UPDATE, l_datum_token_update, + dap_chain_datum_t * l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_UPDATE, l_datum_token_update, sizeof(l_datum_token_update->header_private) + l_datum_data_offset); size_t l_datum_size = dap_chain_datum_size(l_datum); @@ -2551,7 +2537,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) int l_arg_index = 1; const char * l_type_str = NULL; - uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE; + uint16_t l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; const char * l_ticker = NULL; @@ -2593,18 +2579,18 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) l_arg_index=dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-type", &l_type_str); if (strcmp( l_type_str, "private") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL; + l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; }else if (strcmp( l_type_str, "private_simple") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_PRIVATE; + l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; }else if (strcmp( l_type_str, "public_simple") == 0){ - l_type = DAP_CHAIN_DATUM_TOKEN_PUBLIC; + l_type = DAP_CHAIN_DATUM_TOKEN_TYPE_PUBLIC; } dap_chain_datum_token_t * l_datum_token = NULL; size_t l_datum_data_offset = 0; switch(l_type){ - case DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL:{ dap_list_t *l_tsd_list = dap_list_alloc(); size_t l_tsd_total_size = 0; uint16_t l_flags = 0; @@ -2687,7 +2673,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) log_it(L_DEBUG,"Prepeared TSD sections on %zd total size", l_tsd_total_size); // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)+l_tsd_total_size ) ; - l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE_DECL; + l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_PRIVATE_DECL; dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); l_datum_token->header_private_decl.flags = l_flags; log_it(L_DEBUG,"Token declaration '%s' initialized", l_datum_token->ticker); @@ -2748,7 +2734,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) }break; - case DAP_CHAIN_DATUM_TOKEN_PRIVATE:{ + case DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE:{ // Total supply value dap_chain_node_cli_find_option_val(argv, l_arg_index, argc, "-total_supply", &l_total_supply_str); @@ -2823,7 +2809,7 @@ int com_token_decl(int argc, char ** argv, void *arg_func, char ** a_str_reply) // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)); - l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_PRIVATE; + l_datum_token->type = DAP_CHAIN_DATUM_TOKEN_TYPE_SIMPLE; dap_snprintf(l_datum_token->ticker, sizeof(l_datum_token->ticker), "%s", l_ticker); l_datum_token->header_private.total_supply = l_total_supply; l_datum_token->header_private.signs_total = l_signs_total; diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 5780765f0b2319d572267354b149bc84524e7743..2b19601490269bec6ebfa8ff457d7d4858909e49 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -335,6 +335,7 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size); if ( l_lasts){ for(size_t i = 0; i < l_lasts_size; i++) { + pthread_mutex_lock(&l_node_client->wait_mutex); dap_chain_atom_item_t * l_item = NULL; dap_chain_hash_fast_t l_atom_hash; dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]), &l_atom_hash); @@ -347,6 +348,7 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha } //else // DAP_DELETE(l_lasts[i]); + pthread_mutex_unlock(&l_node_client->wait_mutex); } DAP_DELETE(l_lasts); } @@ -521,7 +523,7 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) CloseHandle( a_client->wait_cond ); #endif pthread_mutex_destroy(&a_client->wait_mutex); - DAP_DELETE(a_client); + DAP_DEL_Z(a_client); } } diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 8b76bfcf1b80bab2dd9ba984004fa09228b40d0b..463a6e777c4d46d4e445f648d362c6077acc9fea 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -60,7 +60,8 @@ typedef enum dap_chain_net_state{ NET_STATE_ADDR_REQUEST, // Waiting for address assign NET_STATE_SYNC_GDB, NET_STATE_SYNC_CHAINS, - NET_STATE_ONLINE + NET_STATE_ONLINE, + NET_STATE_UNDEFINED } dap_chain_net_state_t; typedef struct dap_chain_net{ @@ -151,3 +152,4 @@ char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net dap_chain_net_t **dap_chain_net_list(size_t *a_size); dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr); +int dap_chain_net_verify_datum_for_add(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum ); diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 29a3887054113c5211d3fdec933c433ab9f705e0..873be6125e2d4227abed8fe5fef109549bfd8ed5 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -208,7 +208,8 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) } } - l_dag->is_static_genesis_event = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_static_genesis_event",false); + l_dag->is_static_genesis_event = (l_static_genesis_event_hash_str != NULL) && dap_config_get_item_bool_default(a_chain_cfg,"dag","is_static_genesis_event",false); + l_dag->is_single_line = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_single_line",false); l_dag->is_celled = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_celled",false); l_dag->is_add_directy = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_add_directly",false); @@ -390,7 +391,19 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain for (size_t d = 0; d <a_datums_count ; d++){ dap_chain_datum_t * l_datum = a_datums[d]; + if(l_datum == NULL) // Was wrong datum thats not passed checks + continue; + + // Verify for correctness + dap_chain_net_t * l_net = dap_chain_net_by_id( a_chain->net_id); + int l_verify_datum= dap_chain_net_verify_datum_for_add( l_net, l_datum) ; + if (l_verify_datum != 0){ + log_it(L_WARNING, "Datum doesn't pass verifications (code %d)", + l_verify_datum); + continue; + } + // Prepare round if ( l_hashes_int_size && l_events_round_new_size){ // Linking randomly with current new round set size_t l_rnd_steps; @@ -555,13 +568,16 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash); log_it(L_WARNING, "Wrong genesis block %s (staticly predefined %s)",l_event_hash_str, l_genesis_event_hash_str); + DAP_DELETE(l_event_hash_str); + DAP_DELETE(l_genesis_event_hash_str); return -22; } + return 0; } int ret = l_dag->callback_cs_verify ( l_dag, l_event ); if (ret == 0 ){ - if ( PVT(l_dag)->events ) + if ( PVT(l_dag)->events ){ for (size_t i = 0; i< l_event->header.hash_count; i++) { dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs) + i; dap_chain_cs_dag_event_item_t * l_event_search = NULL; @@ -572,6 +588,7 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_pt } } + } return 0; }else {