diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 5ab97105f5aef75bc8bbe5ba41ad5717d8d553dc..a020a853cbae3a48ec93b8413399c1d0c6e81c0f 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_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,48 @@ 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_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 +847,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_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() 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 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..58281f90737350e76fdea96ef85a56fceed8909c 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_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_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_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..e94553fddaa95e30bd36e6ed24c9e91666e51956 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1960,13 +1960,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( 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 +1991,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 +2066,8 @@ dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_ } return l_list_groups; } + +int dap_chain_net_verify_datum(dap_chain_net_t *a_net, dap_chain_datum_t * a_datum ) +{ + +} diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index e8f3bbcea090ab0d45724d8fa37bcbedc6e8da4b..52d7365202a72de98c5f476966ade6686b5f5008 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -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= dap_chain_datum_size( l_datum); + 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( 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/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 8b76bfcf1b80bab2dd9ba984004fa09228b40d0b..9e42ea0ae42655dc672ac87c899f2efa5a383d62 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -151,3 +151,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(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..8a4290424d9b0698bc1b9db7d74277388ec1ba52 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -390,7 +390,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( 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;