diff --git a/dap-sdk b/dap-sdk index 00ddbd2a45eb69e26b36eb50920b005fee7c9461..325d5d67549c076a5a69c37987033ae55e029f95 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 00ddbd2a45eb69e26b36eb50920b005fee7c9461 +Subproject commit 325d5d67549c076a5a69c37987033ae55e029f95 diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index a835fdc847b621678a30fc02eb7b9864fe8f0d02..a4f63e038b1a4d298b756c4e3b4db1b4dc0abce1 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -686,18 +686,18 @@ bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_ bool l_ret = false; dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id, 0); dap_chain_atom_ptr_t * l_lasts_atom; - size_t l_lasts_atom_count=0; - size_t* l_lasts_atom_size =NULL; - l_lasts_atom = a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count,&l_lasts_atom_size); - if (l_lasts_atom&& l_lasts_atom_count){ + size_t l_lasts_atom_count = 0; + size_t* l_lasts_atom_size = NULL; + l_lasts_atom = a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count, &l_lasts_atom_size); + if (l_lasts_atom && l_lasts_atom_count) { assert(l_lasts_atom_size[0]); assert(l_lasts_atom[0]); if(a_atom_hash){ - dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0],a_atom_hash); - if(dap_log_level_get() <= L_DEBUG){ - char l_hash_str[128]={[0]='\0'}; - dap_chain_hash_fast_to_str(a_atom_hash,l_hash_str,sizeof (l_hash_str)-1); - log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str); + dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0], a_atom_hash); + if(dap_log_level_get() <= L_DEBUG) { + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_atom_hash, l_hash_str, sizeof(l_hash_str)); + log_it(L_DEBUG, "Send sync chain request from %s to infinity",l_hash_str); } } l_ret = true; @@ -750,11 +750,10 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) } const char *cert_name = cert->name; size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir); - char *cert_path = DAP_NEW_Z_SIZE(char, cert_path_length); + char *cert_path = DAP_NEW_STACK_SIZE(char, cert_path_length); snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name); // In cert_path resolve all `..` and `.`s char *cert_path_c = dap_canonicalize_filename(cert_path, NULL); - DAP_DELETE(cert_path); // Protect the ca folder from using "/.." in cert_name if(dap_strncmp(s_system_chain_ca_dir, cert_path_c, dap_strlen(s_system_chain_ca_dir))) { log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir); @@ -769,6 +768,53 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) return l_ret; } +int dap_chain_datum_unledgered_search_iter(dap_chain_datum_t* a_datum, dap_chain_t* a_chain) +{ + /* Only for datum types which do not appear in ledger */ + switch (a_datum->header.type_id) { + case DAP_CHAIN_DATUM_TOKEN_DECL: + case DAP_CHAIN_DATUM_TOKEN_EMISSION: + case DAP_CHAIN_DATUM_TX: + return 0; + /* The types above are checked while adding to ledger, otherwise let's unfold the chains */ + default: { + if (!a_chain->callback_atom_get_datums) { + log_it(L_WARNING, "No callback set to fetch datums from atom in chain '%s'", a_chain->name); + return -2; + } + int l_found = 0; + dap_chain_hash_fast_t l_datum_hash; + dap_hash_fast(a_datum, dap_chain_datum_size(a_datum), &l_datum_hash); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->cells->id, 0); + size_t l_atom_size = 0; + for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); + l_atom && l_atom_size && !l_found; + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) + { + size_t l_datums_count = 0; + dap_chain_datum_t **l_datums = a_chain->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count); + for (size_t i = 0; i < l_datums_count; ++i) { + if ((*(l_datums + i))->header.type_id != a_datum->header.type_id) { + break; + } + dap_chain_hash_fast_t l_datum_i_hash; + dap_hash_fast(*(l_datums + i), dap_chain_datum_size(*(l_datums + i)), &l_datum_i_hash); + if (!memcmp(&l_datum_i_hash, &l_datum_hash, DAP_CHAIN_HASH_FAST_SIZE)) { + char l_datum_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_hash_fast_to_str(&l_datum_hash, l_datum_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); + log_it(L_INFO, "Datum %s found in chain %lu", l_datum_hash_str, a_chain->id.uint64); + l_found = 1; + break; + } + } + DAP_DEL_Z(l_datums); + } + a_chain->callback_atom_iter_delete(l_atom_iter); + return l_found; + } /* default */ + } +} + const char* dap_chain_get_path(dap_chain_t *a_chain){ return DAP_CHAIN_PVT(a_chain)->file_storage_dir; } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 02e5f7198a9d01a4f84ebdb4440b49e8f0ba7c0d..29b2df85cbffaee81c84febca1ad6835a4d2de5f 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -595,18 +595,14 @@ dap_chain_datum_token_t *dap_chain_ledger_token_ticker_check(dap_ledger_t * a_le static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_datum_tx_t *a_tx, const char *a_hash_out_type, dap_chain_hash_fast_t *a_tx_hash) { - // transaction time char l_time_str[32] = "unknown"; if (a_tx->header.ts_created) { uint64_t l_ts = a_tx->header.ts_created; dap_ctime_r(&l_ts, l_time_str); } - char *l_tx_hash_str; - if (!dap_strcmp(a_hash_out_type, "hex")) { - l_tx_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); - } else { - l_tx_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash); - } + char *l_tx_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(a_tx_hash) + : dap_chain_hash_fast_to_str_new(a_tx_hash); dap_string_append_printf(a_str_out, "TX hash %s \n\t%s",l_tx_hash_str, l_time_str); DAP_DELETE(l_tx_hash_str); } @@ -1788,11 +1784,11 @@ static void s_threshold_txs_free(dap_ledger_t *a_ledger){ HASH_ITER(hh, l_pvt->threshold_txs, l_current, l_tmp) { if (l_current->ts_added < l_time_cut_off) { HASH_DEL(l_pvt->threshold_txs, l_current); - char *l_hash_tx = dap_chain_hash_fast_to_str_new(&l_current->tx_hash_fast); + char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_current->tx_hash_fast, l_tx_hash_str, sizeof(l_tx_hash_str)); DAP_DELETE(l_current->tx); DAP_DELETE(l_current); - log_it(L_NOTICE, "Removed transaction %s form threshold ledger", l_hash_tx); - DAP_DELETE(l_hash_tx); + log_it(L_NOTICE, "Removed transaction %s form threshold ledger", l_tx_hash_str); } } pthread_rwlock_unlock(&l_pvt->threshold_txs_rwlock); @@ -1810,11 +1806,11 @@ static void s_threshold_emission_free(dap_ledger_t *a_ledger){ pthread_rwlock_wrlock(&l_pvt->threshold_emissions_rwlock); HASH_ITER(hh, l_pvt->threshold_emissions, l_current, l_tmp) { if (l_current->ts_added < l_time_cut_off) { - char *l_hash_token = dap_chain_hash_fast_to_str_new(&l_current->datum_token_emission_hash); + char l_token_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_current->datum_token_emission_hash, l_token_hash_str, sizeof(l_token_hash_str)); HASH_DEL(l_pvt->threshold_emissions, l_current); DAP_DELETE(l_current->datum_token_emission); - log_it(L_NOTICE, "Removed token emission %s form threshold ledger", l_hash_token); - DAP_DELETE(l_hash_token); + log_it(L_NOTICE, "Removed token emission %s form threshold ledger", l_token_hash_str); } } pthread_rwlock_unlock(&l_pvt->threshold_emissions_rwlock); @@ -2141,10 +2137,9 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ } // 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 = { }; //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_pvt->threshold_emissions_rwlock); HASH_FIND(hh,l_token_item ? l_token_item->token_emissions : l_ledger_pvt->threshold_emissions, @@ -2154,15 +2149,17 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ : &l_ledger_pvt->threshold_emissions_rwlock); if(l_token_emission_item ) { if(s_debug_more) { + char l_token_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_token_emission_hash, l_token_hash_str, sizeof(l_token_hash_str)); if ( l_token_emission_item->datum_token_emission->hdr.version == 2 ) { char *l_balance = dap_chain_balance_print(l_token_emission_item->datum_token_emission->hdr.value_256); log_it(L_ERROR, "Can't add token emission datum of %s %s ( %s ): already present in cache", - l_balance, l_token_ticker, l_hash_str); + l_balance, l_token_ticker, l_token_hash_str); DAP_DELETE(l_balance); } else log_it(L_ERROR, "Can't add token emission datum of %"DAP_UINT64_FORMAT_U" %s ( %s ): already present in cache", - l_token_emission_item->datum_token_emission->hdr.value, l_token_ticker, l_hash_str); + l_token_emission_item->datum_token_emission->hdr.value, l_token_ticker, l_token_hash_str); } l_ret = -1; }else if ( (! l_token_item) && ( l_threshold_emissions_count >= s_threshold_emissions_max)) { @@ -2171,7 +2168,6 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, byte_t *a_ s_threshold_emissions_max); l_ret = -2; } - DAP_DELETE(l_hash_str); if (l_ret || !PVT(a_ledger)->check_token_emission) return l_ret; // Check emission correctness @@ -2316,7 +2312,8 @@ static void s_ledger_emission_cache_update(dap_ledger_t *a_ledger, dap_chain_led uint8_t *l_cache = DAP_NEW_STACK_SIZE(uint8_t, l_cache_size); memcpy(l_cache, &a_emission_item->tx_used_out, sizeof(dap_hash_fast_t)); memcpy(l_cache + sizeof(dap_hash_fast_t), a_emission_item->datum_token_emission, a_emission_item->datum_token_emission_size); - char *l_hash_str = dap_hash_fast_to_str_new(&a_emission_item->datum_token_emission_hash); + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_emission_item->datum_token_emission_hash, l_hash_str, sizeof(l_hash_str)); if (dap_global_db_set(l_gdb_group, l_hash_str, l_cache, l_cache_size, false, NULL, NULL)) { log_it(L_WARNING, "Ledger cache mismatch"); } @@ -2404,7 +2401,6 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e a_emission_hash, sizeof(*a_emission_hash), l_token_emission_item); if(a_safe_call) pthread_rwlock_unlock(l_token_item ? &l_token_item->token_emissions_rwlock : &l_ledger_pvt->threshold_emissions_rwlock); - char *l_hash_str = dap_chain_hash_fast_to_str_new(a_emission_hash); if (!l_token_emission_item) { l_token_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t); l_token_emission_item->datum_token_emission_size = a_token_emission_size; @@ -2419,7 +2415,6 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e if (!s_chain_ledger_token_tsd_check(l_token_item, (dap_chain_datum_token_emission_t *)a_token_emission)) { DAP_DELETE(l_token_emission_item->datum_token_emission); DAP_DELETE(l_token_emission_item); - DAP_DELETE(l_hash_str); return -114; } } @@ -2440,7 +2435,6 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e DAP_DELETE(l_value); DAP_DELETE(l_token_emission_item->datum_token_emission); DAP_DELETE(l_token_emission_item); - DAP_DELETE(l_hash_str); return -4; } if (PVT(a_ledger)->cached) @@ -2495,6 +2489,8 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e } else { if (l_token_item) { if(s_debug_more) { + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_emission_hash, l_hash_str, sizeof(l_hash_str)); if ( ((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.version == 2 ) { char *l_balance = dap_chain_balance_print(((dap_chain_datum_token_emission_t *)a_token_emission)->hdr.value_256); log_it(L_ERROR, "Duplicate token emission datum of %s %s ( %s )", l_balance, c_token_ticker, l_hash_str); @@ -2507,17 +2503,16 @@ static inline int s_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_e } l_ret = -1; } - DAP_DELETE(l_hash_str); return l_ret; } void s_ledger_stake_lock_cache_update(dap_ledger_t *a_ledger, dap_chain_ledger_stake_lock_item_t *a_stake_lock_item) { - char *l_hash_str = dap_chain_hash_fast_to_str_new(&a_stake_lock_item->tx_for_stake_lock_hash); + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_stake_lock_item->tx_for_stake_lock_hash, l_hash_str, sizeof(l_hash_str)); char *l_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_STAKE_LOCK_STR); if (dap_global_db_set(l_group, l_hash_str, &a_stake_lock_item->tx_used_out, sizeof(dap_hash_fast_t), false, NULL, NULL)) log_it(L_WARNING, "Ledger cache mismatch"); - DAP_DEL_Z(l_hash_str); DAP_DEL_Z(l_group); } @@ -3952,9 +3947,9 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d int res = dap_chain_ledger_tx_remove(a_ledger, &l_tx_prev_hash_to_del, a_tx->header.ts_created); if(res == -2) { if(s_debug_more) { - char * l_tx_prev_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_prev_hash_to_del); + char l_tx_prev_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_tx_prev_hash_to_del, l_tx_prev_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); log_it(L_ERROR, "Can't delete previous transactions because hash=%s not found", l_tx_prev_hash_str); - DAP_DELETE(l_tx_prev_hash_str); } ret = -100; l_outs_used = i; @@ -3962,9 +3957,9 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d } else if(res != 1) { if(s_debug_more) { - char * l_tx_prev_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_prev_hash_to_del); + char l_tx_prev_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_tx_prev_hash_to_del, l_tx_prev_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); log_it(L_ERROR, "Can't delete previous transactions with hash=%s", l_tx_prev_hash_str); - DAP_DELETE(l_tx_prev_hash_str); } ret = -101; l_outs_used = i; @@ -4189,9 +4184,9 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ if (PVT(a_ledger)->cached) { // Remove it from cache char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_TXS_STR); - char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); + char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); dap_global_db_del(l_gdb_group, l_tx_hash_str, NULL, NULL); - DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_gdb_group); } l_ret = 1; @@ -4210,10 +4205,10 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_ if (PVT(a_ledger)->cached) { // Add it to cache char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_LEDGER_SPENT_TXS_STR); - char *l_tx_hash_str = dap_hash_fast_to_str_new(a_tx_hash); + char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); if (dap_global_db_set(l_gdb_group, l_tx_hash_str, &l_item_used->cache_data, sizeof(l_item_used->cache_data), false, NULL, NULL)) debug_if(s_debug_more, L_WARNING, "Ledger cache mismatch"); - DAP_DELETE(l_tx_hash_str); DAP_DELETE(l_gdb_group); } } @@ -4794,7 +4789,7 @@ uint256_t dap_chain_ledger_tx_cache_get_out_cond_value(dap_ledger_t *a_ledger, d dap_chain_datum_tx_t *l_tx_tmp; dap_chain_hash_fast_t l_tx_first_hash = { 0 }; // start hash /* size_t l_pub_key_size = a_key_from->pub_key_data_size; - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key_from, &l_pub_key_size);*/ + uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_key_from, &l_pub_key_size);*/ dap_chain_tx_out_cond_t *l_tx_out_cond; // Find all transactions do { diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 4762d843621b0144ea08ae96470f56031ceffbee..1e537d2fc1b89d535299c52aef829e58a387c5c1 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -58,12 +58,16 @@ typedef struct dap_chain_atom_iter{ typedef enum dap_chain_atom_verify_res{ - ATOM_ACCEPT=0, - ATOM_PASS=1, - ATOM_REJECT=2, - ATOM_MOVE_TO_THRESHOLD=3 + ATOM_ACCEPT = 0, ATOM_PASS, ATOM_REJECT, ATOM_MOVE_TO_THRESHOLD } dap_chain_atom_verify_res_t; +static const char* const dap_chain_atom_verify_res_str[] = { + [ATOM_ACCEPT] = "accepted", + [ATOM_PASS] = "skipped", + [ATOM_REJECT] = "rejected", + [ATOM_MOVE_TO_THRESHOLD] = "thresholded" +}; + typedef dap_chain_t* (*dap_chain_callback_new_t)(void); typedef void (*dap_chain_callback_t)(dap_chain_t *); @@ -240,5 +244,5 @@ bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_ ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id); void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name); - +int dap_chain_datum_unledgered_search_iter(dap_chain_datum_t* a_datum, dap_chain_t* a_chain); const char* dap_chain_get_path(dap_chain_t *a_chain); diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 0d3229773f508e2e0ef155fb06d05d00832d4ca3..1570593b5ef74df075a6c774b61f269036c4c4d6 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -533,13 +533,9 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) } // Store receipt if any problems with transactions - dap_chain_hash_fast_t l_receipt_hash={0}; - dap_hash_fast(l_receipt,l_receipt_size,&l_receipt_hash); - - char *l_receipt_hash_str = dap_chain_hash_fast_to_str_new(&l_receipt_hash); + char *l_receipt_hash_str; + dap_get_data_hash_str_static(l_receipt, l_receipt_size, l_receipt_hash_str); dap_global_db_set("local.receipts", l_receipt_hash_str, l_receipt, l_receipt_size, false, NULL, NULL); - DAP_DELETE(l_receipt_hash_str); - size_t l_success_size; if (!l_usage->is_grace) { // Form input transaction @@ -559,7 +555,6 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) } dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_STACK_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, l_success_size); - memset(&l_success->hdr, 0, sizeof(l_success->hdr)); l_success->hdr.usage_id = l_usage->id; diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 18f97da5ca36e5a12c66b610e66c4da9b6595625..567eaaf33f10e8331311834946a58f0d6f0ed47d 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -1877,9 +1877,9 @@ void s_stream_ch_packet_out(dap_stream_ch_t *a_ch, void *a_arg) l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t); l_hash_item->hash = *l_ch_chain->request_atom_iter->cur_hash; if(s_debug_more){ - char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_hash_item->hash); + char l_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_hash_item->hash, l_atom_hash_str, sizeof(l_atom_hash_str)); log_it(L_INFO, "Out CHAIN pkt: atom hash %s (size %zd) ", l_atom_hash_str, l_ch_chain->request_atom_iter->cur_size); - DAP_DELETE(l_atom_hash_str); } s_stream_ch_chain_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_ch_chain->request_hdr.net_id.uint64, l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, diff --git a/modules/common/dap_chain_common.c b/modules/common/dap_chain_common.c index d6d9844b91b5ff61517aaef5bfd1ba34b0ee39fc..e1ccc2930913f3994f02a57dd3d5d1aa1e182ae5 100644 --- a/modules/common/dap_chain_common.c +++ b/modules/common/dap_chain_common.c @@ -191,7 +191,7 @@ int dap_chain_addr_fill_from_key(dap_chain_addr_t *a_addr, dap_enc_key_t *a_key, { dap_sign_type_t l_type = dap_sign_type_from_key_type(a_key->type); size_t l_pub_key_data_size; - uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_data_size); + uint8_t *l_pub_key_data = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_data_size); if (!l_pub_key_data) { log_it(L_ERROR,"Can't fill address from key, its empty"); return -1; diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index e717aead2901d827d0420bc37f97a47c46bf1b80..5cb3bc3ecc574425062b59f4803c0417a311d5ae 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -117,11 +117,9 @@ void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_ break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_ADD : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ - char *l_hash_str; - if(!dap_strcmp(a_hash_out_type, "hex") || !dap_strcmp(a_hash_out_type, "content_hash") ) - l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data); - else - l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); + char *l_hash_str = (!dap_strcmp(a_hash_out_type, "hex") || !dap_strcmp(a_hash_out_type, "content_hash")) + ? dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data) + : dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); dap_string_append_printf(a_str_out,"total_signs_add: %s\n", l_hash_str); DAP_DELETE( l_hash_str ); }else @@ -129,11 +127,9 @@ void s_datum_token_dump_tsd(dap_string_t *a_str_out, dap_chain_datum_token_t *a_ break; case DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TOTAL_SIGNS_REMOVE : if(l_tsd->size == sizeof(dap_chain_hash_fast_t) ){ - char *l_hash_str; - if(!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash")) - l_hash_str = dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data); - else - l_hash_str = dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); + char *l_hash_str = (!dap_strcmp(a_hash_out_type,"hex")|| !dap_strcmp(a_hash_out_type, "content_hash")) + ? dap_chain_hash_fast_to_str_new((dap_chain_hash_fast_t*) l_tsd->data) + : dap_enc_base58_encode_hash_to_str((dap_chain_hash_fast_t*) l_tsd->data); dap_string_append_printf(a_str_out,"total_signs_remove: %s\n", l_hash_str ); DAP_DELETE( l_hash_str ); }else @@ -223,11 +219,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, if (l_in_item && dap_hash_fast_is_blank(&l_in_item->header.tx_prev_hash)) l_is_first = true; char l_tmp_buf[70]; - char *l_hash_str = NULL; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash); + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(a_tx_hash) + : dap_chain_hash_fast_to_str_new(a_tx_hash); dap_string_append_printf(a_str_out, "transaction:%s hash %s\n TS Created: %s%s%s\n Items:\n", l_is_first ? " (emit)" : "", l_hash_str, dap_ctime_r(&l_ts_create, l_tmp_buf), a_ticker ? " Token ticker: " : "", a_ticker ? a_ticker : ""); @@ -235,7 +229,6 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, uint32_t l_tx_items_count = 0; uint32_t l_tx_items_size = a_datum->header.tx_items_size; dap_sign_t *l_sign_tmp; - dap_chain_hash_fast_t l_pkey_hash_tmp; dap_hash_fast_t *l_hash_tmp = NULL; dap_pkey_t *l_pkey_tmp; while (l_tx_items_count < l_tx_items_size) { @@ -247,10 +240,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, if (dap_hash_fast_is_blank(l_hash_tmp)) { l_hash_str = dap_strdup("BLANK"); } else { - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); } dap_string_append_printf(a_str_out, "\t IN:\nTx_prev_hash: %s\n" "\t\t Tx_out_prev_idx: %u\n", @@ -287,10 +279,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, } break; case TX_ITEM_TYPE_IN_EMS: { l_hash_tmp = &((dap_chain_tx_in_ems_t*)item)->header.token_emission_hash; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); dap_string_append_printf(a_str_out, "\t IN_EMS:\n" "\t\t ticker: %s \n" "\t\t token_emission_hash: %s\n" @@ -302,10 +293,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, } break; case TX_ITEM_TYPE_IN_EMS_EXT: { l_hash_tmp = &((dap_chain_tx_in_ems_ext_t*)item)->header.ext_tx_hash; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); dap_string_append_printf(a_str_out, "\t IN_EMS EXT:\n" "\t\t Version: %u\n" "\t\t Ticker: %s\n" @@ -369,11 +359,11 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, } break; case TX_ITEM_TYPE_PKEY: { l_pkey_tmp = (dap_pkey_t*)((dap_chain_tx_pkey_t*)item)->pkey; + dap_chain_hash_fast_t l_pkey_hash_tmp; dap_hash_fast(l_pkey_tmp->pkey, l_pkey_tmp->header.size, &l_pkey_hash_tmp); - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_pkey_hash_tmp) + : dap_chain_hash_fast_to_str_new(&l_pkey_hash_tmp); dap_string_append_printf(a_str_out, "\t PKey: \n" "\t\t SIG type: %s\n" "\t\t SIG size: %u\n" @@ -399,10 +389,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, } break; case TX_ITEM_TYPE_IN_COND: l_hash_tmp = &((dap_chain_tx_in_cond_t*)item)->header.tx_prev_hash; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); dap_string_append_printf(a_str_out, "\t IN COND:\n\t\tReceipt_idx: %u\n" "\t\t Tx_prev_hash: %s\n" "\t\t Tx_out_prev_idx: %u\n", @@ -432,10 +421,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, char *l_value_str = dap_chain_balance_print(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); char *l_coins_str = dap_chain_balance_to_coins(((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.unit_price_max_datoshi); l_hash_tmp = &((dap_chain_tx_out_cond_t*)item)->subtype.srv_pay.pkey_hash; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); dap_string_append_printf(a_str_out, "\t\t\t unit: 0x%08x\n" "\t\t\t pkey: %s\n" "\t\t\t max price: %s (%s)\n", @@ -452,10 +440,9 @@ bool dap_chain_datum_dump_tx(dap_chain_datum_tx_t *a_datum, dap_chain_addr_t *l_signing_addr = &((dap_chain_tx_out_cond_t*)item)->subtype.srv_stake_pos_delegate.signing_addr; char *l_addr_str = dap_chain_addr_to_str(l_signing_addr); l_hash_tmp = &l_signing_addr->data.hash_fast; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(l_hash_tmp); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(l_hash_tmp); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_hash_tmp) + : dap_chain_hash_fast_to_str_new(l_hash_tmp); dap_string_append_printf(a_str_out, "\t\t\t signing_addr: %s\n" "\t\t\t with pkey hash %s\n" "\t\t\t signer_node_addr: "NODE_ADDR_FP_STR"\n", @@ -535,11 +522,9 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c } dap_hash_fast_t l_datum_hash; dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_datum_hash); - char *l_hash_str = NULL; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_datum_hash); + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_datum_hash) + : dap_chain_hash_fast_to_str_new(&l_datum_hash); switch (a_datum->header.type_id) { case DAP_CHAIN_DATUM_TOKEN_DECL: { size_t l_token_size = a_datum->header.data_size; @@ -732,17 +717,12 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c dap_string_append_printf(a_str_out,"=== Datum anchor ===\n"); dap_string_append_printf(a_str_out, "hash: %s\n", l_hash_str); dap_string_append_printf(a_str_out, "size: %zd\n", l_anchor_size); - char *l_decree_hash_str = NULL; - dap_hash_fast_t l_decree_hash ={0}; + dap_hash_fast_t l_decree_hash = { }; dap_chain_datum_anchor_get_hash_from_data(l_anchor, &l_decree_hash); //dap_chain_hash_fast_to_str(&l_decree_hash, l_decree_hash_str, 40); - - l_decree_hash_str = dap_chain_hash_fast_to_str_new(&l_decree_hash); - + char l_decree_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_decree_hash, l_decree_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); dap_string_append_printf(a_str_out, "decree hash: %s\n", l_decree_hash_str); - - DAP_DELETE(l_decree_hash_str); - dap_chain_datum_anchor_certs_dump(a_str_out, l_anchor->data_n_sign + l_anchor->header.data_size, l_anchor->header.signs_size, a_hash_out_type); } break; } @@ -751,11 +731,9 @@ void dap_chain_datum_dump(dap_string_t *a_str_out, dap_chain_datum_t *a_datum, c json_object * dap_chain_datum_to_json(dap_chain_datum_t* a_datum){ json_object *l_object = json_object_new_object(); - dap_hash_fast_t l_hash_data = {0}; - dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_hash_data); - char *l_hash_data_str = dap_hash_fast_to_str_new(&l_hash_data); + char *l_hash_data_str; + dap_get_data_hash_str_static(a_datum->data, a_datum->header.data_size, l_hash_data_str); json_object *l_obj_data_hash = json_object_new_string(l_hash_data_str); - DAP_DELETE(l_hash_data_str); json_object *l_obj_version = json_object_new_int(a_datum->header.version_id); json_object *l_obj_size = json_object_new_int(a_datum->header.data_size); json_object *l_obj_ts_created = json_object_new_uint64(a_datum->header.ts_create); diff --git a/modules/common/dap_chain_datum_anchor.c b/modules/common/dap_chain_datum_anchor.c index 3be303ad469f5a57fba1cc57142b9fdc7f27bc13..736781fc7d6a822c135e557fd6cc542dcd76dc8e 100644 --- a/modules/common/dap_chain_datum_anchor.c +++ b/modules/common/dap_chain_datum_anchor.c @@ -71,7 +71,7 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign size_t l_offset = 0; for (int i = 1; l_offset < (a_certs_size); i++) { - dap_sign_t *l_sign = (dap_sign_t *) (a_signs + l_offset); + dap_sign_t *l_sign = (dap_sign_t*)(a_signs + l_offset); l_offset += dap_sign_get_size(l_sign); if (l_sign->header.sign_size == 0) { dap_string_append_printf(a_str_out, "<CORRUPTED - 0 size signature>\n"); @@ -83,13 +83,9 @@ void dap_chain_datum_anchor_certs_dump(dap_string_t * a_str_out, byte_t * a_sign dap_string_append_printf(a_str_out, "<CORRUPTED - can't calc hash>\n"); continue; } - - char *l_hash_str = NULL; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash); - + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_pkey_hash) + : dap_chain_hash_fast_to_str_new(&l_pkey_hash); dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size); DAP_DEL_Z(l_hash_str); diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c index 9826bcbf9264ccf4edef107679eb5c30e66a2272..40adfe8121c6761740e0cf694624396766441399 100644 --- a/modules/common/dap_chain_datum_decree.c +++ b/modules/common/dap_chain_datum_decree.c @@ -392,9 +392,9 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree memcpy(l_owner_pkey, l_tsd->data, l_tsd->size); dap_hash_fast_t l_owner_pkey_hash = {0}; dap_hash_fast(l_owner_pkey->pkey, l_owner_pkey->header.size, &l_owner_pkey_hash); - char *l_owner_pkey_str = dap_chain_hash_fast_to_str_new(&l_owner_pkey_hash); + char l_owner_pkey_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_owner_pkey_hash, l_owner_pkey_str, sizeof(l_owner_pkey_str)); dap_string_append_printf(a_str_out, "\tOwner fingerprint: %s\n", l_owner_pkey_str); - DAP_DELETE(l_owner_pkey_str); break; case DAP_CHAIN_DATUM_DECREE_TSD_TYPE_MIN_OWNER: if (l_tsd->size > sizeof(uint256_t)){ @@ -424,12 +424,9 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree } dap_hash_fast_t l_stake_tx = {0}; l_stake_tx = dap_tsd_get_scalar(l_tsd, dap_hash_fast_t); - char *l_stake_tx_hash = ""; - if (strcmp(a_hash_out_type, "hex") == 0) { - l_stake_tx_hash = dap_hash_fast_to_str_new(&l_stake_tx); - } else { - l_stake_tx_hash = dap_enc_base58_encode_hash_to_str(&l_stake_tx); - } + char *l_stake_tx_hash = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_stake_tx) + : dap_chain_hash_fast_to_str_new(&l_stake_tx); dap_string_append_printf(a_str_out, "\tStake tx: %s\n", l_stake_tx_hash); DAP_DELETE(l_stake_tx_hash); break; @@ -454,12 +451,9 @@ void dap_chain_datum_decree_dump(dap_string_t *a_str_out, dap_chain_datum_decree dap_string_append_printf(a_str_out, "\tSigning addr: %s\n", l_stake_addr_signing_str); dap_chain_hash_fast_t *l_pkey_signing = DAP_NEW(dap_chain_hash_fast_t); memcpy(l_pkey_signing, l_stake_addr_signing.data.key, sizeof(dap_chain_hash_fast_t)); - char *l_pkey_signing_str = NULL; - if (strcmp(a_hash_out_type, "hex") == 0) { - l_pkey_signing_str = dap_hash_fast_to_str_new(l_pkey_signing); - } else { - l_pkey_signing_str = dap_enc_base58_encode_hash_to_str(l_pkey_signing); - } + char *l_pkey_signing_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(l_pkey_signing) + : dap_chain_hash_fast_to_str_new(l_pkey_signing); dap_string_append_printf(a_str_out, "\tSigning pkey fingerprint: %s\n", l_pkey_signing_str); DAP_DELETE(l_stake_addr_signing_str); DAP_DELETE(l_pkey_signing_str); @@ -528,12 +522,9 @@ void dap_chain_datum_decree_certs_dump(dap_string_t * a_str_out, byte_t * a_sign continue; } - char *l_hash_str = NULL; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash); - + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_pkey_hash) + : dap_chain_hash_fast_to_str_new(&l_pkey_hash); dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size); DAP_DEL_Z(l_hash_str); diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 3d11dfe3eb242d4d596c963b2d73fba75e9172d5..f9f9ec7ec6cd07eedf38763019929e55623d8c87 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -233,11 +233,9 @@ void dap_chain_datum_token_certs_dump(dap_string_t * a_str_out, byte_t * a_data_ continue; } - char *l_hash_str = NULL; - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash); + char *l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_pkey_hash) + : dap_chain_hash_fast_to_str_new(&l_pkey_hash); dap_string_append_printf(a_str_out, "%d) %s, %s, %u bytes\n", i, l_hash_str, dap_sign_type_to_str(l_sign->header.type), l_sign->header.sign_size); @@ -426,7 +424,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_add_sign(dap_enc_key_ { size_t l_pub_key_size = 0; dap_sign_t *l_sign = (dap_sign_t *)(a_emission->tsd_n_signs + a_emission->data.type_auth.tsd_total_size); - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_sign_key, &l_pub_key_size); + uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_sign_key, &l_pub_key_size); for (int i = 0; i < a_emission->data.type_auth.signs_count; i++) { if (l_sign->header.sign_pkey_size == l_pub_key_size && !memcmp(l_sign->pkey_n_sign, l_pub_key, l_pub_key_size)) diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index bce0144e53b7e3a491c19969ce6d4cfc14d38b9d..6d9b329728e48d4be6172eb36ef0bdd298be892a 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -316,10 +316,7 @@ json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){ break; } dap_chain_tx_item_type_t l_item_type = dap_chain_datum_tx_item_get_type(item); - json_object *l_obj_item_type = NULL; - json_object *l_obj_item_data = NULL; - dap_hash_fast_t a_tx_hash = {0}; - char *l_hash_str = NULL; + json_object *l_obj_item_type = NULL, *l_obj_item_data = NULL; switch (l_item_type) { case TX_ITEM_TYPE_IN: l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_IN"); @@ -379,12 +376,12 @@ json_object *dap_chain_datum_tx_to_json(dap_chain_datum_tx_t *a_tx){ l_obj_item_type = json_object_new_string("TX_ITEM_TYPE_TSD"); l_obj_item_data = dap_chain_datum_tx_item_tsd_to_json((dap_chain_tx_tsd_t*)item); break; - default: - dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &a_tx_hash); - l_hash_str = dap_chain_hash_fast_to_str_new(&a_tx_hash); + default: { + char *l_hash_str; + dap_get_data_hash_str_static(a_tx, dap_chain_datum_tx_get_size(a_tx), l_hash_str); log_it(L_NOTICE, "Transaction %s has an item whose type cannot be handled by the dap_chain_datum_tx_to_json function.", l_hash_str); - DAP_DELETE(l_hash_str); break; + } } if (!l_obj_item_type){ json_object_array_add(l_obj_items, json_object_new_null()); diff --git a/modules/common/dap_chain_datum_tx_items.c b/modules/common/dap_chain_datum_tx_items.c index d6479b0948836a55d6a81fc326687acc2719fc73..7b64c29b965fc0f0d7ba5085fa87072cb90a925b 100644 --- a/modules/common/dap_chain_datum_tx_items.c +++ b/modules/common/dap_chain_datum_tx_items.c @@ -247,9 +247,9 @@ json_object *dap_chain_datum_tx_item_in_ems_to_json(const dap_chain_tx_in_ems_t json_object *l_object = json_object_new_object(); json_object *l_obj_ticker = json_object_new_string(a_in_ems->header.ticker); json_object *l_obj_chain_id = json_object_new_uint64(a_in_ems->header.token_emission_chain_id.uint64); - char *l_ehf = dap_chain_hash_fast_to_str_new(&a_in_ems->header.token_emission_hash); + char l_ehf[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_in_ems->header.token_emission_hash, l_ehf, sizeof(l_ehf)); json_object *l_obj_ehf = json_object_new_string(l_ehf); - DAP_DELETE(l_ehf); json_object_object_add(l_object, "ticker", l_obj_ticker); json_object_object_add(l_object, "chainId", l_obj_chain_id); json_object_object_add(l_object, "emissionHash", l_obj_ehf); @@ -293,9 +293,9 @@ dap_chain_tx_tsd_t *dap_chain_datum_tx_item_tsd_create(void *a_data, int a_type, json_object* dap_chain_datum_tx_item_in_to_json(dap_chain_tx_in_t *a_in){ json_object *l_obj_in = json_object_new_object(); json_object *l_obj_prev_idx = json_object_new_uint64(a_in->header.tx_out_prev_idx); - char *l_hash = dap_chain_hash_fast_to_str_new(&a_in->header.tx_prev_hash); + char l_hash[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_in->header.tx_prev_hash, l_hash, sizeof(l_hash)); json_object *l_obj_hash = json_object_new_string(l_hash); - DAP_DELETE(l_hash); json_object_object_add(l_obj_in, "prev_idx", l_obj_prev_idx); json_object_object_add(l_obj_in, "prev_hash", l_obj_hash); return l_obj_in; 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 ca6438dcebd078758b47e6a4b77d2b1d0ae18200..923b4109500f7cb0d533ec08a772e98f127607b3 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -252,16 +252,17 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) "Can't find event %s in round.new - only place where could be signed the new event\n", l_event_hash_str); ret = -30; - }else { + } else { 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); + 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_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, 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); - char * l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash); + char l_event_new_hash_hex_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_event_new_hash, l_event_new_hash_hex_str, DAP_CHAIN_HASH_FAST_STR_SIZE); + char *l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash); 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); @@ -293,8 +294,6 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) ret=-31; } - DAP_DELETE(l_event); - DAP_DELETE(l_event_new_hash_hex_str); DAP_DELETE(l_event_new_hash_base58_str); } else { dap_cli_server_cmd_set_reply_text(a_str_reply, @@ -302,6 +301,7 @@ static int s_cli_dag_poa(int argc, char ** argv, char **a_str_reply) l_event_hash_str); ret=-1; } + DAP_DELETE(l_event); DAP_DELETE(l_round_item); } } else { @@ -551,31 +551,36 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d } } dap_chain_cs_dag_event_round_item_t *l_chosen_item = s_round_event_choose_dup(l_dups_list, l_max_signs_count); - dap_chain_cs_dag_event_t *l_new_atom = NULL; if (l_chosen_item) { size_t l_event_size = l_chosen_item->event_size; - l_new_atom = DAP_DUP_SIZE(l_chosen_item->event_n_signs, l_event_size); - dap_hash_fast_t l_event_hash = {}; - dap_hash_fast(l_new_atom, l_event_size, &l_event_hash); - char l_event_hash_hex_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_hash_fast_to_str(&l_event_hash, l_event_hash_hex_str, DAP_CHAIN_HASH_FAST_STR_SIZE); - dap_chain_atom_verify_res_t l_res = l_dag->chain->callback_atom_add(l_dag->chain, l_new_atom, l_event_size); - if (l_res == ATOM_PASS || l_res == ATOM_REJECT) { // Add new atom in chain - DAP_DEL_Z(l_new_atom); - log_it(L_DEBUG, "Event %s from round %"DAP_UINT64_FORMAT_U" not added in chain", l_event_hash_hex_str, l_arg->round_id); - } else { - log_it(L_NOTICE, "Event %s from round %"DAP_UINT64_FORMAT_U" added in %s successfully", l_event_hash_hex_str, l_arg->round_id, - l_res == ATOM_ACCEPT ? "chain" : "threshold"); + dap_chain_cs_dag_event_t *l_new_atom = (dap_chain_cs_dag_event_t *)DAP_DUP_SIZE(l_chosen_item->event_n_signs, l_event_size); + char *l_event_hash_hex_str, *l_datum_hash_str; + dap_get_data_hash_str_static(l_new_atom, l_event_size, l_event_hash_hex_str); + dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(l_new_atom, l_event_size); + dap_get_data_hash_str_static(l_datum, dap_chain_datum_size(l_datum), l_datum_hash_str); + int l_verify_datum = dap_chain_net_verify_datum_for_add(dap_chain_net_by_id(l_dag->chain->net_id), l_datum); + if (!l_verify_datum) { + dap_chain_atom_verify_res_t l_res = l_dag->chain->callback_atom_add(l_dag->chain, l_new_atom, l_event_size); if (l_res == ATOM_ACCEPT) { dap_chain_atom_save(l_dag->chain, (dap_chain_atom_ptr_t)l_new_atom, l_event_size, l_dag->chain->cells->id); pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); HASH_DEL(l_poa_pvt->active_rounds, l_arg); pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); s_poa_round_clean(l_dag->chain); - } + } else if (l_res != ATOM_MOVE_TO_THRESHOLD) + DAP_DELETE(l_new_atom); + if (!l_new_atom->header.round_id) + l_dag->round_completed++; + log_it(L_INFO, "Event %s from round %"DAP_UINT64_FORMAT_U" %s", + l_event_hash_hex_str, l_arg->round_id, dap_chain_atom_verify_res_str[l_res]); + } else { + DAP_DELETE(l_new_atom); + log_it(L_INFO, "Event %s from round %"DAP_UINT64_FORMAT_U" not added into chain, because the inner datum %s doesn't pass verification (error %d)", + l_event_hash_hex_str, l_arg->round_id, l_datum_hash_str, l_verify_datum); } - } else - log_it(L_WARNING, "No round candidates for round ID %"DAP_UINT64_FORMAT_U, l_arg->round_id); + } else { /* !l_chosen_item */ + log_it(L_WARNING, "No candidates for round id %"DAP_UINT64_FORMAT_U, l_arg->round_id); + } dap_list_free(l_dups_list); DAP_DELETE(a_arg); } @@ -735,7 +740,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)a_value; 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 (l_event->header.round_id < a_dag->round_completed) { struct round_timer_arg *l_round_active; @@ -745,6 +750,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); if (!l_round_active) { log_it(L_DEBUG, "DAG event came from too old round so won't be processed"); + DAP_DELETE(l_event); return -2; } } @@ -756,6 +762,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, (char *)a_key)) // cs done (minimum signs & verify passed) s_round_event_cs_done(a_dag, l_event->header.round_id); + DAP_DELETE(l_event); return 0; } @@ -764,14 +771,10 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ if (!l_poa_pvt->callback_pre_sign || !l_poa_pvt->callback_pre_sign->callback || !(ret = l_poa_pvt->callback_pre_sign->callback(a_dag->chain, l_event, l_event_size, l_poa_pvt->callback_pre_sign->arg))) { - l_event = DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); l_event_size_new = dap_chain_cs_dag_event_sign_add(&l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key); - dap_chain_hash_fast_t 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); + char *l_event_new_hash_hex_str; + dap_get_data_hash_str_static(l_event, l_event_size_new, l_event_new_hash_hex_str); dap_chain_cs_dag_event_gdb_set(a_dag, l_event_new_hash_hex_str, l_event, l_event_size_new, l_round_item); - DAP_DELETE(l_event_new_hash_hex_str); - DAP_DELETE(l_event); } else { // set sign for reject l_round_item = DAP_DUP_SIZE(a_value, a_value_size); if (dap_chain_cs_dag_event_round_sign_add(&l_round_item, a_value_size, l_poa_pvt->events_sign_cert->enc_key)) { @@ -781,6 +784,7 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ } DAP_DELETE(l_round_item); } + DAP_DELETE(l_event); return 0; } diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 4055932edee3e28402b75516f589130858b5ec73..78a86c04eef9c92a9f6d49e256696fecd1a20a7d 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -45,11 +45,10 @@ #define CONSENSUS_NAME "none" typedef struct dap_chain_gdb_datum_hash_item{ - char key[70]; + char key[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_t datum_data_hash; uint8_t padding[2]; - struct dap_chain_gdb_datum_hash_item * prev; - struct dap_chain_gdb_datum_hash_item * next; + struct dap_chain_gdb_datum_hash_item *prev, *next; } dap_chain_gdb_datum_hash_item_t; typedef struct dap_chain_gdb_private @@ -457,9 +456,8 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t */ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter) { - if (a_atom_iter->cur_item) - DAP_DELETE(a_atom_iter->cur_item); - DAP_DELETE(a_atom_iter->cur_hash); + DAP_DEL_Z(a_atom_iter->cur_item); + DAP_DEL_Z(a_atom_iter->cur_hash); DAP_DELETE(a_atom_iter); } @@ -475,12 +473,13 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size) { - char * l_key = dap_chain_hash_fast_to_str_new(a_atom_hash); + char l_key[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_atom_hash, l_key, sizeof(l_key)); size_t l_ret_size; dap_chain_atom_ptr_t l_ret = NULL; - dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain ); - if(l_gdb){ - l_ret = dap_global_db_get_sync(PVT ( l_gdb )->group_datums,l_key,&l_ret_size,NULL, NULL ); + dap_chain_gdb_t *l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain); + if (l_gdb) { + l_ret = dap_global_db_get_sync(PVT(l_gdb)->group_datums, l_key, &l_ret_size, NULL, NULL); *a_atom_size = l_ret_size; } return l_ret; @@ -497,19 +496,18 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ { if (!a_atom_iter) return NULL; - if (a_atom_iter->cur_item) {// This iterator should clean up data for it because its allocate it + if (a_atom_iter->cur_item) { /* Iterator creates copies, free them at delete routine! */ DAP_DEL_Z(a_atom_iter->cur); DAP_DEL_Z(a_atom_iter->cur_hash); } dap_chain_datum_t * l_datum = NULL; dap_chain_gdb_datum_hash_item_t *l_item = PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->hash_items; a_atom_iter->cur_item = l_item; - if (a_atom_iter->cur_item ){ - size_t l_datum_size =0; - l_datum= (dap_chain_datum_t*) dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums, l_item->key, &l_datum_size, - NULL, NULL ); - if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it - DAP_DELETE( a_atom_iter->cur); + if (a_atom_iter->cur_item) { + size_t l_datum_size = 0; + l_datum = (dap_chain_datum_t*)dap_global_db_get_sync(PVT(DAP_CHAIN_GDB(a_atom_iter->chain))->group_datums, + l_item->key, &l_datum_size, NULL, NULL); + DAP_DEL_Z(a_atom_iter->cur); a_atom_iter->cur = l_datum; a_atom_iter->cur_size = l_datum_size; a_atom_iter->cur_hash = DAP_NEW_Z(dap_hash_fast_t); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 02a73ef488975b7198ad8748302de5e31d88866b..e7807cd696e953a5b10bde866093c132c1b88734 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -95,11 +95,9 @@ char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t dap_chain_hash_fast_t l_key_hash; dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_key_hash); - char *l_key_str; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); - else - l_key_str = dap_enc_base58_encode_hash_to_str(&l_key_hash); + char *l_key_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_key_hash) + : dap_chain_hash_fast_to_str_new(&l_key_hash); const char *l_type_str; switch (a_datum->header.type_id) { @@ -123,8 +121,7 @@ char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t else log_it(L_WARNING, "Can't place datum %s with hash %s in mempool group %s", l_type_str, l_key_str, l_gdb_group); DAP_DELETE(l_gdb_group); - - return (l_res == DAP_GLOBAL_DB_RC_SUCCESS) ? l_key_str : NULL; + return (l_res == DAP_GLOBAL_DB_RC_SUCCESS) ? l_key_str : ({ DAP_DELETE(l_key_str); NULL; }); } /** @@ -561,12 +558,11 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a l_objs[i].value_len = dap_chain_datum_size(l_datum); log_it(L_DEBUG, "Prepared obj with key %s (value_len = %"DAP_UINT64_FORMAT_U")", l_objs[i].key? l_objs[i].key :"NULL" , l_objs[i].value_len ); - } dap_list_free_full(l_list_used_out, free); - char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_new(a_chain); - dap_global_db_set_multiple_zc(l_gdb_group, l_objs,a_tx_num, s_tx_create_massive_gdb_save_callback , NULL ); + char *l_gdb_group = dap_chain_net_get_gdb_group_mempool_new(a_chain); + dap_global_db_set_multiple_zc(l_gdb_group, l_objs, a_tx_num, s_tx_create_massive_gdb_save_callback, NULL); DAP_DELETE(l_gdb_group); return 0; } @@ -1130,8 +1126,8 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) http_status_code_t * return_code = (http_status_code_t*) arg; // save key while it alive, i.e. still exist dap_enc_key_t *l_enc_key = dap_enc_ks_find_http(cl_st->http_client); - //dap_enc_key_serealize_t *key_ser = dap_enc_key_serealize(key_tmp); - //dap_enc_key_t *key = dap_enc_key_deserealize(key_ser, sizeof(dap_enc_key_serealize_t)); + //dap_enc_key_serialize_t *key_ser = dap_enc_key_serialize(key_tmp); + //dap_enc_key_t *key = dap_enc_key_deserialize(key_ser, sizeof(dap_enc_key_serialize_t)); // read header dap_http_header_t *hdr_session_close_id = @@ -1249,12 +1245,12 @@ void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url) * @param a_removed Pointer to a variable of type int which will store how many remote datums. */ void dap_chain_mempool_filter(dap_chain_t *a_chain, int *a_removed){ - int l_removed = 0; if (!a_chain) { - if (!a_removed) - *a_removed = l_removed; + if (a_removed) + *a_removed = 0; return; } + int l_removed = 0; char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_new(a_chain); size_t l_objs_size = 0; dap_time_t l_cut_off_time = dap_time_now() - 2592000; // 2592000 sec = 30 days @@ -1263,6 +1259,12 @@ void dap_chain_mempool_filter(dap_chain_t *a_chain, int *a_removed){ dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_gdb_group, &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; + if (!l_datum) { + l_removed++; + log_it(L_NOTICE, "Removed datum from mempool with \"%s\" key group %s: empty (possibly trash) value", l_objs[i].key, l_gdb_group); + dap_global_db_del_sync(l_objs[i].key, l_gdb_group); + continue; + } size_t l_datum_size = dap_chain_datum_size(l_datum); //Filter data size if (l_datum_size != l_objs[i].value_len) { @@ -1273,18 +1275,15 @@ void dap_chain_mempool_filter(dap_chain_t *a_chain, int *a_removed){ continue; } //Filter hash - dap_hash_fast_t l_hash_content = {0}; - dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_hash_content); - char *l_hash_content_str = dap_hash_fast_to_str_new(&l_hash_content); + char *l_hash_content_str; + dap_get_data_hash_str_static(l_datum->data, l_datum->header.data_size, l_hash_content_str); if (dap_strcmp(l_hash_content_str, l_objs[i].key) != 0) { l_removed++; - DAP_DELETE(l_hash_content_str); log_it(L_NOTICE, "Removed datum from mempool with \"%s\" key group %s. The hash of the contents of the " "datum does not match the key.", l_objs[i].key, l_gdb_group); dap_global_db_del_sync(l_gdb_group, l_objs[i].key); continue; } - DAP_DELETE(l_hash_content_str); //Filter time if (l_datum->header.ts_create < l_cut_off_time) { l_removed++; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 3271a57714dd5fb6d2b55da3be3302a36c30176a..e10e6cc40966b4b2678c9b6174d28f92b90ff36b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1996,21 +1996,25 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) dap_cert_t * l_cert = dap_cert_find_by_name(l_cert_string); if (l_cert == NULL) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find \"%s\" certificate", l_cert_string); + DAP_DEL_Z(l_hash_hex_str); return -7; } if (l_cert->enc_key == NULL) { dap_cli_server_cmd_set_reply_text(a_str_reply, "No key found in \"%s\" certificate", l_cert_string ); + DAP_DEL_Z(l_hash_hex_str); return -8; } // Get publivc key hash size_t l_pub_key_size = 0; - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_size);; + uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_size);; if (l_pub_key == NULL) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't serialize public key of certificate \"%s\"", l_cert_string); + DAP_DEL_Z(l_hash_hex_str); return -9; } dap_chain_hash_fast_t l_pkey_hash; dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); + DAP_DEL_Z(l_hash_hex_str); l_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); //l_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_pkey_hash); } @@ -2265,7 +2269,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) char **l_seed_aliases = dap_config_get_array_str(l_cfg, "general", "seed_nodes_aliases", &l_net_pvt->seed_aliases_count); if (l_net_pvt->seed_aliases_count) - l_net_pvt->seed_aliases = (char **)DAP_NEW_SIZE(char *, sizeof(char *) * l_net_pvt->seed_aliases_count); + l_net_pvt->seed_aliases = DAP_NEW_Z_SIZE(char*, sizeof(char*) * l_net_pvt->seed_aliases_count); for(size_t i = 0; i < l_net_pvt->seed_aliases_count; i++) l_net_pvt->seed_aliases[i] = dap_strdup(l_seed_aliases[i]); // randomize seed nodes list @@ -2338,7 +2342,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) if(l_certs_size > 0) l_cert = l_certs[0]; if(l_cert) { - l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size); + l_pub_key_data = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_data_size); // save pub key if(l_pub_key_data && l_pub_key_data_size > 0) dap_global_db_set(GROUP_LOCAL_NODE_ADDR, l_addr_key, l_pub_key_data, l_pub_key_data_size, false, @@ -3101,7 +3105,6 @@ void s_proc_mempool_callback_load(dap_global_db_context_t *a_global_db_context, { dap_chain_t * l_chain = (dap_chain_t*) a_arg; dap_chain_net_t * l_net = dap_chain_net_by_id( l_chain->net_id ); - dap_string_t * l_str_tmp = dap_string_new(NULL); if(a_values_count) { log_it(L_INFO, "%s.%s: Found %zu records :", l_net->pub.name, l_chain->name, a_values_count); @@ -3111,13 +3114,20 @@ void s_proc_mempool_callback_load(dap_global_db_context_t *a_global_db_context, size_t l_objs_size_tmp = (a_values_count > 15) ? min(a_values_count, 10) : a_values_count; for(size_t i = 0; i < a_values_count; i++) { dap_chain_datum_t * l_datum = (dap_chain_datum_t*) a_values[i].value; - int l_verify_datum= dap_chain_net_verify_datum_for_add( l_net, l_datum) ; + int l_dup_or_skip = dap_chain_datum_unledgered_search_iter(l_datum, l_chain); + if (l_dup_or_skip) { + log_it(L_WARNING, "Datum unledgered search returned '%d', delete it from mempool", l_dup_or_skip); + dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key); + l_datums[i] = NULL; + continue; + } + + 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), delete such datum from pool", - l_verify_datum); - dap_global_db_del_unsafe( a_global_db_context, a_group, a_values[i].key); + log_it(L_WARNING, "Datum doesn't pass verifications (code %d), delete such datum from pool", l_verify_datum); + dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key); l_datums[i] = NULL; - }else{ + } else { l_datums[i] = l_datum; if(i < l_objs_size_tmp) { char buf[50] = { '\0' }; @@ -3133,28 +3143,22 @@ void s_proc_mempool_callback_load(dap_global_db_context_t *a_global_db_context, size_t l_objs_processed = l_chain->callback_add_datums(l_chain, l_datums, l_datums_size); // Delete processed objects size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed; - for(size_t i = 0; i < l_objs_processed; i++) { - dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key ); - if(i < l_objs_processed_tmp) { - dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n", - a_values[i].key); - } + for (size_t i = 0; i < l_objs_processed; i++) { + dap_global_db_del_unsafe(a_global_db_context, a_group, a_values[i].key); + log_it(L_WARNING, "New event created, removed datum 0x%s from mempool \n", a_values[i].key); } - if(l_objs_processed < l_datums_size) - log_it(L_WARNING, "%s.%s: %zu records not processed", l_net->pub.name, l_chain->name, - l_datums_size - l_objs_processed); + debug_if(l_objs_processed < l_datums_size, L_WARNING, "%s.%s: %zu records not processed", + l_net->pub.name, l_chain->name, l_datums_size - l_objs_processed); dap_global_db_objs_delete(a_values, a_values_count); // Cleanup datums array - if(l_datums){ - for(size_t i = 0; i < a_values_count; i++) { - if (l_datums[i]) - DAP_DELETE(l_datums[i]); + if (l_datums){ + for (size_t i = 0; i < a_values_count; i++) { + DAP_DEL_Z(l_datums[i]); } - DAP_DEL_Z(l_datums); + DAP_DELETE(l_datums); } - } - else { + } else { log_it(L_INFO, "%s.%s: No records in mempool", l_net->pub.name, l_chain ? l_chain->name : "[no chain]"); } } @@ -3246,7 +3250,8 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke return false; } l_authorized = false; - const char *l_auth_hash_str = dap_chain_hash_fast_to_str_new(a_pkey_hash); + char l_auth_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(a_pkey_hash, l_auth_hash_str, sizeof(l_auth_hash_str)); uint16_t l_acl_list_len = 0; char **l_acl_list = dap_config_get_array_str(l_cfg, "auth", "acl_accept_ca_list", &l_acl_list_len); for (uint16_t i = 0; i < l_acl_list_len; i++) { @@ -3273,16 +3278,14 @@ static bool s_net_check_acl(dap_chain_net_t *a_net, dap_chain_hash_fast_t *a_pke const char *l_acl_chains = dap_config_get_item_str(l_cfg, "auth", "acl_accept_ca_chains"); if (l_acl_chains && !strcmp(l_acl_chains, "all")) { dap_list_t *l_certs = dap_cert_get_all_mem(); - for (dap_list_t *l_tmp = l_certs; l_tmp; l_tmp = dap_list_next(l_tmp)) { + for (dap_list_t *l_tmp = l_certs; l_tmp && !l_authorized; l_tmp = dap_list_next(l_tmp)) { dap_cert_t *l_cert = (dap_cert_t *)l_tmp->data; size_t l_pkey_size; - uint8_t *l_pkey_ser = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pkey_size); + uint8_t *l_pkey_ser = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pkey_size); dap_chain_hash_fast_t l_cert_hash; dap_hash_fast(l_pkey_ser, l_pkey_size, &l_cert_hash); if (!memcmp(&l_cert_hash, a_pkey_hash, sizeof(dap_chain_hash_fast_t))) { l_authorized = true; - DAP_DELETE(l_pkey_ser); - break; } DAP_DELETE(l_pkey_ser); } diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index d1dc0ec17783b9a2360a52fa98e58fd67352aa0e..9ca79342b1ae4e7d4fe02f9d4c0b4b8bf667b32d 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -45,6 +45,7 @@ #include "dap_chain_net.h" #include "dap_global_db.h" #include "dap_chain_node.h" +#include "dap_chain_cell.h" #define LOG_TAG "chain_node" @@ -94,9 +95,8 @@ bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const char *a_alias) { size_t l_addr_size =0; - dap_chain_node_addr_t * l_addr = (dap_chain_node_addr_t *) - dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases, a_alias, &l_addr_size, NULL, NULL ); - return l_addr; + return (dap_chain_node_addr_t*)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases, + a_alias, &l_addr_size, NULL, NULL); } /** @@ -104,7 +104,7 @@ dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * a_net,const */ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias) { - return dap_global_db_del_sync(a_net->pub.gdb_nodes_aliases, a_alias) == 0; + return dap_global_db_del_sync(a_net->pub.gdb_nodes_aliases, a_alias) == 0; } /** @@ -205,11 +205,12 @@ bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t return false; } -// Return true if processed datum should be deleted from mempool +/* Return true if processed datum should be deleted from mempool */ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum) { if (!a_chain->callback_add_datums) return false; - // Verify for correctness + if (dap_chain_datum_unledgered_search_iter(a_datum, a_chain)) + return true; /* Already chained, no need to keep duplicates */ 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, a_datum); if (l_verify_datum != 0 && @@ -222,7 +223,9 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d || l_verify_datum == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS #endif ) + { a_chain->callback_add_datums(a_chain, &a_datum, 1); + } return false; } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 8bcda383b7883e6bf6e0144f731c137c36b20d77..e2dbf64a85887bc43a566b0884271063d0829de3 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -882,20 +882,16 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) switch (l_subcmd) { case SUMCMD_GET: // Get value { - dap_hash_fast_t l_hash; - char *l_hash_str = NULL; - if(dap_hash_fast(l_value, l_value_len, &l_hash)) { - l_hash_str = dap_chain_hash_fast_to_str_new(&l_hash); - } + char *l_hash_str; + dap_get_data_hash_str_static(l_value, l_value_len, l_hash_str); char *l_value_str = DAP_NEW_Z_SIZE(char, l_value_len * 2 + 2); - //size_t ret = dap_bin2hex(l_value_str, l_value, l_value_len); + size_t ret = dap_bin2hex(l_value_str, l_value, l_value_len); dap_cli_server_cmd_set_reply_text(a_str_reply, "Record found\n" "lenght:\t%zu byte\n" "hash:\t%s\n" "pinned:\t%s\n" "value:\t0x%s\n\n", l_value_len, l_hash_str, l_is_pinned ? "Yes" : "No", l_value_str); DAP_DELETE(l_value_str); - DAP_DELETE(l_hash_str); break; } case SUMCMD_PIN: // Pin record @@ -2257,8 +2253,7 @@ int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply) // Chain name dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_str); if(l_datum_hash_str) { - char * l_datum_hash_hex_str = NULL; - char * l_datum_hash_base58_str = NULL; + char *l_datum_hash_hex_str = NULL, *l_datum_hash_base58_str = NULL; const char * l_certs_str = NULL; dap_cert_t ** l_certs = NULL; size_t l_certs_count = 0; @@ -2355,16 +2350,12 @@ int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply) DAP_DELETE(l_datum_token); // Calc datum's hash l_datum_size = dap_chain_datum_size(l_datum); - dap_chain_hash_fast_t l_key_hash={}; + dap_chain_hash_fast_t l_key_hash = { }; dap_hash_fast(l_datum->data, l_token_size, &l_key_hash); char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); char * l_key_str_base58 = dap_enc_base58_encode_hash_to_str(&l_key_hash); - const char * l_key_out_str; - if(!dap_strcmp(l_hash_out_type,"hex")) - l_key_out_str = l_key_str; - else - l_key_out_str = l_key_str_base58; - + const char *l_key_out_str = dap_strcmp(l_hash_out_type,"hex") + ? l_key_str_base58 : l_key_str; // Add datum to mempool with datum_token hash as a key if( dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, dap_chain_datum_size(l_datum), true) == 0) { @@ -2374,7 +2365,8 @@ int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply) dap_cli_server_cmd_set_reply_text(a_str_reply, "datum %s is replacing the %s in datum pool", l_key_out_str, l_datum_hash_out_str); - + DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -2383,6 +2375,8 @@ int com_token_decl_sign(int a_argc, char **a_argv, char ** a_str_reply) dap_cli_server_cmd_set_reply_text(a_str_reply, "Warning! Can't remove old datum %s ( new datum %s added normaly in datum pool)", l_datum_hash_out_str, l_key_out_str); + DAP_DELETE(l_key_str); + DAP_DELETE(l_key_str_base58); DAP_DELETE(l_datum); //DAP_DELETE(l_datum_token); DAP_DELETE(l_gdb_group_mempool); @@ -2967,13 +2961,13 @@ int com_mempool_proc(int a_argc, char **a_argv, char **a_str_reply) dap_chain_datum_t * l_datum = l_datum_hash_hex_str ? (dap_chain_datum_t*) dap_global_db_get_sync(l_gdb_group_mempool, l_datum_hash_hex_str, &l_datum_size, NULL, NULL ) : NULL; - size_t l_datum_size2= l_datum? dap_chain_datum_size( l_datum): 0; - if (l_datum_size != l_datum_size2 ){ + size_t l_datum_size2 = l_datum? dap_chain_datum_size( l_datum): 0; + if (l_datum_size != l_datum_size2) { ret = -8; dap_cli_server_cmd_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_hash_hex_str, l_datum_size2, l_datum_size); - }else{ - if(l_datum) { + } else { + if (l_datum) { char buf[50]; dap_time_t l_ts_create = (dap_time_t)l_datum->header.ts_create; const char *l_type = NULL; @@ -2982,25 +2976,33 @@ int com_mempool_proc(int a_argc, char **a_argv, char **a_str_reply) l_datum_hash_out_str, l_type, dap_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_add_datums){ - if (l_chain->callback_add_datums(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_global_db_del_sync( l_gdb_group_mempool, l_datum_hash_hex_str) != 0){ - 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.");*/ + int l_dup_or_skip = dap_chain_datum_unledgered_search_iter(l_datum, l_chain); + if (l_dup_or_skip) { + dap_string_append_printf(l_str_tmp, "Error! Datum unledgered search returned '%d'", l_dup_or_skip); + dap_global_db_del_sync(l_datum_hash_hex_str, l_gdb_group_mempool); + ret = -10; + } else { + 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_add_datums) { + if (l_chain->callback_add_datums(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_global_db_del_sync(l_datum_hash_hex_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; } - }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"); @@ -3036,9 +3038,8 @@ int com_mempool_proc_all(int argc, char ** argv, char ** a_str_reply) { dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); if (!l_net || !l_chain) return -1; - char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - if(!l_gdb_group_mempool) { + if(!dap_chain_net_by_id(l_chain->net_id)) { dap_cli_server_cmd_set_reply_text(a_str_reply, "%s.%s: chain not found\n", l_net->pub.name, l_chain->name); } @@ -3685,31 +3686,24 @@ int com_token_decl(int a_argc, char ** a_argv, char ** a_str_reply) dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str; // Add datum to mempool with datum_token hash as a key - char * l_gdb_group_mempool; - if (l_chain) - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - else - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); + char *l_gdb_group_mempool = l_chain + ? dap_chain_net_get_gdb_group_mempool_new(l_chain) + : dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); if (!l_gdb_group_mempool) { dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing token datum found"); + DAP_DEL_Z(l_key_str); + DAP_DEL_Z(l_key_str_out); DAP_DELETE(l_datum); return -10; } - int l_ret = 0; bool l_placed = dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, l_datum, l_datum_size, true) == 0; dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s with token %s is%s placed in datum pool", l_key_str_out, l_ticker, l_placed ? "" : " not"); - //additional checking for incorrect key format - if (l_key_str_out != l_key_str) - DAP_DELETE(l_key_str); - else - DAP_DELETE(l_key_str); + DAP_DEL_Z(l_key_str); + DAP_DEL_Z(l_key_str_out); DAP_DELETE(l_datum); DAP_DELETE(l_params); - if (!l_placed) { - l_ret = -2; - } - return l_ret; + return l_placed ? 0 : -2; } /** @@ -3886,30 +3880,24 @@ int com_token_update(int a_argc, char ** a_argv, char ** a_str_reply) dap_enc_base58_encode_hash_to_str(&l_key_hash) : l_key_str; // Add datum to mempool with datum_token hash as a key - char * l_gdb_group_mempool; - if (!l_chain) - dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_TOKEN); - l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); + char *l_gdb_group_mempool = l_chain + ? dap_chain_net_get_gdb_group_mempool_new(l_chain) + : dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); if (!l_gdb_group_mempool) { dap_cli_server_cmd_set_reply_text(a_str_reply, "No suitable chain for placing token datum found"); + DAP_DEL_Z(l_key_str); + DAP_DEL_Z(l_key_str_out); DAP_DELETE(l_datum); return -10; } - int l_ret = 0; bool l_placed = !dap_global_db_set_sync(l_gdb_group_mempool, l_key_str, (uint8_t *)l_datum, l_datum_size, false); dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum %s with 256bit token %s is%s placed in datum pool", l_key_str_out, l_ticker, l_placed ? "" : " not"); - //additional checking for incorrect key format - if (l_key_str_out != l_key_str) - DAP_DELETE(l_key_str); - else - DAP_DELETE(l_key_str); + DAP_DEL_Z(l_key_str); + DAP_DEL_Z(l_key_str_out); DAP_DELETE(l_datum); DAP_DELETE(l_params); - if (!l_placed) { - l_ret = -2; - } - return l_ret; + return l_placed ? 0 : -2; } /** @@ -4956,21 +4944,18 @@ int com_tx_create_json(int a_argc, char ** a_argv, char **a_str_reply) // Add transaction to mempool char *l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool_new(l_chain);// get group name for mempool - dap_chain_hash_fast_t *l_datum_tx_hash = DAP_NEW(dap_hash_fast_t); - dap_hash_fast(l_datum_tx->data, l_datum_tx->header.data_size, l_datum_tx_hash);// Calculate datum hash - char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(l_datum_tx_hash); + char *l_tx_hash_str; + dap_get_data_hash_str_static(l_datum_tx->data, l_datum_tx->header.data_size, l_tx_hash_str); bool l_placed = !dap_global_db_set(l_gdb_group_mempool_base_tx,l_tx_hash_str, l_datum_tx, l_datum_tx_size, true, NULL, NULL); DAP_DELETE(l_datum_tx); DAP_DELETE(l_gdb_group_mempool_base_tx); if(!l_placed) { - DAP_DELETE(l_tx_hash_str); dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't add transaction to mempool"); return -90; } // Completed successfully dap_cli_server_cmd_set_reply_text(a_str_reply, "Transaction %s with %zu items created and added to mempool successfully", l_tx_hash_str, l_items_ready); - DAP_DELETE(l_tx_hash_str); return l_err_code; } @@ -6259,7 +6244,6 @@ static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str return -1; } - dap_chain_net_t *l_network = dap_chain_net_by_name(l_opts_sign[OPT_NET]); if (!l_network) { dap_cli_server_cmd_set_reply_text(a_str_reply, "%s network not found", l_opts_sign[OPT_NET]); @@ -6279,30 +6263,21 @@ static int s_signer_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str l_ret = s_get_key_from_file(l_opts_sign[OPT_FILE], l_opts_sign[OPT_MIME], l_opts_sign[OPT_CERT], &l_sign); if (!l_ret) { dap_cli_server_cmd_set_reply_text(a_str_reply, "%s cert not found", l_opts_sign[OPT_CERT]); - l_ret = -1; - goto end; + return -1; } - - l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_SIGNER, l_sign->pkey_n_sign, l_sign->header.sign_size); if (!l_datum) { dap_cli_server_cmd_set_reply_text(a_str_reply, "not created datum"); - l_ret = -1; - goto end; + return -1; } l_ret = l_chain->callback_add_datums(l_chain, &l_datum, 1); - dap_hash_fast_t l_hash; - dap_hash_fast(l_datum->data, l_datum->header.data_size, &l_hash); - char *l_key_str = dap_chain_hash_fast_to_str_new(&l_hash); + char *l_key_str; + dap_get_data_hash_str_static(l_datum->data, l_datum->header.data_size, l_key_str); dap_cli_server_cmd_set_reply_text(a_str_reply, "hash: %s", l_key_str); - DAP_FREE(l_key_str); -end: - - if (l_datum) DAP_FREE(l_datum); - + DAP_DELETE(l_datum); return l_ret; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 645d11650aeab964105b018b09763fec038083fb..b44d3e5d57e55f9edc262ba5ba4a2838752d6aee 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -127,27 +127,22 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, dap_chain_datum_tx_t *l_tx = a_chain->callback_tx_find_by_hash(a_chain, a_tx_hash, &l_atom_hash); if (l_tx) { - char *l_atom_hash_str; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_atom_hash_str = dap_chain_hash_fast_to_str_new(&l_atom_hash); - else - l_atom_hash_str = dap_enc_base58_encode_hash_to_str(&l_atom_hash); + char *l_atom_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&l_atom_hash) + : dap_chain_hash_fast_to_str_new(&l_atom_hash); const char *l_tx_token_ticker = dap_chain_ledger_tx_get_token_ticker_by_hash(a_chain->ledger, a_tx_hash); dap_string_append_printf(l_str_out, "%s TX with atom %s\n", l_tx_token_ticker ? "ACCEPTED" : "DECLINED", l_atom_hash_str); DAP_DELETE(l_atom_hash_str); dap_chain_datum_dump_tx(l_tx, l_tx_token_ticker, l_str_out, a_hash_out_type, a_tx_hash); } else { - char *l_tx_hash_str; - if (!dap_strcmp(a_hash_out_type, "hex")) - l_tx_hash_str = dap_chain_hash_fast_to_str_new(a_tx_hash); - else - l_tx_hash_str = dap_enc_base58_encode_hash_to_str(a_tx_hash); + char *l_tx_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(a_tx_hash) + : dap_chain_hash_fast_to_str_new(a_tx_hash); dap_string_append_printf(l_str_out, "TX hash %s not founds in chains", l_tx_hash_str); DAP_DELETE(l_tx_hash_str); } - char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL; - return l_ret_str; + return l_str_out ? dap_string_free(l_str_out, false) : NULL; } static void s_tx_header_print(dap_string_t *a_str_out, dap_chain_tx_hash_processed_ht_t *a_tx_data_ht, @@ -395,14 +390,13 @@ char* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, const // go to next atom (event or block) l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); } - + a_chain->callback_atom_iter_delete(l_atom_iter); // delete hashes s_dap_chain_tx_hash_processed_ht_free(l_tx_data_ht); // if no history if(!l_str_out->len) dap_string_append(l_str_out, "\tempty"); - char *l_ret_str = l_str_out ? dap_string_free(l_str_out, false) : NULL; - return l_ret_str; + return l_str_out ? dap_string_free(l_str_out, false) : NULL; } /** diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 0393bb10237a6003bcafbaa8c4b0ec41a0b1759c..5f191f9b6c0873bb78609833328f7b4dd891cdaf 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -166,17 +166,17 @@ dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net); DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_mempool_new(dap_chain_t *a_chain) { dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL; - if ( l_net ) - return dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix,a_chain->name); - return NULL; + return l_net + ? dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix,a_chain->name) + : NULL; } DAP_STATIC_INLINE char *dap_chain_net_get_gdb_group_from_chain_new(dap_chain_t *a_chain) { dap_chain_net_t *l_net = a_chain ? dap_chain_net_by_id(a_chain->net_id) : NULL; - if ( l_net ) - return dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X,l_net->pub.name, a_chain->id.uint64); - return NULL; + return l_net + ? dap_strdup_printf("chain-gdb.%s.chain-%016"DAP_UINT64_FORMAT_X, l_net->pub.name, a_chain->id.uint64) + : NULL; } dap_chain_t *dap_chain_net_get_chain_by_chain_type(dap_chain_net_t *a_net, dap_chain_type_t a_datum_type); diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 32aff217939d229457e426ffa7bc7f9e03ea7de3..0eba403cc227013d6e0851ef2eaac20a0a4ffbdb 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -151,8 +151,7 @@ dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_net_t * l_net, dap_cha inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *address) { - char *a_key = dap_hash_fast_str_new((const uint8_t*) address, sizeof(dap_chain_node_addr_t)); - return a_key; + return dap_hash_fast_str_new((const uint8_t*) address, sizeof(dap_chain_node_addr_t)); } bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index f817e0470f9992f02a4dbc5c7e2aead070c9d84b..332a1dd85d1e2611330fdea2b5961748ed46d564 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -519,21 +519,18 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d { if (a_order && a_str_out ){ dap_chain_hash_fast_t l_hash; - char *l_hash_str;//[DAP_CHAIN_HASH_FAST_SIZE * 2 + 4]; dap_hash_fast(a_order, dap_chain_net_srv_order_get_size(a_order), &l_hash); - //dap_chain_hash_fast_to_str(&l_hash,l_hash_str,sizeof(l_hash_str)-1); - if(!dap_strcmp(a_hash_out_type,"hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&l_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&l_hash); + char *l_hash_str = dap_strcmp(a_hash_out_type,"hex") + ? dap_enc_base58_encode_hash_to_str(&l_hash) + : dap_chain_hash_fast_to_str_new(&l_hash); dap_string_append_printf(a_str_out, "== Order %s ==\n", l_hash_str); dap_string_append_printf(a_str_out, " version: %u\n", a_order->version ); switch ( a_order->direction) { - case SERV_DIR_UNDEFINED: dap_string_append_printf(a_str_out, " direction: SERV_DIR_UNDEFINED\n" ); break; - case SERV_DIR_SELL: dap_string_append_printf(a_str_out, " direction: SERV_DIR_SELL\n" ); break; - case SERV_DIR_BUY: dap_string_append_printf(a_str_out, " direction: SERV_DIR_BUY\n" ); break; + case SERV_DIR_UNDEFINED: dap_string_append_printf(a_str_out, " direction: SERV_DIR_UNDEFINED\n" ); break; + case SERV_DIR_SELL: dap_string_append_printf(a_str_out, " direction: SERV_DIR_SELL\n" ); break; + case SERV_DIR_BUY: dap_string_append_printf(a_str_out, " direction: SERV_DIR_BUY\n" ); break; } dap_string_append_printf(a_str_out, " srv_uid: 0x%016"DAP_UINT64_FORMAT_X"\n", a_order->srv_uid.uint64 ); @@ -556,16 +553,15 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d DAP_DELETE(l_region); DAP_DELETE(l_hash_str); - if(!dap_strcmp(a_hash_out_type, "hex")) - l_hash_str = dap_chain_hash_fast_to_str_new(&a_order->tx_cond_hash); - else - l_hash_str = dap_enc_base58_encode_hash_to_str(&a_order->tx_cond_hash); - //dap_chain_hash_fast_to_str(&a_order->tx_cond_hash,l_hash_str, sizeof(l_hash_str)-1); + l_hash_str = dap_strcmp(a_hash_out_type, "hex") + ? dap_enc_base58_encode_hash_to_str(&a_order->tx_cond_hash) + : dap_chain_hash_fast_to_str_new(&a_order->tx_cond_hash); dap_string_append_printf(a_str_out, " tx_cond_hash: %s\n", l_hash_str ); char *l_ext_out = a_order->ext_size ? DAP_NEW_Z_SIZE(char, a_order->ext_size * 2 + 1) : NULL; - dap_bin2hex(l_ext_out, a_order->ext_n_sign, a_order->ext_size); - if(l_ext_out) + if(l_ext_out) { + dap_bin2hex(l_ext_out, a_order->ext_n_sign, a_order->ext_size); dap_string_append_printf(a_str_out, " ext: 0x%s\n", l_ext_out); + } else dap_string_append_printf(a_str_out, " ext: 0x0\n"); // order state diff --git a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c index d7d576969a9452716cca98e295586330cb4fe7c7..15838d6281754c4eccd9e1c993781c3edcc9739e 100644 --- a/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake_lock/dap_chain_net_srv_stake_lock.c @@ -552,7 +552,7 @@ static enum error_code s_cli_take(int a_argc, char **a_argv, int a_arg_index, da } size_t l_owner_pkey_size; - uint8_t *l_owner_pkey = dap_enc_key_serealize_pub_key(l_owner_key, &l_owner_pkey_size); + uint8_t *l_owner_pkey = dap_enc_key_serialize_pub_key(l_owner_key, &l_owner_pkey_size); dap_sign_t *l_owner_sign = NULL; dap_chain_tx_sig_t *l_tx_sign = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get( l_cond_tx, NULL, TX_ITEM_TYPE_SIG, NULL); diff --git a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c index e55baf732e32860ca04738848294f20b3186102f..99185b9c4cd11030178d7ef19effc6320c40fd99 100644 --- a/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake_pos_delegate/dap_chain_net_srv_stake_pos_delegate.c @@ -1094,8 +1094,9 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, dap_string_t *a_string) { - char *l_tx_hash_str = dap_chain_hash_fast_to_str_new(&a_stake->tx_hash); - char *l_pkey_hash_str = dap_chain_hash_fast_to_str_new(&a_stake->signing_addr.data.hash_fast); + char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE], l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&a_stake->tx_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); + dap_chain_hash_fast_to_str(&a_stake->signing_addr.data.hash_fast, l_pkey_hash_str, sizeof(l_pkey_hash_str)); char *l_balance = dap_chain_balance_to_coins(a_stake->value); dap_string_append_printf(a_string, "Pkey hash: %s\n" "\tStake value: %s\n" @@ -1103,8 +1104,6 @@ static void s_srv_stake_print(dap_chain_net_srv_stake_item_t *a_stake, dap_strin "\tNode addr: "NODE_ADDR_FP_STR"\n\n", l_pkey_hash_str, l_balance, l_tx_hash_str, NODE_ADDR_FP_ARGS_S(a_stake->node_addr)); DAP_DELETE(l_balance); - DAP_DELETE(l_tx_hash_str); - DAP_DELETE(l_pkey_hash_str); } /** @@ -1599,12 +1598,10 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) dap_chain_datum_tx_t *l_datum_tx = NULL; dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; int l_out_idx_tmp = 0; - char *l_hash_str = NULL; char *spaces = {"--------------------------------------------------------------------------------------------------------------------"}; char *l_signing_addr_str = NULL; char *l_balance = NULL; char *l_coins = NULL; - char *l_pkey_hash_str = NULL; char* l_node_address_text_block = NULL; dap_chain_net_get_tx_all(l_net,TX_SEARCH_TYPE_NET,s_get_tx_filter_callback, l_args); l_args->ret = dap_list_sort(l_args->ret, callback_compare_tx_list); @@ -1616,16 +1613,17 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) dap_hash_fast(l_datum_tx, dap_chain_datum_tx_get_size(l_datum_tx), &l_datum_hash); l_tx_out_cond = dap_chain_datum_tx_out_cond_get(l_datum_tx, DAP_CHAIN_TX_OUT_COND_SUBTYPE_SRV_STAKE_POS_DELEGATE, &l_out_idx_tmp); - l_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_datum_hash, l_hash_str, sizeof(l_hash_str)); dap_string_append_printf(l_str_tmp,"%s \n",spaces); dap_string_append_printf(l_str_tmp,"%s \n",dap_ctime_r(&l_ts_create, buf)); dap_string_append_printf(l_str_tmp,"tx_hash:\t%s \n",l_hash_str); l_signing_addr_str = dap_chain_addr_to_str(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr); - l_pkey_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr.data.hash_fast); + char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr.data.hash_fast, l_pkey_hash_str, sizeof(l_pkey_hash_str)); l_coins = dap_chain_balance_to_coins(l_tx_out_cond->header.value); l_balance = dap_chain_balance_print(l_tx_out_cond->header.value); - char *l_pkey_hash_str = dap_chain_hash_fast_to_str_new(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr.data.hash_fast); dap_string_append_printf(l_str_tmp,"signing_addr:\t%s \n",l_signing_addr_str); dap_string_append_printf(l_str_tmp,"signing_hash:\t%s \n",l_pkey_hash_str); @@ -1635,9 +1633,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) DAP_DELETE(l_node_address_text_block); DAP_DELETE(l_signing_addr_str); - DAP_DELETE(l_pkey_hash_str); DAP_DELETE(l_balance); - DAP_DELETE(l_hash_str); DAP_DEL_Z(l_coins); } @@ -1763,9 +1759,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) DAP_DELETE(l_decree_hash_str); DAP_DELETE(l_tx); } else { - char *l_final_tx_hash_str = dap_chain_hash_fast_to_str_new(l_final_tx_hash); + char l_final_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(l_final_tx_hash, l_final_tx_hash_str, sizeof(l_final_tx_hash_str)); dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't invalidate transaction %s, examine log files for details", l_final_tx_hash_str); - DAP_DELETE(l_final_tx_hash_str); DAP_DELETE(l_tx); return -21; } @@ -1788,9 +1784,9 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, char **a_str_reply) DAP_DELETE(l_decree); DAP_DELETE(l_decree_hash_str); } else { - char *l_final_tx_hash_str = dap_chain_hash_fast_to_str_new(l_final_tx_hash); + char l_final_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(l_final_tx_hash, l_final_tx_hash_str, sizeof(l_final_tx_hash_str)); dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't invalidate transaction %s, examine log files for details", l_final_tx_hash_str); - DAP_DELETE(l_final_tx_hash_str); DAP_DELETE(l_decree); return -21; } @@ -1939,10 +1935,10 @@ static void s_cache_data(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap return; dap_chain_net_srv_stake_cache_data_t l_cache_data; dap_hash_fast(a_tx, dap_chain_datum_tx_get_size(a_tx), &l_cache_data.tx_hash); + char l_data_key[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_cache_data.tx_hash, l_data_key, sizeof(l_data_key)); l_cache_data.signing_addr = *a_signing_addr; - char *l_data_key = dap_chain_hash_fast_to_str_new(&l_cache_data.tx_hash); char *l_gdb_group = dap_chain_ledger_get_gdb_group(a_ledger, DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_GDB_GROUP); if (dap_global_db_set(l_gdb_group, l_data_key, &l_cache_data, sizeof(l_cache_data), true, NULL, NULL)) log_it(L_WARNING, "Stake service cache mismatch"); - DAP_DELETE(l_data_key); } diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index e7613c3465e7735f16b0377bef031e0723359ae5..e70ab763c9b24ffe3344cf40a81bd467aafb375d 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -299,7 +299,7 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne l_cert = l_certs[0]; if(l_cert) { size_t l_pub_key_data_size = 0; - uint8_t *l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size); + uint8_t *l_pub_key_data = dap_enc_key_serialize_pub_key(l_cert->enc_key, &l_pub_key_data_size); // save pub key if(l_pub_key_data && l_pub_key_data_size > 0){ if(dap_global_db_gr_set(dap_strdup("client_pkey"), l_pub_key_data, l_pub_key_data_size, diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 7b7794b01d853475119c010dc865553a622f1217..2b6b5d437bf2761b3ebff034cc56eb0f3bba04bc 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -313,14 +313,15 @@ static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, cha */ static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta) { - if(a_meta->hdr.data_size == sizeof (dap_chain_hash_fast_t) ){ - char * l_hash_str = dap_chain_hash_fast_to_str_new( (dap_chain_hash_fast_t *) a_meta->data); + if (a_meta->hdr.data_size == sizeof (dap_chain_hash_fast_t)) { + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str((dap_chain_hash_fast_t*)a_meta->data, l_hash_str, sizeof(l_hash_str)); dap_string_append_printf(a_str_tmp,"\t\tPREV: \"%s\": %s\n", a_meta_title,l_hash_str); - DAP_DELETE(l_hash_str); - }else{ - char * l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.data_size*2+3); + } else { + char *l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.data_size * 2 + 3); dap_bin2hex(l_data_hex, a_meta->data, a_meta->hdr.data_size); - dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex ); + dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex); + DAP_DELETE(l_data_hex); } } @@ -332,9 +333,10 @@ static void s_cli_meta_hash_print( dap_string_t * a_str_tmp, const char * a_met */ static void s_cli_meta_hex_print( dap_string_t * a_str_tmp, const char * a_meta_title, dap_chain_block_meta_t * a_meta) { - char * l_data_hex = DAP_NEW_Z_SIZE(char,a_meta->hdr.data_size*2+3); + char *l_data_hex = DAP_NEW_Z_SIZE(char, a_meta->hdr.data_size * 2 + 3); dap_bin2hex(l_data_hex, a_meta->data, a_meta->hdr.data_size); - dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex ); + dap_string_append_printf(a_str_tmp,"\t\t\%s: 0x%s\n", a_meta_title, l_data_hex); + DAP_DELETE(l_data_hex); } /** @@ -453,9 +455,8 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) &l_datum_size, NULL, NULL); l_datums[0] = l_datum; for (size_t i = 0; i < l_datums_count; i++) { - dap_chain_hash_fast_t l_datum_hash = { }; - dap_hash_fast(l_datums[i]->data,l_datums[i]->header.data_size,&l_datum_hash); - char *l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); + char *l_datums_datum_hash_str; + dap_get_data_hash_str_static(l_datums[i]->data, l_datums[i]->header.data_size, l_datums_datum_hash_str); bool l_err = dap_chain_node_mempool_process(l_chain, l_datums[i]); if (l_err) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Error! Datum %s doesn't pass verifications, examine node log files", @@ -466,11 +467,11 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) l_datums_datum_hash_str); ret = 0; } - DAP_DELETE(l_datums_datum_hash_str); if (l_err) break; } dap_cli_server_cmd_set_reply_text(a_str_reply, "All datums processed"); + DAP_DELETE(l_gdb_group_mempool); } break; case SUBCMD_NEW_COMPLETE:{ @@ -555,20 +556,19 @@ static int s_cli_blocks(int a_argc, char ** a_argv, char **a_str_reply) } // Signatures dap_string_append_printf(l_str_tmp,"\t\tsignatures:\tcount: %zu\n",l_block_cache->sign_count ); - for (uint32_t i=0; i < l_block_cache->sign_count ; i++){ - //dap_sign_t * l_sign =l_block_cache->sign[i]; + for (uint32_t i=0; i < l_block_cache->sign_count ; i++) { dap_sign_t * l_sign = dap_chain_block_sign_get(l_block_cache->block, l_block_cache->block_size, i); 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, l_net->pub.id); - char * l_pkey_hash_str = dap_chain_hash_fast_to_str_new(&l_pkey_hash); - char * l_addr_str = dap_chain_addr_to_str(&l_addr); + char l_pkey_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_pkey_hash, l_pkey_hash_str, sizeof(l_pkey_hash_str)); + char *l_addr_str = dap_chain_addr_to_str(&l_addr); dap_string_append_printf(l_str_tmp,"\t\t\ttype:%s size: %zd pkey_hash: %s \n" "\t\t\t\taddr: %s \n", dap_sign_type_to_str( l_sign->header.type ), l_sign_size, l_pkey_hash_str, l_addr_str ); - DAP_DELETE( l_pkey_hash_str ); } dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); dap_string_free(l_str_tmp, true); @@ -1165,6 +1165,9 @@ static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, l_atom_iter->chain = a_chain; l_atom_iter->cell_id = a_cell_id; l_atom_iter->with_treshold = a_with_treshold; +#ifdef WIN32 + log_it(L_DEBUG, "! %p create caller id %lu", l_atom_iter, GetThreadId(GetCurrentThread())); +#endif return l_atom_iter; } @@ -1205,8 +1208,8 @@ static dap_chain_atom_ptr_t s_callback_atom_iter_find_by_hash(dap_chain_atom_ite { assert(a_atom_iter); dap_chain_cs_blocks_pvt_t *l_blocks_pvt = PVT(DAP_CHAIN_CS_BLOCKS(a_atom_iter->chain)); - pthread_rwlock_rdlock(&l_blocks_pvt->rwlock); dap_chain_block_cache_t * l_block_cache = NULL; + pthread_rwlock_rdlock(&l_blocks_pvt->rwlock); HASH_FIND(hh, l_blocks_pvt->blocks, a_atom_hash, sizeof(*a_atom_hash), l_block_cache); pthread_rwlock_unlock(&l_blocks_pvt->rwlock); a_atom_iter->cur_item = l_block_cache; @@ -1405,8 +1408,11 @@ static dap_chain_atom_ptr_t *s_callback_atom_iter_get_lasts( dap_chain_atom_iter * @brief s_callback_atom_iter_delete * @param a_atom_iter */ -static void s_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ) +static void s_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter) { +#ifdef WIN32 + log_it(L_DEBUG, "! %p delete caller id %lu", a_atom_iter, GetThreadId(GetCurrentThread())); +#endif DAP_DELETE(a_atom_iter); } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index d29b0958c3755fb2fe1e9b545dc025c9c894dea1..f6280ad2f36a96e3efb661912db0658c70459725 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -62,7 +62,7 @@ typedef struct dap_chain_cs_dag_event_item { dap_nanotime_t ts_added; dap_chain_cs_dag_event_t *event; size_t event_size; - UT_hash_handle hh; + UT_hash_handle hh, th; } dap_chain_cs_dag_event_item_t; typedef struct dap_chain_cs_dag_blocked { @@ -184,8 +184,7 @@ static void s_history_callback_round_notify(dap_global_db_context_t *a_context, dap_chain_net_t *l_net = dap_chain_net_by_id(l_dag->chain->net_id); debug_if(s_debug_more, L_DEBUG, "%s.%s: op_code='%c' group=\"%s\" key=\"%s\" value_size=%zu", l_net->pub.name, l_dag->chain->name, a_obj->type, a_obj->group, a_obj->key, a_obj->value_len); - if (a_obj->type == DAP_DB$K_OPTYPE_ADD && - l_dag->callback_cs_event_round_sync) { + if (a_obj->type == DAP_DB$K_OPTYPE_ADD && l_dag->callback_cs_event_round_sync) { if (!l_dag->broadcast_disable) dap_chain_cs_dag_event_broadcast(l_dag, a_obj, a_context); if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) // check key for round increment, if no than process event @@ -295,24 +294,17 @@ 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); - 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); - l_dag->broadcast_disable = true; - char *l_gdb_group; - if (!l_dag->is_celled) - l_gdb_group = dap_strdup_printf( "dag-%s-%s-round", l_net->pub.gdb_groups_prefix, a_chain->name); - else { - uint64_t l_cell_id = 0; //a_chain->cells->id.uint64; - l_gdb_group = dap_strdup_printf( "dag-%s-%s-%016"DAP_UINT64_FORMAT_x"-round", l_net->pub.gdb_groups_prefix, a_chain->name, l_cell_id); - } - l_dag->gdb_group_events_round_new = dap_strdup_printf("%s.%s", l_gdb_group, l_round_new_str); + char *l_gdb_group = dap_strdup_printf(l_dag->is_celled ? "dag-%s-%s-%016llx-round" : "dag-%s-%s-round", + l_net->pub.gdb_groups_prefix, a_chain->name, 0LLU); + l_dag->gdb_group_events_round_new = dap_strdup_printf("%s.%s", l_gdb_group, + dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new", "new")); DAP_DELETE(l_gdb_group); - DAP_DELETE(l_round_new_str); dap_global_db_add_sync_extra_group(l_net->pub.name, l_dag->gdb_group_events_round_new, s_history_callback_round_notify, l_dag); l_dag->broadcast_disable = false; byte_t *l_current_round = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL); - l_dag->round_current = l_current_round ? *(uint64_t *)l_current_round : 0; + l_dag->round_current = l_current_round ? *(uint64_t*)l_current_round : 0; DAP_DELETE(l_current_round); dap_global_db_get_all_raw(l_dag->gdb_group_events_round_new, 0, 0, s_dag_rounds_events_iter, l_dag); PVT(l_dag)->mempool_timer = dap_interval_timer_create(15000, s_timer_process_callback, a_chain); @@ -512,6 +504,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha switch (ret) { case ATOM_ACCEPT: ret = s_chain_callback_atom_verify(a_chain, a_atom, a_atom_size); + if (ret == ATOM_MOVE_TO_THRESHOLD) + ret = ATOM_REJECT; /* TODO: A temporary fix for memory consumption */ if(s_debug_more) log_it(L_DEBUG, "Verified atom %p: %s", a_atom, ret == ATOM_ACCEPT ? "accepted" : (ret == ATOM_REJECT ? "rejected" : "thresholded")); @@ -613,121 +607,120 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_ { size_t l_datum_processed = 0; for (size_t i = 0; i < a_datums_count; i++) { - size_t l_datum_size = dap_chain_datum_size(a_datums[i]); - dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_datums[i]; + dap_chain_datum_t *l_datum = *(a_datums + i); + size_t l_datum_size = dap_chain_datum_size(l_datum); if (!l_datum_size || !l_datum) continue; - if (s_chain_callback_datums_pool_proc(a_chain, l_datum)) - l_datum_processed++; + ++l_datum_processed; } return l_datum_processed; - } -static bool s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t *a_datum) -{ - if (!a_datum || !a_chain) { +static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_datum_t *a_datum) { + if (!a_datum || !a_chain) log_it(L_ERROR, "Datum or chain in mempool processing comes NULL"); - return false; - } + dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); - // Prepare hashes - size_t l_hashes_size = l_dag->datum_add_hashes_count; - if (l_dag->is_single_line ) // If single line - only one link inside - l_hashes_size = 1; - dap_chain_hash_fast_t * l_hashes = l_hashes_size ? DAP_NEW_Z_SIZE(dap_chain_hash_fast_t, - sizeof(dap_chain_hash_fast_t) * l_hashes_size) : NULL; - size_t l_hashes_linked = 0; - dap_chain_cell_t *l_cell = NULL; - // Prepare round - if (l_hashes_size & !s_seed_mode) { - pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); - size_t l_rnd_steps = 0; - // Linking events randomly with ones from previous round - do { - dap_chain_cs_dag_event_item_t *l_event_ext_item = NULL; - int l_unlinked_size = HASH_COUNT(PVT(l_dag)->events_lasts_unlinked); - if (!l_unlinked_size) + /* If datum passes thru rounds, let's check if it wasn't added before */ + dap_chain_hash_fast_t l_datum_hash; + dap_hash_fast(a_datum, dap_chain_datum_size(a_datum), &l_datum_hash); + if (!l_dag->is_add_directly) { + bool l_dup_found = false; + size_t l_objs_count = 0; + dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_dag->gdb_group_events_round_new, &l_objs_count); + for (size_t i = 0; i < l_objs_count; ++i) { + dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t*)l_objs[i].value; + if (!memcmp(&l_datum_hash, &(l_round_item->round_info.datum_hash), sizeof(dap_chain_hash_fast_t))) { + l_dup_found = true; break; - int l_index = rand() % l_unlinked_size; - l_event_ext_item = PVT(l_dag)->events_lasts_unlinked; - for (int i = 0; i < l_index; i++) { - l_event_ext_item = l_event_ext_item->hh.next; } - dap_chain_hash_fast_t *l_hash = &l_event_ext_item->hash; + } + dap_global_db_objs_delete(l_objs, l_objs_count); + if (l_dup_found) { + char l_datum_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_datum_hash, l_datum_hash_str, sizeof(l_datum_hash_str)); + log_it(L_ERROR, "Datum %s was already added to round, drop it", l_datum_hash_str); + return false; + } + } + + size_t l_hashes_size = l_dag->is_single_line ? 1 : l_dag->datum_add_hashes_count, + l_hashes_linked = 0; + dap_chain_hash_fast_t *l_hashes = l_hashes_size && !s_seed_mode + ? DAP_NEW_STACK_SIZE(dap_chain_hash_fast_t, l_hashes_size * sizeof(dap_chain_hash_fast_t)) + : NULL; - bool l_is_already_in_event = false; - for (uint16_t i = 0; i < l_hashes_linked; i++) { // check if we already added it - if (l_hashes && memcmp(&l_hashes[i], l_hash, sizeof(*l_hash)) ==0) { - l_is_already_in_event = true; + /* Prepare round */ + if (l_hashes && l_hashes_size) { + pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); + if (!HASH_COUNT(PVT(l_dag)->events_lasts_unlinked)) { + pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + log_it(L_INFO, "Nothing to link"); + return false; + } + /* We'll use modification-safe iteration thru the additional hashtable thus the chosen events will not repeat */ +#define always_true(ev) ({ (void*)ev, true; }) + dap_chain_cs_dag_event_item_t *l_tmp = NULL, *l_cur_ev, *l_tmp_ev; + HASH_SELECT(th, l_tmp, hh, PVT(l_dag)->events_lasts_unlinked, always_true); /* Always true predicate */ + pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + while ((l_hashes_linked < l_hashes_size) && (HASH_CNT(th, l_tmp) > 0)) { + int l_random_id = rand() % HASH_CNT(th, l_tmp), l_hash_id = 0; + HASH_ITER(th, l_tmp, l_cur_ev, l_tmp_ev) { + if (l_hash_id++ == l_random_id) { + l_hashes[l_hashes_linked++] = l_cur_ev->hash; + HASH_DEL(l_tmp, l_cur_ev); break; } } - if (!l_is_already_in_event && l_hashes_linked < l_hashes_size) { - l_hashes[l_hashes_linked++] = *l_hash; - } - - l_rnd_steps++; - if (l_rnd_steps > 100) // Too many attempts - break; - } while (l_hashes_linked < l_hashes_size); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - // Check if we have enought hash links + } + HASH_CLEAR(th, l_tmp); if (l_hashes_linked < l_hashes_size) { - log_it(L_ERROR, "Can't link new events randomly for 100 attempts"); + log_it(L_ERROR, "No enough unlinked events present (only %lu of %lu), a dummy round?", l_hashes_linked, l_hashes_size); return false; } } - if (l_hashes_linked || s_seed_mode ) { - dap_chain_cs_dag_event_t * l_event = NULL; - size_t l_event_size = 0; - byte_t *l_current_round = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL); - l_dag->round_current = l_current_round ? *(uint64_t *)l_current_round : 0; - DAP_DELETE(l_current_round); - if (l_dag->round_current < l_dag->round_completed) - l_dag->round_current = l_dag->round_completed; - uint64_t l_round_current = ++l_dag->round_current; - if (l_dag->callback_cs_event_create) - l_event = l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size); - DAP_DELETE(l_hashes); - if (l_event && l_event_size) { // Event is created - if (l_dag->is_add_directly) { - l_cell = a_chain->cells; - if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) { - if (dap_chain_atom_save(a_chain, (uint8_t *)l_event, l_event_size, a_chain->cells->id) < 0) - log_it(L_ERROR, "Can't add new event to the file"); - return true; - } else { - log_it(L_ERROR, "Can't add new event"); - return false; - } - } else { // add to new round into global_db - dap_global_db_set(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, - &l_round_current, sizeof(uint64_t), false, NULL, NULL); - dap_chain_hash_fast_t l_event_hash, l_datum_hash; - dap_chain_cs_dag_event_round_item_t *l_round_item = - DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_round_item_t, - sizeof(dap_chain_cs_dag_event_round_item_t)); - dap_hash_fast(a_datum, dap_chain_datum_size(a_datum), &l_datum_hash); - l_round_item->round_info.datum_hash = l_datum_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); - bool l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_str, l_event, l_event_size, l_round_item); - DAP_DELETE(l_round_item); - if (l_res) - log_it(L_INFO, "Event %s placed in the new forming round", l_event_hash_str); - else - log_it(L_ERROR,"Can't add new event to the new events round"); - DAP_DEL_Z(l_event_hash_str); - return l_res; - } - } else { - log_it(L_ERROR,"Can't create new event!"); + + /* + * Either we're in seed mode ==> the new event will be not linked to anything + * or we have successfully chosen the hash(es) to link with. + * No additional conditions required. + */ + byte_t *l_current_round = dap_global_db_get_sync(DAG_ROUND_CURRENT_KEY, l_dag->gdb_group_events_round_new, NULL, NULL, NULL); + uint64_t l_round_current = MAX(l_current_round ? *(uint64_t*)l_current_round : 0, l_dag->round_completed); + DAP_DELETE(l_current_round); + l_dag->round_current = ++l_round_current; /* it's an atomic_store */ + uint64_t l_event_size = 0; + dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create + ? l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size) + : NULL; + if (!l_event || !l_event_size) { + log_it(L_ERROR,"Can't create new event!"); + return false; + } + + if (l_dag->is_add_directly) { + dap_chain_atom_verify_res_t l_verify_res; + switch (l_verify_res = s_chain_callback_atom_add(a_chain, l_event, l_event_size)) { + case ATOM_ACCEPT: + return dap_chain_atom_save(a_chain, (uint8_t *)l_event, l_event_size, a_chain->cells->id) > 0; + default: + log_it(L_ERROR, "Can't add new event to the file, atom verification result %d", l_verify_res); return false; } } - return false; + + dap_global_db_set(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, + &l_round_current, sizeof(uint64_t), false, NULL, NULL); + dap_chain_cs_dag_event_round_item_t l_round_item = { .round_info.datum_hash = l_datum_hash }; + char *l_event_hash_str; + dap_get_data_hash_str_static(l_event, l_event_size, l_event_hash_str); + bool l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_str, l_event, l_event_size, &l_round_item); + log_it(l_res ? L_INFO : L_ERROR, + l_res ? "Event %s placed in the new forming round" + : "Can't add new event [%s] to the new events round", + l_event_hash_str); + return l_res; } @@ -825,15 +818,13 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ dap_chain_hash_fast_t l_event_hash; dap_chain_cs_dag_event_calc_hash(l_event,a_atom_size, &l_event_hash); if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ){ - char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); - char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash); + char l_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE], l_genesis_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(&l_event_hash, l_event_hash_str, sizeof(l_event_hash_str)); + dap_chain_hash_fast_to_str(&l_dag->static_genesis_event_hash, l_genesis_event_hash_str, sizeof(l_genesis_event_hash_str)); log_it(L_WARNING, "Wrong genesis event %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 ATOM_REJECT; } else { - if (s_debug_more) - log_it(L_INFO, "Accepting static genesis event"); + debug_if(s_debug_more, L_INFO, "Accepting static genesis event"); return ATOM_ACCEPT; } } @@ -851,11 +842,12 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ pthread_rwlock_rdlock(l_events_rwlock); HASH_FIND(hh, PVT(l_dag)->events ,l_hash ,sizeof (*l_hash), l_event_search); pthread_rwlock_unlock(l_events_rwlock); - if ( l_event_search == NULL ){ - char * l_hash_str = dap_chain_hash_fast_to_str_new(l_hash); - if(s_debug_more) + if (l_event_search == NULL) { + if(s_debug_more) { + char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; + dap_chain_hash_fast_to_str(l_hash, l_hash_str, sizeof(l_hash_str)); log_it(L_WARNING, "Hash %s wasn't in hashtable of previously parsed", l_hash_str); - DAP_DELETE(l_hash_str); + } res = ATOM_MOVE_TO_THRESHOLD; break; } @@ -1051,7 +1043,7 @@ static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_c l_atom_iter->with_treshold = a_with_treshold; pthread_rwlock_rdlock(&a_chain->atoms_rwlock); #ifdef WIN32 - log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread())); + log_it(L_DEBUG, "! %p create caller id %lu", l_atom_iter, GetThreadId(GetCurrentThread())); #endif return l_atom_iter; } @@ -1063,20 +1055,20 @@ static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_c * @param a_datums_count * @return */ -static dap_chain_datum_t** s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size, size_t *a_datums_count) +static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size, size_t *a_datums_count) { assert(a_datums_count); - if(a_event){ - dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*) a_event, a_atom_size); - if (l_datum){ - dap_chain_datum_t ** l_datums = DAP_NEW_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*)); - *a_datums_count = 1; - l_datums[0] = l_datum; - return l_datums; - }else - return NULL; - }else + if (!a_event) return NULL; + dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*)a_event, a_atom_size); + if (!l_datum) + return NULL; + + dap_chain_datum_t **l_datums = DAP_NEW_Z(dap_chain_datum_t*); + if (a_datums_count) + *a_datums_count = 1; + l_datums[0] = l_datum; + return l_datums; } /** @@ -1199,7 +1191,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato char * l_link_hash_str = dap_chain_hash_fast_to_str_new(l_link_hash); char * l_event_hash_str = l_event_item ? dap_chain_hash_fast_to_str_new(&l_event_item->hash) : NULL; log_it(L_ERROR,"Can't find %s->%s links", l_event_hash_str ? l_event_hash_str : "[null]", l_link_hash_str); - DAP_DELETE(l_event_hash_str); + DAP_DEL_Z(l_event_hash_str); DAP_DELETE(l_link_hash_str); (*a_links_size_array)--; } @@ -1416,8 +1408,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) // If not verify only mode we add if ( ! l_verify_only ){ dap_chain_atom_ptr_t l_new_atom = DAP_DUP_SIZE(l_event, l_event_size); // produce deep copy of event; - memcpy((void *)l_new_atom, l_event, l_event_size); - if(s_chain_callback_atom_add(l_chain, l_new_atom,l_event_size) < 0) { // Add new atom in chain + if(s_chain_callback_atom_add(l_chain, l_new_atom, l_event_size) < 0) { // Add new atom in chain DAP_DELETE(l_new_atom); dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key); } else { @@ -1452,9 +1443,8 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) // Spread new mempool changes and dag events in network - going to SYNC_ALL // dap_chain_net_sync_all(l_net); } - }else if ( l_event_cmd_str ) { - char *l_datum_hash_hex_str = NULL; - char *l_datum_hash_base58_str = NULL; + } else if (l_event_cmd_str) { + char *l_datum_hash_hex_str = NULL, *l_datum_hash_base58_str = NULL; if ( strcmp( l_event_cmd_str, "create" ) == 0 ) { dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); @@ -1488,8 +1478,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) l_event_subcmd = SUBCMD_UNDEFINED; } - char *l_event_hash_hex_str = NULL; - char *l_event_hash_base58_str = NULL; + char *l_event_hash_hex_str = NULL, *l_event_hash_base58_str = NULL; // datum hash may be in hex or base58 format if(l_event_hash_str) { if(!dap_strncmp(l_event_hash_str, "0x", 2) || !dap_strncmp(l_event_hash_str, "0X", 2)) { @@ -1503,114 +1492,100 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) } if (l_event_hash_hex_str) - dap_chain_hash_fast_from_str(l_event_hash_hex_str,&l_event_hash); - - switch ( l_event_subcmd ){ - case SUBCMD_EVENT_CREATE:{ - size_t l_datums_count=1; - char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); - dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, - sizeof(dap_chain_datum_t*)*l_datums_count); - size_t l_datum_size = 0; - dap_chain_datum_t * l_datum = (dap_chain_datum_t*) dap_global_db_get_sync(l_gdb_group_mempool, l_datum_hash_hex_str , - &l_datum_size, NULL, NULL ); - l_datums[0] = l_datum; - if ( s_callback_add_datums(l_chain, l_datums, l_datums_count) == l_datums_count ){ - for ( size_t i = 0; i <l_datums_count; i++){ - dap_chain_hash_fast_t l_datum_hash; - dap_hash_fast(l_datums[i]->data,l_datums[i]->header.data_size, &l_datum_hash); - char * l_datums_datum_hash_str = dap_chain_hash_fast_to_str_new(&l_datum_hash); - if ( dap_global_db_del_sync(l_gdb_group_mempool, l_datums_datum_hash_str ) ==0 ){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Converted datum %s from mempool to event in the new forming round ", - l_datums_datum_hash_str); - DAP_DELETE(l_datums_datum_hash_str); - ret = 0; - }else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Warning! Can't delete datum %s from mempool after conversion to event in the new forming round ", - l_datums_datum_hash_str); - ret = 1; - } - } - }else { - if(!dap_strcmp(l_hash_out_type,"hex")){ + dap_chain_hash_fast_from_str(l_event_hash_hex_str, &l_event_hash); + + switch (l_event_subcmd) { + + case SUBCMD_EVENT_CREATE: { + char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); + size_t l_datum_size = 0; + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) + dap_global_db_get_sync(l_datum_hash_hex_str,l_gdb_group_mempool, &l_datum_size, NULL, NULL); + if (s_callback_add_datums(l_chain, &l_datum, 1)) { + char *l_datums_datum_hash_str; + dap_get_data_hash_str_static(l_datum->data, l_datum->header.data_size, l_datums_datum_hash_str); + if (dap_global_db_del_sync(l_datum_hash_str, l_gdb_group_mempool)) { dap_cli_server_cmd_set_reply_text(a_str_reply, - "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_hex_str); - } - else { + "Converted datum %s from mempool to event in the new forming round ", + l_datum_hash_str); + ret = 0; + } else { dap_cli_server_cmd_set_reply_text(a_str_reply, - "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_base58_str); + "Warning! Can't delete datum %s from mempool after conversion to event in the new forming round ", + l_datum_hash_str); + ret = 1; } + } else { + if (!dap_strcmp(l_hash_out_type, "hex")) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_hex_str); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Warning! Can't convert datum %s from mempool to event in the new forming round ", l_datum_hash_base58_str); + ret = -12; + } + } + DAP_DELETE(l_gdb_group_mempool); + // dap_chain_net_sync_all(l_net); + } break; /* SUBCMD_EVENT_CREATE */ + case SUBCMD_EVENT_CANCEL: { + char *l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; + if (dap_global_db_del_sync(l_gdb_group_events, l_event_hash_hex_str) == 0) { + if(!dap_strcmp(l_hash_out_type, "hex")) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Successfuly removed event %s from the new forming round ", + l_event_hash_hex_str); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Successfuly removed event %s from the new forming round ", + l_event_hash_base58_str); } - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_datum_hash_hex_str); - DAP_DELETE(l_datum_hash_base58_str); - // dap_chain_net_sync_all(l_net); - }break; - case SUBCMD_EVENT_CANCEL:{ - char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; - if ( dap_global_db_del_sync(l_gdb_group_events, l_event_hash_hex_str ) ==0){ - if(!dap_strcmp(l_hash_out_type, "hex")){ + ret = 0; + } else { + dap_chain_cs_dag_event_item_t * l_event_item = NULL; + pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); + HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); + pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + if (l_event_item) { + pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); + HASH_DELETE(hh, PVT(l_dag)->events, l_event_item); + pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + if(!dap_strcmp(l_hash_out_type, "hex")) { + log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", + l_event_hash_hex_str); dap_cli_server_cmd_set_reply_text(a_str_reply, - "Successfuly removed event %s from the new forming round ", - l_event_hash_hex_str); - } - else{ + "Dropped event 0x%s from chains! Hope you know what are you doing! ", + l_event_hash_hex_str); + } else { + log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", + l_event_hash_base58_str); dap_cli_server_cmd_set_reply_text(a_str_reply, - "Successfuly removed event %s from the new forming round ", - l_event_hash_base58_str); + "Dropped event 0x%s from chains! Hope you know what are you doing! ", + l_event_hash_base58_str); } - ret = 0; - }else { - dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); - HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - if ( l_event_item ){ - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); - HASH_DELETE(hh, PVT(l_dag)->events, l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); - if(!dap_strcmp(l_hash_out_type, "hex")) { - log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", - l_event_hash_hex_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Dropped event 0x%s from chains! Hope you know what are you doing! ", - l_event_hash_hex_str); - } - else { - log_it(L_WARNING, "Dropped event %s from chains! Hope you know what are you doing!", - l_event_hash_base58_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Dropped event 0x%s from chains! Hope you know what are you doing! ", - l_event_hash_base58_str); - } - dap_chain_save_all(l_chain); - }else { - if(!dap_strcmp(l_hash_out_type, "hex")) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't remove event 0x%s ", - l_event_hash_hex_str); - } - else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't remove event 0x%s ", - l_event_hash_base58_str); - } - ret = -1; + dap_chain_save_all(l_chain); + } else { + if(!dap_strcmp(l_hash_out_type, "hex")) { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Can't remove event 0x%s ", + l_event_hash_hex_str); + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, + "Can't remove event 0x%s ", + l_event_hash_base58_str); } + ret = -1; } - DAP_DELETE(l_event_hash_hex_str); - DAP_DELETE(l_event_hash_base58_str); - // 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_info_t l_event_round_info; - size_t l_event_size = 0; + } + // dap_chain_net_sync_gdb(l_net); + } break; /* SUBCMD_EVENT_CANCEL */ + + 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; + size_t l_event_size = 0; if (l_from_events_str && strcmp(l_from_events_str,"round.new") == 0) { const char * l_gdb_group_events = l_dag->gdb_group_events_round_new; size_t l_round_item_size = 0; @@ -1753,7 +1728,8 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) } DAP_DELETE(l_round_item); } break; - case SUBCMD_EVENT_LIST:{ + + case SUBCMD_EVENT_LIST: { if (l_from_events_str && strcmp(l_from_events_str,"round.new") == 0) { char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; dap_string_t * l_str_tmp = dap_string_new(""); @@ -1825,7 +1801,7 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) ret=-14; } - }break; + } break; case SUBCMD_EVENT_SIGN: { // Sign event command char * l_gdb_group_events = l_dag->gdb_group_events_round_new; size_t l_round_item_size = 0; @@ -1888,7 +1864,11 @@ static int s_cli_dag(int argc, char ** argv, char **a_str_reply) ret=-11; } } - }else { + DAP_DEL_Z(l_datum_hash_hex_str); + DAP_DEL_Z(l_datum_hash_base58_str); + DAP_DEL_Z(l_event_hash_hex_str); + DAP_DEL_Z(l_event_hash_base58_str); + } else { dap_cli_server_cmd_set_reply_text(a_str_reply, "Undefined subcommand"); ret = -13; diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index e8609e97b19614c53216ea6ee26bc710ac072ff4..cddbc4bdd5ef1dfdb11605e3d4e3b72647481902 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -105,7 +105,7 @@ size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, s // check for re-sign with same key if (dap_chain_cs_dag_event_sign_exists(l_event, a_event_size, a_key)) { size_t l_pub_key_size = 0; - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); + uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); dap_hash_fast_t l_pkey_hash = {}; dap_hash_fast(l_pub_key, l_pub_key_size, &l_pkey_hash); DAP_DEL_Z(l_pub_key); @@ -128,7 +128,7 @@ size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, s static bool s_sign_exists(uint8_t *a_pos, size_t a_len, dap_enc_key_t *a_key) { size_t l_pub_key_size = 0; - uint8_t *l_pub_key = dap_enc_key_serealize_pub_key(a_key, &l_pub_key_size); + uint8_t *l_pub_key = dap_enc_key_serialize_pub_key(a_key, &l_pub_key_size); uint8_t *l_offset = a_pos; while (l_offset < a_pos + a_len) { dap_sign_t * l_item_sign = (dap_sign_t *)l_offset; 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 4a1785773ec8261f60efb196b3b92844ed5e415b..388508dccb0630a039d4289adad542bd5acbaca6 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -78,19 +78,18 @@ dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, */ static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) { - return a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)<=a_event_size?(dap_chain_datum_t* ) (a_event->hashes_n_datum_n_signs - +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)): NULL; + return a_event->header.hash_count * sizeof(dap_chain_hash_fast_t) <= a_event_size + ? (dap_chain_datum_t*)(a_event->hashes_n_datum_n_signs + a_event->header.hash_count * sizeof(dap_chain_hash_fast_t)) + : NULL; } static inline size_t dap_chain_cs_dag_event_get_datum_size_maximum(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) { - return a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)<=a_event_size ? - a_event_size - a_event->header.hash_count*sizeof(dap_chain_hash_fast_t): 0; + return a_event->header.hash_count * sizeof(dap_chain_hash_fast_t) <= a_event_size + ? a_event_size - a_event->header.hash_count * sizeof(dap_chain_hash_fast_t) + : 0; } -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_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);