diff --git a/CMakeLists.txt b/CMakeLists.txt index 87f693ce8f15040dec97208f3d0ec55173b55224..a7a98f61469e8f8fcd5b097ead26a764fba887cf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ endif() if(NOT DEFINED CELLFRAME_MODULES) include (dap-sdk/cmake/OS_Detection.cmake) - set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-dag-pos cs-block-pos cs-esbocs cs-none srv-app srv-app-db srv-datum srv-stake srv-voting srv-bridge srv-xchange") + set(CELLFRAME_MODULES "core chains mining network srv cs-dag-poa cs-block-poa cs-block-pos cs-esbocs cs-none srv-app srv-app-db srv-datum srv-stake srv-voting srv-bridge srv-xchange") if(LINUX OR DARWIN) set(CELLFRAME_MODULES "${CELLFRAME_MODULES} srv-vpn") diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 3b4079665a1c524cb670301839d79682a042ca25..b177cae7600f4d7ac61547dded161a7437ab548e 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -49,11 +49,6 @@ if (CELLFRAME_MODULES MATCHES "cs-dag-poa") add_subdirectory(consensus/dag-poa) endif() -# DAG PoS -if (CELLFRAME_MODULES MATCHES "cs-dag-pos") - add_subdirectory(consensus/dag-pos) -endif() - # Consensus type blocks if (CELLFRAME_MODULES MATCHES "cs-block-") add_subdirectory(type/blocks) diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index d1a0d3c46126f576a00ca288437deeb64899db50..5fc8fa11461308a07281a83cffc9b818571b5933 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -41,8 +41,10 @@ #include "dap_cert_file.h" #include "dap_chain_ch.h" #include "dap_stream_ch_gossip.h" +#include "dap_notify_srv.h" #include <uthash.h> #include <pthread.h> +#include "json.h" #define LOG_TAG "chain" @@ -101,7 +103,7 @@ dap_chain_t *dap_chain_create(const char *a_chain_net_name, const char *a_chain_ { dap_chain_t *l_ret = DAP_NEW_Z(dap_chain_t); if ( !l_ret ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } *l_ret = (dap_chain_t) { @@ -119,7 +121,7 @@ dap_chain_t *dap_chain_create(const char *a_chain_net_name, const char *a_chain_ DAP_DEL_Z(l_ret->name); DAP_DEL_Z(l_ret->net_name); DAP_DELETE(l_ret); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->_pvt = l_chain_pvt; @@ -129,7 +131,7 @@ dap_chain_t *dap_chain_create(const char *a_chain_net_name, const char *a_chain_ DAP_DEL_Z(l_ret->net_name); DAP_DELETE(l_ret->_pvt); DAP_DELETE(l_ret); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } *l_ret_item = (dap_chain_item_t) { @@ -177,6 +179,7 @@ void dap_chain_delete(dap_chain_t * a_chain) if (a_chain->callback_delete) a_chain->callback_delete(a_chain); DAP_DEL_Z(a_chain->_inheritor); + dap_config_close(a_chain->config); pthread_rwlock_destroy(&a_chain->rwlock); pthread_rwlock_destroy(&a_chain->cell_rwlock); } @@ -442,7 +445,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net l_chain->datum_types = DAP_NEW_SIZE(dap_chain_type_t, l_datum_types_count * sizeof(dap_chain_type_t)); // TODO: pls check counter for recognized types before memory allocation! if ( !l_chain->datum_types ) { DAP_DELETE(l_chain); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_count_recognized = 0; @@ -467,7 +470,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net if (l_chain->datum_types) DAP_DELETE(l_chain->datum_types); DAP_DELETE(l_chain); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_count_recognized = 0; @@ -493,7 +496,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net { l_chain->autoproc_datum_types = DAP_NEW_Z_SIZE(uint16_t, l_chain->datum_types_count * sizeof(uint16_t)); // TODO: pls check counter for recognized types before memory allocation! if ( !l_chain->autoproc_datum_types ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); if (l_chain->datum_types) DAP_DELETE(l_chain->datum_types); if (l_chain->default_datum_types) @@ -523,7 +526,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net } else l_chain->autoproc_datum_types_count = 0; } - if (l_chain && l_chain->config) + if (l_chain) l_chain->config = l_cfg; return l_chain; } else @@ -580,6 +583,19 @@ int dap_chain_save_all(dap_chain_t *l_chain) return l_ret; } +//send chain load_progress data to notify socket +bool download_notify_callback(dap_chain_t* a_chain) { + json_object* l_chain_info = json_object_new_object(); + json_object_object_add(l_chain_info, "class", json_object_new_string("chain_init")); + json_object_object_add(l_chain_info, "net", json_object_new_string(a_chain->net_name)); + json_object_object_add(l_chain_info, "chain_id", json_object_new_uint64(a_chain->id.uint64)); + json_object_object_add(l_chain_info, "load_progress", json_object_new_int(a_chain->load_progress)); + dap_notify_server_send_mt(json_object_get_string(l_chain_info)); + log_it(L_DEBUG, "Load progress: net_name: %s; chain_id: %" DAP_UINT64_FORMAT_U "; download:%d%%", a_chain->net_name, a_chain->id.uint64, a_chain->load_progress); + json_object_put(l_chain_info); + return true; +} + /** * @brief dap_chain_load_all * @param l_chain @@ -610,6 +626,7 @@ int dap_chain_load_all(dap_chain_t *a_chain) uint64_t l_cell_id_uint64 = 0; sscanf(l_filename, "%"DAP_UINT64_FORMAT_x".dchaincell", &l_cell_id_uint64); dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(a_chain, (dap_chain_cell_id_t){ .uint64 = l_cell_id_uint64 }); + dap_timerfd_t* l_download_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)download_notify_callback, a_chain); l_ret += dap_chain_cell_load(a_chain, l_cell); if ( DAP_CHAIN_PVT(a_chain)->need_reorder ) { #ifdef DAP_OS_WINDOWS @@ -629,6 +646,8 @@ int dap_chain_load_all(dap_chain_t *a_chain) DAP_DELETE(l_filename_backup); #endif } + dap_timerfd_delete_unsafe(l_download_notify_timer); + download_notify_callback(a_chain); } } closedir(l_dir); @@ -816,7 +835,7 @@ void dap_chain_atom_notify(dap_chain_cell_t *a_chain_cell, dap_hash_fast_t *a_ha dap_chain_atom_notifier_t *l_notifier = (dap_chain_atom_notifier_t*)l_iter->data; struct chain_thread_notifier *l_arg = DAP_NEW_Z(struct chain_thread_notifier); if (!l_arg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); continue; } *l_arg = (struct chain_thread_notifier) { diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index e72e14f11b9378e74819f808c84abae5e3c471a9..db4138e4a7c9e4286b244e64f5a56e0fda1f9c15 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -172,6 +172,9 @@ DAP_STATIC_INLINE int s_cell_map_new_volume(dap_chain_cell_t *a_cell, size_t a_f a_cell->file_storage_path, a_cell->id.uint64, errno); return -1; } +#ifdef DAP_OS_DARWIN + a_cell->cur_vol_start = l_volume_start; +#endif #endif a_cell->map_pos = a_cell->map + l_offset; a_cell->map_range_bounds = dap_list_append(a_cell->map_range_bounds, a_cell->map); @@ -213,13 +216,15 @@ dap_chain_cell_t * dap_chain_cell_create_fill(dap_chain_t * a_chain, dap_chain_c pthread_rwlock_unlock(&a_chain->cell_rwlock); return l_cell; } -#define CLEANUP_AND_RET return ({ fclose(l_file); DAP_DELETE(l_cell); pthread_rwlock_unlock(&a_chain->cell_rwlock); NULL; }) char file_storage_path[MAX_PATH]; snprintf(file_storage_path, MAX_PATH, "%s/%0"DAP_UINT64_FORMAT_x".dchaincell", DAP_CHAIN_PVT(a_chain)->file_storage_dir, a_cell_id.uint64); - - FILE *l_file = fopen(file_storage_path, "a+b"); - if ( !l_file ) { + FILE *l_file = NULL; +#define CLEANUP_AND_RET return ({ if (l_file) fclose(l_file); \ + DAP_DELETE(l_cell); \ + pthread_rwlock_unlock(&a_chain->cell_rwlock); \ + NULL; }) + if ( !(l_file = fopen(file_storage_path, "a+b")) ) { log_it(L_ERROR, "Chain cell \"%s\" 0x%016"DAP_UINT64_FORMAT_X" cannot be opened, error %d", file_storage_path, a_cell_id.uint64, errno); CLEANUP_AND_RET; @@ -439,7 +444,7 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) uint64_t q = 0; if (a_chain->is_mapped) { a_cell->map_pos = a_cell->map + sizeof(dap_chain_cell_file_header_t); - for ( uint64_t l_el_size = 0; l_pos < l_size; ++q, l_pos += l_el_size + sizeof(uint64_t) ) { + for ( uint64_t l_el_size = 0; l_pos < l_size; ++q, l_pos += l_el_size + sizeof(uint64_t), a_chain->load_progress = (int)((double)l_pos/l_size * 100 + 0.5)) { size_t space_left = (size_t)( a_cell->map_end - a_cell->map_pos ); if ( space_left < sizeof(uint64_t) || (space_left - sizeof(uint64_t)) < *(uint64_t*)a_cell->map_pos ) if ( s_cell_map_new_volume(a_cell, l_pos) ) @@ -468,6 +473,7 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) break; } l_pos += sizeof(uint64_t) + ( l_read = fread((void*)l_element, 1, l_el_size, a_cell->file_storage) ); + a_chain->load_progress = (int)((double)l_pos/l_size * 100 + 0.5); if (l_read != l_el_size) { log_it(L_ERROR, "Read only %lu of %zu bytes, stop cell loading", l_read, l_el_size); DAP_DELETE(l_element); @@ -522,6 +528,16 @@ static int s_cell_file_atom_add(dap_chain_cell_t *a_cell, dap_chain_atom_ptr_t a debug_if (s_debug_more && a_cell->chain->is_mapped, L_DEBUG, "After writing an atom of size %lu, stream pos of %s is %lu and map shift is %lu", a_atom_size, a_cell->file_storage_path, ftell(a_cell->file_storage), (size_t)(a_cell->map_pos - a_cell->map)); +#ifdef DAP_OS_DARWIN + if (a_cell->chain->is_mapped) { + if ( MAP_FAILED == (a_cell->map = mmap(a_cell->map, dap_page_roundup(DAP_MAPPED_VOLUME_LIMIT), PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_FIXED, fileno(a_cell->file_storage), a_cell->cur_vol_start)) ) { + log_it(L_ERROR, "Chain cell \"%s\" 0x%016"DAP_UINT64_FORMAT_X" cannot be remapped, errno %d", + a_cell->file_storage_path, a_cell->id.uint64, errno); + return -1; + } + } +#endif return 0; } @@ -601,7 +617,7 @@ ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell, const void *a_atom, ++l_count; l_total_res = a_atom_size + sizeof(uint64_t); } - + if (l_total_res) { fflush(a_cell->file_storage); #ifdef DAP_OS_WINDOWS diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 5824132b4b7f2a063281bd60aa3a33967b3eb859..236806288defa1f0c6aa353b3b6ef391f220c384 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -225,7 +225,7 @@ void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg) { UNUSED(a_arg); if (!(a_ch->internal = DAP_NEW_Z(dap_chain_ch_t))) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; }; dap_chain_ch_t *l_ch_chain = DAP_CHAIN_CH(a_ch); @@ -262,7 +262,7 @@ static void s_stream_ch_delete(dap_stream_ch_t *a_ch, void *a_arg) * @param a_ch_chain * @param a_net */ -struct legacy_sync_context *s_legacy_sync_context_create(dap_chain_ch_pkt_t *a_chain_pkt, dap_stream_ch_t *a_ch) +struct legacy_sync_context *s_legacy_sync_context_create(dap_stream_ch_t *a_ch) { dap_chain_ch_t * l_ch_chain = DAP_CHAIN_CH(a_ch); dap_return_val_if_fail(l_ch_chain, NULL); @@ -273,14 +273,12 @@ struct legacy_sync_context *s_legacy_sync_context_create(dap_chain_ch_pkt_t *a_c *l_context = (struct legacy_sync_context) { .worker = a_ch->stream_worker, .ch_uuid = a_ch->uuid, - .remote_addr = *(dap_stream_node_addr_t *)a_chain_pkt->data, - .request_hdr = a_chain_pkt->hdr, .state = DAP_CHAIN_CH_STATE_IDLE, .last_activity = dap_time_now() }; dap_stream_ch_uuid_t *l_uuid = DAP_DUP(&a_ch->uuid); if (!l_uuid) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_context); return NULL; } @@ -373,7 +371,7 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg) l_data_size = dap_list_length(l_list_out) * sizeof(dap_chain_ch_update_element_t); l_data = DAP_NEW_Z_SIZE(dap_chain_ch_update_element_t, l_data_size); if (!l_data) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_context->state = DAP_CHAIN_CH_STATE_ERROR; goto context_delete; } @@ -411,7 +409,7 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg) } l_pkt_pack = dap_global_db_pkt_pack_old(l_pkt_pack, l_pkt); if (!l_pkt_pack || l_cur_size == l_pkt_pack->data_size) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_context->state = DAP_CHAIN_CH_STATE_ERROR; goto context_delete; } @@ -502,7 +500,7 @@ static bool s_sync_out_chains_proc_callback(void *a_arg) if (l_cur_state == DAP_CHAIN_CH_STATE_UPDATE_CHAINS) { l_hashes = DAP_NEW_Z_SIZE(dap_chain_ch_update_element_t, s_update_pack_size * sizeof(dap_chain_ch_update_element_t)); if (!l_hashes) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_context->state = DAP_CHAIN_CH_STATE_ERROR; goto context_delete; } @@ -675,7 +673,7 @@ static void s_gossip_payload_callback(void *a_payload, size_t a_payload_size, da } struct atom_processing_args *l_args = DAP_NEW_SIZE(struct atom_processing_args, a_payload_size + sizeof(struct atom_processing_args)); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_args->addr = a_sender_addr; @@ -768,7 +766,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } struct atom_processing_args *l_args = DAP_NEW_SIZE(struct atom_processing_args, l_ch_pkt->hdr.data_size + sizeof(struct atom_processing_args)); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); break; } l_args->addr = a_ch->stream->node; @@ -856,7 +854,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) atomic_store(&l_context->allowed_num, l_sum.num_cur + s_sync_ack_window_size); dap_stream_ch_uuid_t *l_uuid = DAP_DUP(&a_ch->uuid); if (!l_uuid) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_context); break; } @@ -970,6 +968,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_CHAIN_CH_PKT_TYPE_SYNCED_CHAIN: { dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); + l_chain->atom_num_last = l_chain->callback_count_atom(l_chain); log_it(L_INFO, "In: SYNCED_CHAIN %s for net %s from source " NODE_ADDR_FP_STR, l_chain ? l_chain->name : "(null)", l_chain ? l_chain->net_name : "(null)", @@ -1055,7 +1054,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY); break; } - struct legacy_sync_context *l_context = s_legacy_sync_context_create(l_chain_pkt, a_ch); + struct legacy_sync_context *l_context = s_legacy_sync_context_create(a_ch); if (!l_context) { log_it(L_ERROR, "Can't create sychronization context"); dap_global_db_legacy_list_delete(l_db_list); @@ -1128,7 +1127,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if (!l_hash_item) { l_hash_item = DAP_NEW_Z(dap_chain_ch_hash_item_t); if (!l_hash_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY); @@ -1232,7 +1231,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) DAP_NEW_Z_RET_VAL(l_args, struct record_processing_args, true, NULL); l_args->pkt = DAP_DUP_SIZE(l_pkt, l_chain_pkt_data_size); if (!l_args->pkt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_args); dap_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, @@ -1307,7 +1306,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY); break; } - struct legacy_sync_context *l_context = s_legacy_sync_context_create(l_chain_pkt, a_ch); + struct legacy_sync_context *l_context = s_legacy_sync_context_create(a_ch); if (!l_context) { log_it(L_ERROR, "Can't create sychronization context"); l_chain->callback_atom_iter_delete(l_atom_iter); @@ -1318,7 +1317,6 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } l_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_FIRST, NULL); l_context->atom_iter = l_atom_iter; - l_context->remote_addr = *(dap_stream_node_addr_t *)l_chain_pkt->data; l_context->request_hdr = l_chain_pkt->hdr; l_ch_chain->legacy_sync_context = l_context; l_context->state = DAP_CHAIN_CH_STATE_UPDATE_CHAINS; @@ -1384,7 +1382,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if (!l_hash_item) { l_hash_item = DAP_NEW_Z(dap_chain_ch_hash_item_t); if (!l_hash_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY); @@ -1487,7 +1485,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) debug_if(s_debug_legacy, L_INFO, "In: CHAIN_OLD data_size=%zu", l_chain_pkt_data_size); struct atom_processing_args *l_args = DAP_NEW_Z_SIZE(struct atom_processing_args, l_ch_pkt->hdr.data_size + sizeof(struct atom_processing_args)); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, DAP_CHAIN_CH_ERROR_OUT_OF_MEMORY); diff --git a/modules/chain/dap_chain_ch_pkt.c b/modules/chain/dap_chain_ch_pkt.c index e774210cf23eebb1bc0ac8e4e42c7603396dbb55..f09013d7b5422983e06af6618c1a23b0e26477c6 100644 --- a/modules/chain/dap_chain_ch_pkt.c +++ b/modules/chain/dap_chain_ch_pkt.c @@ -57,7 +57,7 @@ size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, : DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); if (!l_chain_pkt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 0; } s_chain_pkt_fill(l_chain_pkt, a_net_id, a_chain_id, a_cell_id, a_data, a_data_size, a_version); @@ -76,7 +76,7 @@ dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(dap_chain_net_id_t a_net_id, dap_chain_ if (l_chain_pkt) s_chain_pkt_fill(l_chain_pkt, a_net_id, a_chain_id, a_cell_id, a_data, a_data_size, a_version); else - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return l_chain_pkt; } /** @@ -101,7 +101,7 @@ size_t dap_chain_ch_pkt_write_mt(dap_stream_worker_t *a_worker, dap_stream_ch_uu : DAP_NEW_STACK_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); if (!l_chain_pkt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 0; } s_chain_pkt_fill(l_chain_pkt, a_net_id, a_chain_id, a_cell_id, a_data, a_data_size, a_version); diff --git a/modules/chain/dap_chain_cs.c b/modules/chain/dap_chain_cs.c index 6162fcd345500d0d460ac64d2ff833b81295784b..211dfe40cd8255255e963f59e7512f568dde3ac1 100644 --- a/modules/chain/dap_chain_cs.c +++ b/modules/chain/dap_chain_cs.c @@ -65,7 +65,7 @@ void dap_chain_cs_type_add (const char * a_cs_str, dap_chain_callback_new_cfg_t { dap_chain_callback_new_cfg_item_t *l_item = DAP_NEW_Z ( dap_chain_callback_new_cfg_item_t ); if ( !l_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } strncpy(l_item->name, a_cs_str, sizeof (l_item->name) - 1); @@ -100,7 +100,7 @@ void dap_chain_cs_add (const char * a_cs_str, dap_chain_callback_new_cfg_t a_ca { dap_chain_callback_new_cfg_item_t *l_item = DAP_NEW_Z ( dap_chain_callback_new_cfg_item_t ); if ( !l_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } strncpy(l_item->name, a_cs_str, sizeof (l_item->name) - 1); diff --git a/modules/chain/dap_chain_tx.c b/modules/chain/dap_chain_tx.c index f2c4511dc5b283061e097c630b05961d57a1e9d1..773ae6a1b1f7fbe008f8be70a6d9f3ecaa06c1e4 100644 --- a/modules/chain/dap_chain_tx.c +++ b/modules/chain/dap_chain_tx.c @@ -36,7 +36,7 @@ dap_chain_tx_t * dap_chain_tx_wrap_packed(dap_chain_datum_tx_t * a_tx_packed) { dap_chain_tx_t * l_tx = DAP_NEW_Z(dap_chain_tx_t); if (!l_tx) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } dap_hash_fast(a_tx_packed, dap_chain_datum_tx_get_size(a_tx_packed), &l_tx->hash); diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 6d8b28b553d89510c5cf8f1664d6d69c34d6a88b..5d10ba584ffbc32504e9d0f4650ba5155edbbc99 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -140,6 +140,7 @@ typedef struct dap_chain { char *net_name; bool is_datum_pool_proc; bool is_mapped; + atomic_int load_progress; // Nested cells (hashtab by cell_id) dap_chain_cell_t *cells; dap_chain_cell_id_t active_cell_id; @@ -198,7 +199,7 @@ typedef struct dap_chain { // Iterator callbacks dap_chain_datum_callback_iter_create_t callback_datum_iter_create; dap_chain_datum_callback_iter_get_first_t callback_datum_iter_get_first; - dap_chain_datum_callback_iter_get_first_t callback_datum_iter_get_next; + dap_chain_datum_callback_iter_get_next_t callback_datum_iter_get_next; dap_chain_datum_callback_iter_delete_t callback_datum_iter_delete; dap_list_t *atom_notifiers; diff --git a/modules/chain/include/dap_chain_cell.h b/modules/chain/include/dap_chain_cell.h index 88ba245e169bb02cb4564f141a8bfa5431ff5455..db47d0150aad1ece5511b0683dd016f2fe73d567 100644 --- a/modules/chain/include/dap_chain_cell.h +++ b/modules/chain/include/dap_chain_cell.h @@ -38,6 +38,9 @@ typedef struct dap_chain_cell { FILE *file_storage; uint8_t file_storage_type; dap_list_t *map_range_bounds; +#ifdef DAP_OS_DARWIN + size_t cur_vol_start; +#endif pthread_rwlock_t storage_rwlock; UT_hash_handle hh; } dap_chain_cell_t; 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 95348965690a9bfd4b827817c93a537f6c931c20..aad8bcf09d66040efccf7d5f17d80831dbe4cc40 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 @@ -82,7 +82,7 @@ static bool s_stream_ch_packet_out(dap_stream_ch_t* ch , void* arg); static bool s_unban_client(dap_chain_net_srv_banlist_item_t *a_item); -static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_pkt_request_t * a_request, size_t a_request_size); +static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_pkt_request_t *a_request, size_t a_request_size); static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace); static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace); static void s_set_usage_data_to_gdb(const dap_chain_net_srv_usage_t *a_usage); @@ -129,7 +129,7 @@ static inline void s_grace_error(dap_chain_net_srv_grace_t *a_grace, dap_stream_ else { l_item = DAP_NEW_Z(dap_chain_net_srv_banlist_item_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_mutex_unlock(&a_grace->usage->service->banlist_mutex); DAP_DEL_Z(a_grace->request); DAP_DEL_Z(a_grace); @@ -309,7 +309,7 @@ void dap_stream_ch_chain_net_srv_tx_cond_added_cb(UNUSED_ARG void *a_arg, UNUSED } } -static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_pkt_request_t * a_request, size_t a_request_size) +static bool s_service_start(dap_stream_ch_t *a_ch , dap_stream_ch_chain_net_srv_pkt_request_t *a_request, size_t a_request_size) { assert(a_ch); dap_stream_ch_chain_net_srv_pkt_error_t l_err; @@ -382,7 +382,7 @@ static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ // Create one client l_usage->client = DAP_NEW_Z( dap_chain_net_srv_client_remote_t); if (!l_usage->client) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; if(a_ch) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); @@ -441,7 +441,7 @@ static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ dap_chain_net_srv_grace_t *l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t); if (!l_grace) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; if(a_ch) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); @@ -453,7 +453,7 @@ static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ } l_grace->request = DAP_DUP_SIZE(a_request, a_request_size); if (!l_grace->request) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; if(a_ch) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); @@ -478,7 +478,7 @@ static bool s_service_start(dap_stream_ch_t* a_ch , dap_stream_ch_chain_net_srv_ dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, l_success_size); if(!l_success) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; if(a_ch) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); @@ -564,7 +564,7 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) } dap_chain_net_srv_grace_usage_t *l_item = DAP_NEW_Z(dap_chain_net_srv_grace_usage_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); s_grace_error(a_grace, l_err); return false; } @@ -580,7 +580,7 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) } else { // Else if first grace at service start dap_chain_net_srv_grace_usage_t *l_item = DAP_NEW_Z(dap_chain_net_srv_grace_usage_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); s_grace_error(a_grace, l_err); return false; } @@ -592,7 +592,7 @@ static bool s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) dap_stream_ch_chain_net_srv_pkt_success_t *l_success = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, l_success_size); if(!l_success) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_item); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR; if(l_ch) @@ -1111,13 +1111,13 @@ static bool s_grace_period_finish(dap_chain_net_srv_grace_usage_t *a_grace_item) dap_chain_net_srv_grace_t* l_grace_new = DAP_NEW_Z(dap_chain_net_srv_grace_t); if (!l_grace_new) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); RET_WITH_DEL_A_GRACE(0); } // Parse the request l_grace_new->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); if (!l_grace_new->request) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_grace_new); RET_WITH_DEL_A_GRACE(0); } @@ -1189,14 +1189,24 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) switch (l_ch_pkt->hdr.type) { case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST: { typedef dap_stream_ch_chain_net_srv_pkt_test_t pkt_test_t; + if (l_ch_pkt->hdr.data_size < sizeof(pkt_test_t)) { + log_it(L_WARNING, "Wrong CHECK_REQUEST size %u, must be at least %zu", l_ch_pkt->hdr.data_size, sizeof(pkt_test_t)); + return false; + } pkt_test_t *l_request = (pkt_test_t*)l_ch_pkt->data; size_t l_request_size = l_request->data_size + sizeof(pkt_test_t); if (l_ch_pkt->hdr.data_size != l_request_size) { - log_it(L_WARNING, "Wrong request size %u, must be %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.data_size, l_request_size, l_ch_pkt->hdr.seq_id); + log_it(L_WARNING, "Wrong CHECK_REQUEST size %u, must be %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_ch_pkt->hdr.data_size, l_request_size, l_ch_pkt->hdr.seq_id); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE; dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); return false; } + if(l_request->data_size_recv > DAP_CHAIN_NET_SRV_CH_REQUEST_SIZE_MAX) { + log_it(L_WARNING, "Too large payload %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id); + l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE; + dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); + return false; + } dap_chain_hash_fast_t l_data_hash; dap_hash_fast(l_request->data, l_request->data_size, &l_data_hash); if (l_request->data_size > 0 && !dap_hash_fast_compare(&l_data_hash, &l_request->data_hash)) { @@ -1205,12 +1215,6 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); return false; } - if(l_request->data_size_recv > UINT_MAX) { - log_it(L_WARNING, "Too large payload %zu [pkt seq %"DAP_UINT64_FORMAT_U"]", l_request->data_size_recv, l_ch_pkt->hdr.seq_id); - l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE; - dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof(l_err)); - return false; - } /* No need for bare copying, resend it back modified */ if (l_request->data_size_recv) { l_request->data_size = l_request->data_size_recv; @@ -1240,7 +1244,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST: { //Service request if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){ - log_it( L_WARNING, "Wrong request size, less than minimum"); + log_it( L_WARNING, "Wrong request size %u, less than minimum %zu", l_ch_pkt->hdr.data_size, sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t)); return false; } dap_stream_ch_chain_net_srv_pkt_request_t *l_request = (dap_stream_ch_chain_net_srv_pkt_request_t*)l_ch_pkt->data; @@ -1265,7 +1269,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) }else if (l_usage->receipt ){ // If we sign first receipt DAP_DEL_Z(l_usage->receipt); } - break; + return false; } dap_chain_datum_tx_receipt_t * l_receipt = (dap_chain_datum_tx_receipt_t *) l_ch_pkt->data; size_t l_receipt_size = l_ch_pkt->hdr.data_size; @@ -1343,7 +1347,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) DAP_DELETE(l_usage->receipt); l_usage->receipt = DAP_DUP_SIZE(l_receipt, l_receipt_size); if (!l_usage->receipt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); break; } l_is_first_sign = true; @@ -1352,7 +1356,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) DAP_DELETE(l_usage->receipt_next); l_usage->receipt_next = DAP_DUP_SIZE(l_receipt, l_receipt_size); if (!l_usage->receipt_next) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); break; } l_usage->is_active = true; @@ -1384,7 +1388,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) log_it(L_ERROR, "Can't find tx cond. Start grace!"); l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t); if (!l_grace) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_tx_in_hash_str); break; } @@ -1392,7 +1396,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) // Parse the request l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); if (!l_grace->request) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_grace) DAP_DELETE(l_tx_in_hash_str); break; @@ -1414,14 +1418,14 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) l_usage->is_waiting_new_tx_cond = true; l_grace = DAP_NEW_Z(dap_chain_net_srv_grace_t); if (!l_grace) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_tx_in_hash_str); return true; } // Parse the request l_grace->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); if (!l_grace->request) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_grace) DAP_DELETE(l_tx_in_hash_str); return true; @@ -1504,15 +1508,19 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) } break; case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_DATA: { - if (l_ch_pkt->hdr.data_size < sizeof(dap_stream_ch_chain_net_srv_pkt_data_hdr_t) ){ - log_it( L_WARNING, "Wrong request size, less than minimum"); - break; - } typedef dap_stream_ch_chain_net_srv_pkt_data_t pkt_t; + if (l_ch_pkt->hdr.data_size < sizeof(pkt_t)) { + log_it( L_WARNING, "Wrong request size %u, less than minimum %zu", l_ch_pkt->hdr.data_size, sizeof(pkt_t)); + return false; + } pkt_t * l_pkt =(pkt_t *) l_ch_pkt->data; size_t l_pkt_size = l_ch_pkt->hdr.data_size - sizeof(pkt_t); + if (l_pkt_size != l_pkt->hdr.data_size) { + log_it( L_WARNING, "Wrong request size %zu, expected %hu", l_pkt_size, l_pkt->hdr.data_size); + return false; + } dap_chain_net_srv_t * l_srv = dap_chain_net_srv_get( l_pkt->hdr.srv_uid); - dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active;//dap_chain_net_srv_usage_find_unsafe( l_srv_session, l_pkt->hdr.usage_id ); + dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active; // If service not found if ( l_srv == NULL){ l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND ; @@ -1549,6 +1557,11 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) } } break; case DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_RESPONSE:{ + if (l_ch_pkt->hdr.data_size != sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t) ){ + log_it( L_WARNING, "Wrong request size %u, expected %zu", + l_ch_pkt->hdr.data_size, sizeof(dap_stream_ch_chain_net_srv_pkt_request_hdr_t)); + return false; + } dap_chain_net_srv_usage_t * l_usage = NULL; l_usage = l_srv_session->usage_active; dap_stream_ch_chain_net_srv_pkt_request_t* l_responce = (dap_stream_ch_chain_net_srv_pkt_request_t*)l_ch_pkt->data; @@ -1608,7 +1621,7 @@ static bool 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_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_success_t, l_success_size); if(!l_success) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); break; } l_success->hdr.usage_id = l_usage->id; diff --git a/modules/channel/chain-net-srv/include/dap_stream_ch_chain_net_srv_pkt.h b/modules/channel/chain-net-srv/include/dap_stream_ch_chain_net_srv_pkt.h index 9da89fdedb07ccfb9f4d8b314cd117d9b39cfd6a..3bca41c7ed362b4ebda3893e9fa3c31f0748cfff 100644 --- a/modules/channel/chain-net-srv/include/dap_stream_ch_chain_net_srv_pkt.h +++ b/modules/channel/chain-net-srv/include/dap_stream_ch_chain_net_srv_pkt.h @@ -33,6 +33,115 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_chain_net_srv_stream_session.h" +// Ch pkt types +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST 0x01 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST 0x10 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE 0x11 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NOTIFY_STOPPED 0x20 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_DATA 0x30 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_DATA 0x31 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_REQUEST 0x40 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_RESPONSE 0x41 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS 0xf0 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR 0xff +// for connection testing +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST 0x50 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE 0x51 + +#define DAP_CHAIN_NET_SRV_CH_REQUEST_SIZE_MAX 10240 //4096 + +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED 0x00000000 + +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND 0x00000100 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND 0x00000101 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_IN_CLIENT_MODE 0x00000102 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND 0x00000200 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER 0x00000201 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE 0x00000202 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_CANT_ADD_USAGE 0x00000300 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND 0x00000400 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_COND_OUT 0x00000401 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_ENOUGH 0x00000402 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_ACCEPT_TOKEN 0x00000403 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SRV_UID 0x00000404 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_NEW_COND 0x00000405 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE 0x00000406 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE 0x00000407 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NEW_TX_COND_NOT_ENOUGH 0x00000408 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND 0x00000500 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN 0x00000501 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH 0x00000502 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_BANNED_PKEY_HASH 0x00000503 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_IS_NOT_PRESENT 0x00000504 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND 0x00000600 +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH 0x00000BAD +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR 0x00BADA55 + + +#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNKNOWN 0xffffffff +// TYPE_REQUEST +typedef struct dap_stream_ch_chain_net_srv_pkt_request_hdr{ + dap_chain_net_id_t net_id;// Network id wheither to request + dap_chain_hash_fast_t tx_cond; // Conditioned transaction with paymemt for + dap_chain_net_srv_uid_t srv_uid; + char token[DAP_CHAIN_TICKER_SIZE_MAX]; + dap_chain_hash_fast_t client_pkey_hash; + dap_chain_hash_fast_t order_hash; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_hdr_t; + +typedef struct dap_stream_ch_chain_net_srv_pkt_request{ + dap_stream_ch_chain_net_srv_pkt_request_hdr_t hdr; + uint8_t data[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_t; + +// Custom service data packet +typedef struct dap_stream_ch_chain_net_srv_pkt_data_hdr{ + uint8_t version; + uint16_t data_size; + uint8_t padding; + uint32_t usage_id; + dap_chain_net_srv_uid_t srv_uid; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_hdr_t; + +typedef struct dap_stream_ch_chain_net_srv_pkt_data{ + dap_stream_ch_chain_net_srv_pkt_data_hdr_t hdr; + uint8_t data[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_t; + + +typedef struct dap_stream_ch_chain_net_srv_pkt_success_hdr{ + uint32_t usage_id; + dap_chain_net_id_t net_id; + dap_chain_net_srv_uid_t srv_uid; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_success_hdr_t; + +typedef struct dap_stream_ch_chain_net_srv_pkt_success{ + dap_stream_ch_chain_net_srv_pkt_success_hdr_t hdr; + uint8_t custom_data[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_success_t; + +// TYPE_RESPONSE_ERROR +typedef struct dap_stream_ch_chain_net_srv_pkt_error{ + dap_chain_net_id_t net_id; + dap_chain_net_srv_uid_t srv_uid; + uint32_t usage_id; + uint32_t code; // error code +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_error_t; + +// data packet for connectiont test +typedef struct dap_stream_ch_chain_net_srv_pkt_test { + uint32_t usage_id; + dap_chain_net_id_t net_id; + dap_chain_net_srv_uid_t srv_uid; + int32_t time_connect_ms; + dap_nanotime_t recv_time1, recv_time2, send_time1, send_time2; + char host_send[DAP_HOSTADDR_STRLEN], host_recv[DAP_HOSTADDR_STRLEN]; + int32_t err_code; + uint64_t data_size_send, data_size_recv, data_size; + dap_chain_hash_fast_t data_hash; + uint8_t data[]; +} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t; + size_t dap_stream_ch_chain_net_srv_pkt_data_write(dap_stream_ch_t *a_ch, dap_chain_net_srv_uid_t a_srv_uid, uint32_t a_usage_id , diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index 661b934c1dcca37cfbe5841510c8ffa6ee1c76fe..3039ce38e7e5efb8252d38ba6af09387e3d6334f 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -188,13 +188,19 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) l_ch_chain_net_pkt->hdr.net_id,NULL, 0); dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); break; - // receive pong request -> send nothing + + // received pong request -> send nothing case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG: //log_it(L_INFO, "Get CHAIN_CH_NET_PKT_TYPE_PONG"); dap_stream_ch_set_ready_to_write_unsafe(a_ch, false); break; case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST:{ + if (l_ch_chain_net_pkt->hdr.data_size != DAP_CHAIN_NET_CH_VALIDATOR_READY_REQUEST_SIZE) { + log_it(L_WARNING, "Invalid VALIDATOR_READY_REQUEST size %hu, expected %u", l_ch_chain_net_pkt->hdr.data_size, + DAP_CHAIN_NET_CH_VALIDATOR_READY_REQUEST_SIZE); + return false; + } log_it(L_INFO, "Get CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST"); dap_chain_net_t * l_net = dap_chain_net_by_id( l_ch_chain_net_pkt->hdr.net_id ); if ( l_net == NULL){ @@ -203,83 +209,79 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) l_ch_chain_net_pkt->hdr.net_id, l_err_str,sizeof (l_err_str)); dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); log_it(L_ERROR, "Invalid net id in packet"); - } else { - dap_list_t * l_orders = NULL; - dap_enc_key_t *l_enc_key_pvt = NULL; - dap_chain_t *l_chain = NULL; - DL_FOREACH(l_net->pub.chains, l_chain) - if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) { - l_enc_key_pvt = dap_chain_esbocs_get_sign_key(l_chain); - if (l_enc_key_pvt) - break; - } - dap_sign_t *l_sign = NULL; - size_t sign_s = 0; - size_t l_orders_num = 0; - dap_chain_ch_validator_test_t *send = NULL; - dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } }; - dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; - uint256_t l_price_min = {}; - uint256_t l_price_max = {}; - uint8_t flags = 0; - dap_chain_node_addr_t l_cur_node_addr = { - .uint64 = dap_chain_net_get_cur_addr_int(l_net) - }; - - if (l_enc_key_pvt) { - flags = flags | F_CERT;//faund sert - l_sign = dap_sign_create(l_enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data, - l_ch_chain_net_pkt->hdr.data_size, 0); - if(l_sign) - { - sign_s = dap_sign_get_size(l_sign); - flags = flags | D_SIGN;//data signed - } - else - flags = flags & ~D_SIGN;//data doesn't sign + break; + } + dap_list_t * l_orders = NULL; + dap_enc_key_t *l_enc_key_pvt = NULL; + dap_chain_t *l_chain = NULL; + DL_FOREACH(l_net->pub.chains, l_chain) + if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) { + l_enc_key_pvt = dap_chain_esbocs_get_sign_key(l_chain); + if (l_enc_key_pvt) + break; } - else - flags = flags & ~F_CERT;//Specified certificate not found + dap_sign_t *l_sign = NULL; + size_t sign_s = 0; + size_t l_orders_num = 0; + dap_chain_ch_validator_test_t *send = NULL; + dap_chain_net_srv_price_unit_uid_t l_price_unit = { { 0 } }; + dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID }; + uint256_t l_price_min = {}; + uint256_t l_price_max = {}; + uint8_t flags = 0; + + if (l_enc_key_pvt) { + flags = flags | F_CERT;//faund sert + l_sign = dap_sign_create(l_enc_key_pvt, (uint8_t*)l_ch_chain_net_pkt->data, l_ch_chain_net_pkt->hdr.data_size, 0); + if (l_sign) { + sign_s = dap_sign_get_size(l_sign); + flags = flags | D_SIGN;//data signed + } else + flags = flags & ~D_SIGN;//data doesn't sign + } + else + flags = flags & ~F_CERT;//Specified certificate not found - send = DAP_NEW_Z_SIZE(dap_chain_ch_validator_test_t, sizeof(dap_chain_ch_validator_test_t) + sign_s); + send = DAP_NEW_Z_SIZE(dap_chain_ch_validator_test_t, sizeof(dap_chain_ch_validator_test_t) + sign_s); #ifdef DAP_VERSION - strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version)); + strncpy((char *)send->header.version, (char *)DAP_VERSION, sizeof(send->header.version)); #endif - send->header.sign_size = sign_s; - //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10); - flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC; + send->header.sign_size = sign_s; + //strncpy(send->header.data,(uint8_t*)l_ch_chain_net_pkt->data,10); + flags = (l_net->pub.mempool_autoproc) ? flags | A_PROC : flags & ~A_PROC; - if (dap_chain_net_srv_order_find_all_by(l_net,SERV_DIR_UNDEFINED,l_uid, - l_price_unit,NULL,l_price_min,l_price_max,&l_orders,&l_orders_num)==0){ - for (dap_list_t *l_temp = l_orders;l_temp; l_temp = l_orders->next){ - dap_chain_net_srv_order_t *l_order =(dap_chain_net_srv_order_t *) l_temp->data; - if(l_order->node_addr.uint64 == l_cur_node_addr.uint64) - { + if (dap_chain_net_srv_order_find_all_by(l_net, SERV_DIR_UNDEFINED, l_uid, l_price_unit, NULL, + l_price_min, l_price_max, &l_orders, &l_orders_num) == 0) { + for (dap_list_t *l_temp = l_orders; l_temp; l_temp = l_temp->next) { + dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_temp->data; + if (l_order->node_addr.uint64 == g_node_addr.uint64) { + dap_sign_t *l_order_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size); + if (dap_sign_compare_pkeys(l_sign, l_order_sign)) { flags = flags | F_ORDR; break; } } - dap_list_free_full(l_orders, NULL); } - bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false ); - bool auto_update = false; - if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0)) - auto_update = true; - else - auto_update = false; - flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN; - flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT; - send->header.flags = flags; - //add sign - if(sign_s) - memcpy(send->sign,l_sign,sign_s); - dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY , - l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_chain_ch_validator_test_t) + sign_s); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - if(l_sign) - DAP_DELETE(l_sign); - DAP_DELETE(send); + dap_list_free_full(l_orders, NULL); } + bool auto_online = dap_config_get_item_bool_default( g_config, "general", "auto_online", false ); + bool auto_update = false; + if((system("systemctl status cellframe-updater.service") == 768) && (system("systemctl status cellframe-updater.timer") == 0)) + auto_update = true; + else + auto_update = false; + flags = auto_online ? flags | A_ONLN : flags & ~A_ONLN; + flags = auto_update ? flags | A_UPDT : flags & ~A_UPDT; + send->header.flags = flags; + //add sign + if(sign_s) + memcpy(send->sign,l_sign,sign_s); + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY , + l_ch_chain_net_pkt->hdr.net_id, send, sizeof(dap_chain_ch_validator_test_t) + sign_s); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + if(l_sign) + DAP_DELETE(l_sign); + DAP_DELETE(send); } break; case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY:{ diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h index d6a9573c7d7d4b5c7d26435e87c4ec2346c57bc7..983a290cdc14bf03650689c1ee3e86b2a78a162e 100644 --- a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h +++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h @@ -45,6 +45,8 @@ #define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff +#define DAP_CHAIN_NET_CH_VALIDATOR_READY_REQUEST_SIZE 1024 + typedef struct stream_ch_chain_net_pkt_hdr { uint8_t version; byte_t padding; diff --git a/modules/common/dap_chain_datum.c b/modules/common/dap_chain_datum.c index 36a46c4e16ac28a93508f2aabfc9b6529531966a..efacd074eb25f023bbaf43c6d88e34a37dad5688 100644 --- a/modules/common/dap_chain_datum.c +++ b/modules/common/dap_chain_datum.c @@ -47,11 +47,8 @@ */ dap_chain_datum_t *dap_chain_datum_create(uint16_t a_type_id, const void *a_data, size_t a_data_size) { - dap_chain_datum_t *l_datum = DAP_NEW_Z_SIZE(dap_chain_datum_t, sizeof(l_datum->header) + a_data_size); - if(!l_datum) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); - return NULL; - } + dap_chain_datum_t *l_datum = NULL; + DAP_NEW_Z_SIZE_RET_VAL(l_datum, dap_chain_datum_t, sizeof(l_datum->header) + a_data_size, NULL, NULL); *l_datum = (dap_chain_datum_t) { .header = { .version_id = DAP_CHAIN_DATUM_VERSION, diff --git a/modules/common/dap_chain_datum_decree.c b/modules/common/dap_chain_datum_decree.c index 8b681cfe8dfd73147ef99dd2555291b3130d935e..83710341f76e0d6a8bd1c39ec49e3053881e5966 100644 --- a/modules/common/dap_chain_datum_decree.c +++ b/modules/common/dap_chain_datum_decree.c @@ -602,7 +602,7 @@ dap_chain_datum_decree_t *dap_chain_datum_decree_sign_in_cycle(dap_cert_t **a_ce size_t l_sign_size = dap_sign_get_size(l_sign); a_datum_decree = DAP_REALLOC(a_datum_decree, sizeof(dap_chain_datum_decree_t) + l_cur_sign_offset + l_sign_size); if (!a_datum_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_sign); return NULL; } diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index 9eaef04b0012482f134a0c6b2b26dea6e9dd0c58..599ac5eeaf68926c0fda241565b6a828170722ac 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -73,13 +73,18 @@ dap_tsd_t* dap_chain_datum_token_tsd_get(dap_chain_datum_token_t *a_token, size_ return (dap_tsd_t*)a_token->data_n_tsd; } -dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial, size_t *a_token_size) { +dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial, size_t *a_token_size) +{ dap_chain_datum_token_old_t *l_token_old = (dap_chain_datum_token_old_t*)a_token_serial; size_t l_token_data_n_tsd_size = *a_token_size - sizeof(dap_chain_datum_token_old_t); size_t l_token_size = l_token_data_n_tsd_size + sizeof(dap_chain_datum_token_t); switch (((dap_chain_datum_token_t*)a_token_serial)->type) { case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL, .version = 1, @@ -96,6 +101,10 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL, .version = 1, @@ -114,6 +123,10 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE, .version = 1, @@ -132,6 +145,10 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL, .version = 1, @@ -150,6 +167,10 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE, .version = 1, @@ -168,6 +189,10 @@ dap_chain_datum_token_t *dap_chain_datum_token_read(const byte_t *a_token_serial } case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: { dap_chain_datum_token_t *l_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, l_token_size); + if (!l_token) { + log_it(L_CRITICAL, c_error_memory_alloc); + return NULL; + } *l_token = (dap_chain_datum_token_t) { .type = DAP_CHAIN_DATUM_TOKEN_TYPE_DECL, .version = 1, @@ -430,7 +455,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_create(uint256_t a_va { dap_chain_datum_token_emission_t *l_emission = DAP_NEW_Z(dap_chain_datum_token_emission_t); if (!l_emission) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_emission->hdr.version = 3; @@ -474,7 +499,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi size_t l_add_size = sizeof(l_emission->hdr) - l_old_hdr_size; l_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_emission_size + l_add_size); if (!l_emission) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_emission->hdr.version = 2; @@ -489,7 +514,7 @@ dap_chain_datum_token_emission_t *dap_chain_datum_emission_read(byte_t *a_emissi } else { l_emission = DAP_DUP_SIZE(a_emission_serial, *a_emission_size); if (!l_emission) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if (((dap_chain_datum_token_emission_t *)a_emission_serial)->hdr.version == 1) diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 01511bfd93ec2efaea5a476736a7e8b468535a9e..38d7ac9670839eccb3bdca241a9cd954a8e1d07b 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -41,7 +41,7 @@ dap_chain_datum_tx_t* dap_chain_datum_tx_create(void) { dap_chain_datum_tx_t *tx = DAP_NEW_Z(dap_chain_datum_tx_t); if (!tx) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 0; } tx->header.ts_created = time(NULL); @@ -296,40 +296,36 @@ int dap_chain_datum_tx_add_sign_item(dap_chain_datum_tx_t **a_tx, dap_enc_key_t * * return 1 Ok, 0 Invalid signature, -1 Not found signature or other Error */ -int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx) +int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *a_tx) { - int ret = -1; - if(!tx) - return -2; - uint32_t tx_items_pos = 0, tx_items_size = tx->header.tx_items_size; + dap_return_val_if_pass(!a_tx, -1); + int l_ret = 0; + uint32_t tx_items_pos = 0, tx_items_size = a_tx->header.tx_items_size; while(tx_items_pos < tx_items_size) { - uint8_t *item = tx->tx_items + tx_items_pos; + uint8_t *item = a_tx->tx_items + tx_items_pos; size_t l_item_tx_size = dap_chain_datum_item_tx_get_size(item); if(!l_item_tx_size || l_item_tx_size > tx_items_size) - return -3; + return -2; if(dap_chain_datum_tx_item_get_type(item) == TX_ITEM_TYPE_SIG) { dap_chain_tx_sig_t *l_item_tx_sig = (dap_chain_tx_sig_t*) item; dap_sign_t *l_sign = (dap_sign_t*) l_item_tx_sig->sig; if ( ( l_sign->header.sign_size + l_sign->header.sign_pkey_size +sizeof (l_sign->header) ) > l_item_tx_size ){ log_it(L_WARNING,"Incorrect signature's header, possible corrupted data"); - return -4; + return -3; } - if (dap_sign_verify_all(l_sign, tx_items_size, tx->tx_items, tx_items_pos)) { + if ((l_ret = dap_sign_verify_all(l_sign, tx_items_size, a_tx->tx_items, tx_items_pos))) { // invalid signature - ret = 0; tx_items_pos += l_item_tx_size; break; } - // signature verify successfully - ret = 1; } // sign item or items must be at the end, therefore ret will be changed later anyway else - ret = -4; + l_ret = -4; // go to text item tx_items_pos += l_item_tx_size; } assert(tx_items_pos == tx_items_size); - return ret; + return l_ret; } diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c index 068bd365b83e2be92812e311cedf8c8d007b005a..c21099f921225284537647f54974dc7b602e3f35 100644 --- a/modules/common/dap_chain_datum_tx_receipt.c +++ b/modules/common/dap_chain_datum_tx_receipt.c @@ -93,15 +93,17 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu * @param a_sign_position * @return */ -dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size, uint16_t a_sign_position) +dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t *a_receipt, size_t a_receipt_size, uint16_t a_sign_position) { - if (!l_receipt || l_receipt_size != l_receipt->size || - l_receipt->size == sizeof(dap_chain_datum_tx_receipt_t) + l_receipt->exts_size) - return NULL; - dap_sign_t *l_sign = (dap_sign_t *)l_receipt->exts_n_signs + l_receipt->exts_size; + dap_return_val_if_fail(a_receipt && a_receipt_size == a_receipt->size && + a_receipt_size >= sizeof(dap_chain_datum_tx_receipt_t) + a_receipt->exts_size, + NULL); + if (a_receipt_size < sizeof(dap_chain_datum_tx_receipt_t) + a_receipt->exts_size + sizeof(dap_sign_t)) + return NULL; // No signs at all + dap_sign_t *l_sign = (dap_sign_t *)(a_receipt->exts_n_signs + a_receipt->exts_size); uint16_t l_sign_position; for (l_sign_position = a_sign_position; - l_sign_position && l_receipt_size > (size_t)((byte_t *)l_sign - (byte_t *)l_receipt); + l_sign_position && a_receipt_size > (size_t)((byte_t *)l_sign - (byte_t *)a_receipt) + sizeof(dap_sign_t); l_sign_position--) { l_sign = (dap_sign_t *)((byte_t *)l_sign + dap_sign_get_size(l_sign)); } @@ -109,35 +111,31 @@ dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l if (l_sign_position > 0) return NULL; // too big sign size - if ((size_t)(l_sign->header.sign_size + ((byte_t *)l_sign - l_receipt->exts_n_signs)) >= l_receipt->size) + if (dap_sign_get_size(l_sign) + ((byte_t *)l_sign - a_receipt->exts_n_signs) + sizeof(dap_chain_datum_tx_receipt_t) > a_receipt_size) return NULL; return l_sign; } -uint32_t dap_chain_datum_tx_receipt_type_get(dap_chain_datum_tx_receipt_t * l_receipt) +uint32_t dap_chain_datum_tx_receipt_type_get(dap_chain_datum_tx_receipt_t *a_receipt) { - if (!l_receipt) - return -1; - return l_receipt->receipt_info.units_type.enm; + dap_return_val_if_fail(a_receipt, -1); + return a_receipt->receipt_info.units_type.enm; } -uint64_t dap_chain_datum_tx_receipt_srv_uid_get(dap_chain_datum_tx_receipt_t * l_receipt) + +uint64_t dap_chain_datum_tx_receipt_srv_uid_get(dap_chain_datum_tx_receipt_t *a_receipt) { - if (!l_receipt) - return -1; - return l_receipt->receipt_info.srv_uid.uint64; + dap_return_val_if_fail(a_receipt, -1) + return a_receipt->receipt_info.srv_uid.uint64; } -uint64_t dap_chain_datum_tx_receipt_units_get(dap_chain_datum_tx_receipt_t * l_receipt) +uint64_t dap_chain_datum_tx_receipt_units_get(dap_chain_datum_tx_receipt_t *a_receipt) { - if (!l_receipt) - return -1; - return l_receipt->receipt_info.units; + dap_return_val_if_fail(a_receipt, -1); + return a_receipt->receipt_info.units; } -uint256_t dap_chain_datum_tx_receipt_value_get(dap_chain_datum_tx_receipt_t * l_receipt) +uint256_t dap_chain_datum_tx_receipt_value_get(dap_chain_datum_tx_receipt_t *a_receipt) { - uint256_t res = {}; - if (!l_receipt) - return res; - return l_receipt->receipt_info.value_datoshi; + dap_return_val_if_fail(a_receipt, uint256_0); + return a_receipt->receipt_info.value_datoshi; } /** diff --git a/modules/common/include/dap_chain_datum_tx_receipt.h b/modules/common/include/dap_chain_datum_tx_receipt.h index b8de175ec636e029e46f406fb92eb72c31ddfa05..cbbb246d2ac7caff59dab448d94f0506233628e7 100644 --- a/modules/common/include/dap_chain_datum_tx_receipt.h +++ b/modules/common/include/dap_chain_datum_tx_receipt.h @@ -62,12 +62,12 @@ dap_chain_datum_tx_receipt_t * dap_chain_datum_tx_receipt_create(dap_chain_net_s dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datum_tx_receipt_t *a_receipt, dap_enc_key_t *a_key); json_object *dap_chain_receipt_info_to_json(dap_chain_receipt_info_t *a_info); json_object *dap_chain_datum_tx_receipt_to_json(dap_chain_datum_tx_receipt_t *a_receipt); -dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size , uint16_t sign_position); -uint32_t dap_chain_datum_tx_receipt_utype_get(dap_chain_datum_tx_receipt_t * l_receipt); -uint64_t dap_chain_datum_tx_receipt_srv_uid_get(dap_chain_datum_tx_receipt_t * l_receipt); -uint64_t dap_chain_datum_tx_receipt_units_get(dap_chain_datum_tx_receipt_t * l_receipt); -uint256_t dap_chain_datum_tx_receipt_value_get(dap_chain_datum_tx_receipt_t * l_receipt); -uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t * l_receipt, size_t l_receipt_size); +dap_sign_t* dap_chain_datum_tx_receipt_sign_get(dap_chain_datum_tx_receipt_t *a_receipt, size_t a_receipt_size , uint16_t sign_position); +uint32_t dap_chain_datum_tx_receipt_utype_get(dap_chain_datum_tx_receipt_t *a_receipt); +uint64_t dap_chain_datum_tx_receipt_srv_uid_get(dap_chain_datum_tx_receipt_t *a_receipt); +uint64_t dap_chain_datum_tx_receipt_units_get(dap_chain_datum_tx_receipt_t *a_receipt); +uint256_t dap_chain_datum_tx_receipt_value_get(dap_chain_datum_tx_receipt_t *a_receipt); +uint16_t dap_chain_datum_tx_receipt_signs_count(dap_chain_datum_tx_receipt_t *a_receipt, size_t a_receipt_size); #ifdef __cplusplus } diff --git a/modules/consensus/block-poa/dap_chain_cs_block_poa.c b/modules/consensus/block-poa/dap_chain_cs_block_poa.c index d36958cfc24183c9e148b7a530608ba212a452ea..665b97a1957f0aa74ce21b4d75e2831132c95224 100644 --- a/modules/consensus/block-poa/dap_chain_cs_block_poa.c +++ b/modules/consensus/block-poa/dap_chain_cs_block_poa.c @@ -185,7 +185,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) dap_chain_cs_blocks_t * l_blocks = DAP_CHAIN_CS_BLOCKS( a_chain ); dap_chain_cs_block_poa_t * l_poa = DAP_NEW_Z ( dap_chain_cs_block_poa_t); if (!l_poa) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_blocks->_inheritor = l_poa; @@ -194,7 +194,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_blocks->callback_block_sign = s_callback_block_sign; l_poa->_pvt = DAP_NEW_Z(dap_chain_cs_block_poa_pvt_t); if (!l_poa->_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } dap_chain_cs_block_poa_pvt_t *l_poa_pvt = PVT(l_poa); @@ -207,7 +207,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) // Type sizeof's misunderstanding in malloc? l_poa_pvt->auth_certs = DAP_NEW_Z_SIZE ( dap_cert_t *, l_poa_pvt->auth_certs_count * sizeof(dap_cert_t*)); if (!l_poa_pvt->auth_certs) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } char l_cert_name[512]; diff --git a/modules/consensus/block-pos/dap_chain_cs_block_pos.c b/modules/consensus/block-pos/dap_chain_cs_block_pos.c index 060d3b0d419d696b1d04c84bb1c79a6d773eb6d0..5fb06747c7c1458036a10c2af1e8dec0669a3aec 100644 --- a/modules/consensus/block-pos/dap_chain_cs_block_pos.c +++ b/modules/consensus/block-pos/dap_chain_cs_block_pos.c @@ -87,7 +87,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); dap_chain_cs_block_pos_t *l_pos = DAP_NEW_Z(dap_chain_cs_block_pos_t); if (!l_pos) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_blocks->_inheritor = l_pos; @@ -98,7 +98,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_pos->_pvt = DAP_NEW_Z(dap_chain_cs_block_pos_pvt_t); dap_chain_cs_block_pos_pvt_t *l_pos_pvt = PVT(l_pos); if (!l_pos_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); goto lb_err; } @@ -113,12 +113,12 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_pos_pvt->tokens_hold_size = l_tokens_hold_size; l_pos_pvt->tokens_hold = DAP_NEW_Z_SIZE(char *, sizeof(char *) * l_tokens_hold_size); if (!l_pos_pvt->tokens_hold) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); goto lb_err; } l_pos_pvt->tokens_hold_value = DAP_NEW_Z_SIZE(uint64_t, l_tokens_hold_value_size * sizeof(uint64_t)); if (!l_pos_pvt->tokens_hold_value) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); goto lb_err; } for (size_t i = 0; i < l_tokens_hold_value_size; i++) { 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 616a792af3d7e9f2486d942ed6d4df3756ae7ae3..2fec03b9320c1ed8d781fc2adfbdcd6e7342ce50 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -85,7 +85,7 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag); static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); static void s_poa_round_clean(void *a_arg); static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg); -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size); +static int s_callback_event_verify(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_t *a_dag_event, dap_hash_fast_t *a_event_hash); static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size); static bool s_callback_round_event_to_chain(struct round_timer_arg *a_arg); @@ -100,6 +100,7 @@ static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply); static bool s_seed_mode = false; static dap_interval_timer_t s_poa_round_timer = NULL; +static bool s_debug_more = false; /** * @brief @@ -113,9 +114,9 @@ int dap_chain_cs_dag_poa_init() dap_chain_cs_add("dag_poa", s_callback_new); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); dap_cli_server_cmd_add ("dag_poa", s_cli_dag_poa, "DAG PoA commands", - "dag_poa event sign -net <net_name> -chain <chain_name> -event <event_hash> [-H {hex | base58(default)}]\n" + "dag_poa event sign -net <net_name> [-chain <chain_name>] -event <event_hash> [-H {hex | base58(default)}]\n" "\tSign event <event hash> in the new round pool with its authorize certificate\n\n"); - + s_debug_more = dap_config_get_item_bool_default(g_config, "dag", "debug_more", s_debug_more); return 0; } @@ -157,7 +158,7 @@ void dap_chain_cs_dag_poa_presign_callback_set(dap_chain_t *a_chain, dap_chain_c l_poa_pvt->callback_pre_sign = (dap_chain_cs_dag_poa_presign_callback_t*)DAP_NEW_Z(dap_chain_cs_dag_poa_presign_callback_t); if (!l_poa_pvt->callback_pre_sign) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_poa_pvt->callback_pre_sign->callback = a_callback; @@ -191,7 +192,7 @@ static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply) } if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain,&l_chain_net, - CHAIN_TYPE_INVALID)) { + CHAIN_TYPE_TOKEN)) { return -3; } @@ -347,7 +348,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_poa_t *l_poa = DAP_NEW_Z(dap_chain_cs_dag_poa_t); if (!l_poa) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_dag->_inheritor = l_poa; @@ -357,7 +358,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) l_dag->chain->callback_get_poa_certs = dap_chain_cs_dag_poa_get_auth_certs; l_poa->_pvt = DAP_NEW_Z ( dap_chain_cs_dag_poa_pvt_t ); if (!l_poa->_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT(l_poa); @@ -375,7 +376,7 @@ static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) if (l_poa_pvt->auth_certs_count && l_poa_pvt->auth_certs_count_verify) { l_poa_pvt->auth_certs = DAP_NEW_Z_SIZE ( dap_cert_t *, l_poa_pvt->auth_certs_count * sizeof(dap_cert_t *)); if (!l_poa_pvt->auth_certs) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } char l_cert_name[512]; @@ -492,7 +493,9 @@ static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t *a_dag, dap_cha a_event_hash_hex_str, a_event->header.signs_count, l_poa_pvt->auth_certs_count_verify); return false; } - int l_ret_event_verify = s_callback_event_verify(a_dag, a_event, a_event_size); + dap_hash_fast_t l_event_hash; + dap_chain_hash_fast_from_hex_str(a_event_hash_hex_str, &l_event_hash); + int l_ret_event_verify = s_callback_event_verify(a_dag, a_event, &l_event_hash); if (l_ret_event_verify == 0) return true; log_it(L_ERROR, "Round auto-complete error! Event %s is not passing consensus verification, ret code %d\n", @@ -675,7 +678,7 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, uint64_t a_round_i l_callback_arg = DAP_NEW_Z(struct round_timer_arg); if (!l_callback_arg) { pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_callback_arg->dag = a_dag; @@ -926,45 +929,30 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ * @param a_dag_event_size size_t size of event object * @return int */ -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event, size_t a_event_size) +static int s_callback_event_verify(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_t *a_event, dap_hash_fast_t *a_event_hash) { - - dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( a_dag ) ); - size_t l_offset_from_beginning = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_event_size); - if( l_offset_from_beginning >= a_event_size){ - log_it(L_WARNING,"Incorrect size with event %p: caled size excl signs %zd is bigger or equal then event size %zd", - a_event, l_offset_from_beginning, a_event_size); - return -7; // Incorrest size - } + dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( a_dag ) ); + size_t l_offset_from_beginning = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, 0); + size_t l_event_size = dap_chain_cs_dag_event_calc_size(a_event, 0); uint16_t l_certs_count_verify = l_poa_pvt->auth_certs_count_verify; - if (a_event->header.signs_count >= l_certs_count_verify) { - size_t l_signs_count = 0; - dap_sign_t **l_signs = dap_sign_get_unique_signs(((uint8_t*)a_event)+l_offset_from_beginning, - a_event_size-l_offset_from_beginning, &l_signs_count); - - if (!l_signs_count){ - log_it(L_ERROR, "No any signatures at all for event"); - DAP_DELETE(l_signs); - return -2; - } - - if ( l_signs_count < l_certs_count_verify ) { - log_it(L_ERROR, "Corrupted event: not enough signs: %zu of %hu", l_signs_count, l_certs_count_verify); - DAP_DELETE(l_signs); - return -1; - } - - uint16_t l_signs_verified_count = 0; - int l_ret = 0; + if (a_event->header.signs_count < l_certs_count_verify) { + log_it(L_WARNING, "Wrong signatures number %hu with event %s", a_event->header.signs_count, + dap_hash_fast_to_str_static(a_event_hash)); + return -2; // Wrong signatures number + } + size_t l_signs_count = a_event->header.signs_count; + dap_sign_t **l_signs = dap_sign_get_unique_signs((uint8_t *)a_event + l_offset_from_beginning, + l_event_size - l_offset_from_beginning, &l_signs_count); + if (!l_signs_count) { + log_it(L_ERROR, "No any signatures at all for event"); + DAP_DELETE(l_signs); + return -3; + } + uint16_t l_signs_verified_count = 0; + if (l_signs_count >= l_certs_count_verify) { uint16_t l_event_signs_count = a_event->header.signs_count; - for (size_t i=0; i<l_signs_count; i++) { + for (size_t i = 0; i < l_signs_count; i++) { dap_sign_t *l_sign = (dap_sign_t *)l_signs[i]; - if (!dap_sign_verify_size(l_sign, a_event_size - l_offset_from_beginning)) { - log_it(L_WARNING,"Incorrect size with event %p", a_event); - l_ret = -3; - break; - } - // Compare signature with auth_certs a_event->header.signs_count = i; for (uint16_t j = 0; j < l_poa_pvt->auth_certs_count; j++) { @@ -977,31 +965,14 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } a_event->header.signs_count = l_event_signs_count; DAP_DELETE(l_signs); - if (l_signs_verified_count < l_certs_count_verify) { - dap_hash_fast_t l_event_hash; - dap_hash_fast(a_event, a_event_size, &l_event_hash); - char l_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_hash_fast_to_str(&l_event_hash, l_event_hash_str, DAP_CHAIN_HASH_FAST_STR_SIZE); - log_it(L_ERROR, "Corrupted event %s, not enough signs %hu from %hu", - l_event_hash_str, l_signs_verified_count, l_certs_count_verify); - return l_ret ? l_ret : -4; - } - return 0; - } - else if (a_event->header.hash_count == 0){ - dap_chain_hash_fast_t l_event_hash; - dap_chain_cs_dag_event_calc_hash(a_event,a_event_size, &l_event_hash); - if ( memcmp( &l_event_hash, &a_dag->static_genesis_event_hash, sizeof(l_event_hash) ) == 0 ){ + if (l_signs_verified_count >= l_certs_count_verify) return 0; - }else{ - log_it(L_WARNING,"Wrong genesis event %p: hash is not equels to what in config", a_event); - return -20; // Wrong signatures number - } - } - else{ - log_it(L_WARNING,"Wrong signatures number with event %p", a_event); - return -2; // Wrong signatures number } + debug_if(s_debug_more, L_ERROR, "Event %s, not enough signs %hu from %hu", + dap_hash_fast_to_str_static(a_event_hash), + l_signs_count >= l_certs_count_verify ? l_signs_verified_count : (uint16_t)l_signs_count, + l_certs_count_verify); + return -4; } dap_list_t *dap_chain_cs_dag_poa_get_auth_certs(dap_chain_t *a_chain, size_t *a_auth_certs_count, uint16_t *a_count_verify) diff --git a/modules/consensus/dag-pos/CMakeLists.txt b/modules/consensus/dag-pos/CMakeLists.txt deleted file mode 100644 index fd5b077250fb91362675f0fd85369ea739b8cc44..0000000000000000000000000000000000000000 --- a/modules/consensus/dag-pos/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project (dap_chain_cs_dag_pos) - -file(GLOB DAP_CHAIN_CS_DAG_POS_SRCS *.c) -file(GLOB DAP_CHAIN_CS_DAG_POS_HEADERS include/*.h) - -add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_CS_DAG_POS_SRCS} ${DAP_CHAIN_CS_DAG_POS_HEADERS}) - -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_dag dap_chain_net_srv_stake) -target_include_directories(${PROJECT_NAME} INTERFACE .) -target_include_directories(${PROJECT_NAME} PUBLIC include) - -if (INSTALL_SDK) -set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${DAP_CHAIN_CS_DAG_POS_HEADERS}") -INSTALL(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION lib/modules/consensus/dag-pos/ - ARCHIVE DESTINATION lib/modules/consensus/dag-pos/ - PUBLIC_HEADER DESTINATION include/modules/consensus/dag-pos/ - ) -endif() \ No newline at end of file diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c deleted file mode 100644 index 03922212fc1ddf3c99e9c24b3b48f99e61fed374..0000000000000000000000000000000000000000 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2019 - * All rights reserved. - - This file is part of DAP (Distributed Applications Platform) the open source project - - DAP (Distributed Applications Platform) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#include <stdlib.h> - -#include "dap_chain_net.h" -#include "dap_common.h" -#include "dap_string.h" -#include "dap_strfuncs.h" -#include "dap_chain_cell.h" -#include "dap_chain_cs.h" -#include "dap_chain_cs_dag.h" -#include "dap_chain_cs_dag_pos.h" -#include "dap_chain_net_srv_stake_pos_delegate.h" -#include "dap_chain_ledger.h" - -#define LOG_TAG "dap_chain_cs_dag_pos" - -typedef struct dap_chain_cs_dag_pos_pvt -{ - dap_enc_key_t *events_sign_key; - char ** tokens_hold; - uint64_t * tokens_hold_value; - size_t tokens_hold_size; - uint16_t confirmations_minimum; -} dap_chain_cs_dag_pos_pvt_t; - -#define PVT(a) ((dap_chain_cs_dag_pos_pvt_t *) a->_pvt ) - -static void s_callback_delete(dap_chain_cs_dag_t * a_dag); -static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); -static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg); -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size); -static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t *a_dag_event_size); - -/** - * @brief dap_chain_cs_dag_pos_init - * @return - */ -int dap_chain_cs_dag_pos_init() -{ - dap_chain_cs_add ("dag_pos", s_callback_new ); - return 0; -} - -/** - * @brief dap_chain_cs_dag_pos_deinit - */ -void dap_chain_cs_dag_pos_deinit(void) -{ - -} - -/** - * @brief s_cs_callback - * @param a_chain - * @param a_chain_cfg - */ -static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) -{ - dap_chain_cs_type_create("dag", a_chain, a_chain_cfg); - dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG ( a_chain ); - dap_chain_cs_dag_pos_t *l_pos = DAP_NEW_Z( dap_chain_cs_dag_pos_t); - if (!l_pos) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); - return -1; - } - - char ** l_tokens_hold = NULL; - char ** l_tokens_hold_value_str = NULL; - uint16_t l_tokens_hold_size = 0; - uint16_t l_tokens_hold_value_size = 0; - - l_dag->_inheritor = l_pos; - l_dag->callback_delete = s_callback_delete; - l_dag->callback_cs_verify = s_callback_event_verify; - l_dag->callback_cs_event_create = s_callback_event_create; - l_pos->_pvt = DAP_NEW_Z(dap_chain_cs_dag_pos_pvt_t); - dap_chain_cs_dag_pos_pvt_t *l_pos_pvt = PVT(l_pos); - if (!l_pos_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); - goto lb_err; - } - - l_tokens_hold = dap_config_get_array_str( a_chain_cfg,"dag-pos","tokens_hold",&l_tokens_hold_size); - l_tokens_hold_value_str = dap_config_get_array_str( a_chain_cfg,"dag-pos","tokens_hold_value",&l_tokens_hold_value_size); - - if ( l_tokens_hold_size != l_tokens_hold_value_size ){ - log_it(L_CRITICAL, "Entries tokens_hold and tokens_hold_value are different size!"); - goto lb_err; - } - l_pos_pvt->confirmations_minimum = dap_config_get_item_uint16_default( a_chain_cfg,"dag-pos","confirmations_minimum",1); - l_pos_pvt->tokens_hold_size = l_tokens_hold_size; - l_pos_pvt->tokens_hold = DAP_NEW_Z_SIZE( char*, sizeof(char*) * - l_tokens_hold_size ); - if (!l_pos_pvt->tokens_hold) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); - goto lb_err; - } - l_pos_pvt->tokens_hold_value = DAP_NEW_Z_SIZE(uint64_t, - (l_tokens_hold_value_size +1) *sizeof (uint64_t)); - if (!l_pos_pvt->tokens_hold_value) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); - goto lb_err; - } - for (size_t i = 0; i < l_tokens_hold_value_size; i++){ - l_pos_pvt->tokens_hold[i] = dap_strdup( l_tokens_hold[i] ); - if ( ( l_pos_pvt->tokens_hold_value[i] = - strtoull(l_tokens_hold_value_str[i],NULL,10) ) == 0 ) { - log_it(L_CRITICAL, "Token %s has inproper hold value %"DAP_UINT64_FORMAT_U, l_pos_pvt->tokens_hold[i], - l_pos_pvt->tokens_hold_value[i] ); - goto lb_err; - } - } - l_dag->chain->callback_created = s_callback_created; - return 0; - -lb_err: - for (int i = 0; i < l_tokens_hold_size; i++) { - if (l_tokens_hold[i]) - DAP_DELETE(l_tokens_hold[i]); - } - if (l_tokens_hold) - DAP_DELETE(l_tokens_hold); - if (l_pos_pvt->tokens_hold_value) - DAP_DELETE(l_pos_pvt->tokens_hold_value); - if (l_pos_pvt) - DAP_DELETE(l_pos_pvt); - if (l_pos) - DAP_DELETE(l_pos); - l_dag->_inheritor = NULL; - l_dag->callback_delete = NULL; - l_dag->callback_cs_verify = NULL; - return -1; - -} - -/** - * @brief s_callback_created - * @param a_chain - * @param a_chain_cfg - * @return - */ -static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_cfg) -{ - dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain ); - dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS( l_dag ); - - const char * l_sign_cert_str = NULL; - if ((l_sign_cert_str = dap_config_get_item_str(a_chain_net_cfg, "dag-pos", "events-sign-cert")) != NULL) { - dap_cert_t *l_sign_cert = dap_cert_find_by_name(l_sign_cert_str); - if (l_sign_cert == NULL) { - log_it(L_ERROR, "Can't load sign certificate, name \"%s\" is wrong", l_sign_cert_str); - } else if (l_sign_cert->enc_key->priv_key_data) { - PVT(l_pos)->events_sign_key = l_sign_cert->enc_key; - log_it(L_NOTICE, "Loaded \"%s\" certificate to sign PoS events", l_sign_cert_str); - } else { - log_it(L_ERROR, "Certificate \"%s\" has no private key", l_sign_cert_str); - } - } else { - log_it(L_ERROR, "No sign certificate provided, can't sign any events"); - } - return 0; -} - - -/** - * @brief s_chain_cs_dag_callback_delete - * @param a_dag - */ -static void s_callback_delete(dap_chain_cs_dag_t * a_dag) -{ - dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS ( a_dag ); - - if ( l_pos->_pvt ) { - dap_chain_cs_dag_pos_pvt_t * l_pos_pvt = PVT ( l_pos ); - DAP_DELETE ( l_pos_pvt); - } - - if ( l_pos->_inheritor ) { - DAP_DELETE ( l_pos->_inheritor ); - } -} - -/** - * @brief - * create event - * @param a_dag - * @param a_datum - * @param a_hashes - * @param a_hashes_count - * @param a_dag_event_size - * @return dap_chain_cs_dag_event_t* - */ -static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, - size_t *a_dag_event_size) -{ - dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POS(a_dag) && a_datum, NULL); - dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS(a_dag); - - if( PVT(l_pos)->events_sign_key == NULL) { - log_it(L_ERROR, "Can't sign event with events-sign-wallet in [dag-pos] section"); - return NULL; - } - if(a_datum || (a_hashes && a_hashes_count)) { - dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_dag->round_current, a_datum, - PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size); - return l_event; - } else - return NULL; -} - -/** - * @brief - * function makes event singing verification - * @param a_dag dag object - * @param a_dag_event dap_chain_cs_dag_event_t - * @param a_dag_event_size size_t size of event object - * @return int - */ -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size) -{ - dap_chain_cs_dag_pos_pvt_t * l_pos_pvt = PVT ( DAP_CHAIN_CS_DAG_POS( a_dag ) ); - - if (sizeof (a_dag_event->header)>= a_dag_event_size){ - log_it(L_WARNING,"Incorrect size with event %p on chain %s", a_dag_event, a_dag->chain->name); - return -7; - } - size_t l_offset_signs = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event, a_dag_event_size); - if ( a_dag_event->header.signs_count >= l_pos_pvt->confirmations_minimum ){ - uint16_t l_verified_num = 0; - - for ( size_t l_sig_pos=0; l_sig_pos < a_dag_event->header.signs_count; l_sig_pos++ ){ - dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, a_dag_event_size,l_sig_pos); - if ( l_sign == NULL){ - log_it(L_WARNING, "Event is NOT signed with anything: sig pos %zu, event size %zu", l_sig_pos, a_dag_event_size); - return -4; - } - - bool l_sign_size_correct = dap_sign_verify_size(l_sign, a_dag_event_size - l_offset_signs); - if (!l_sign_size_correct) { - log_it(L_WARNING, "Event's sign size is incorrect"); - return -41; - } - size_t l_signs_total = a_dag_event->header.signs_count; - a_dag_event->header.signs_count = l_sig_pos; // temporary change for sign verification - size_t l_dag_event_size_without_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size); - int l_sign_verified = dap_sign_verify(l_sign, a_dag_event, l_dag_event_size_without_sign); - a_dag_event->header.signs_count = l_signs_total; - if (l_sign_verified) { - log_it(L_WARNING, "Event's sign is incorrect: code %d", l_sign_verified); - return -41; - } - - } - // Check number - if ( l_verified_num >= l_pos_pvt->confirmations_minimum ){ - // Passed all checks - return 0; - }else{ - log_it(L_WARNING, "Wrong event: only %hu/%hu signs are valid", l_verified_num, l_pos_pvt->confirmations_minimum ); - return -2; - } - }else{ - log_it(L_WARNING,"Wrong signature number with event %p on chain %s", a_dag_event, a_dag->chain->name); - return -2; // Wrong signatures number - } -} diff --git a/modules/consensus/dag-pos/include/dap_chain_cs_dag_pos.h b/modules/consensus/dag-pos/include/dap_chain_cs_dag_pos.h deleted file mode 100644 index db58e43bdad1ddae42d9b6c02402bea87729f4ea..0000000000000000000000000000000000000000 --- a/modules/consensus/dag-pos/include/dap_chain_cs_dag_pos.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2017-2018 - * All rights reserved. - - This file is part of DAP (Distributed Applications Platform) the open source project - - DAP (Distributed Applications Platform) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#pragma once -#include "dap_chain_cs_dag.h" -#include "dap_cert.h" - -typedef struct dap_chain_cs_dag_pos -{ - dap_chain_t * chain; - dap_chain_cs_dag_t * dag; - void * _pvt; - void * _inheritor; -} dap_chain_cs_dag_pos_t; - -#define DAP_CHAIN_CS_DAG_POS(a) ( (dap_chain_cs_dag_pos_t *) (a)->_inheritor) - - -int dap_chain_cs_dag_pos_init(); -void dap_chain_cs_dag_pos_deinit(void); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 7cf43b8c92c60aa2444b9c425387d0080ce08369..037b369271ab6f7f7754c53d0f0ecc3aeee6bbfe 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -184,17 +184,17 @@ int dap_chain_cs_esbocs_init() s_stream_ch_packet_in, NULL); dap_cli_server_cmd_add ("esbocs", s_cli_esbocs, "ESBOCS commands", - "esbocs min_validators_count set -net <net_name> -chain <chain_name> -cert <poa_cert_name> -val_count <value>\n" + "esbocs min_validators_count set -net <net_name> [-chain <chain_name>] -cert <poa_cert_name> -val_count <value>\n" "\tSets minimum validators count for ESBOCS consensus\n" - "esbocs min_validators_count show -net <net_name> -chain <chain_name>\n" + "esbocs min_validators_count show -net <net_name> [-chain <chain_name>]\n" "\tShow minimum validators count for ESBOCS consensus\n" - "esbocs check_signs_structure {enable|disable} -net <net_name> -chain <chain_name> -cert <poa_cert_name>\n" + "esbocs check_signs_structure {enable|disable} -net <net_name> [-chain <chain_name>] -cert <poa_cert_name>\n" "\tEnables or disables checks for blocks signs structure validity\n" - "esbocs check_signs_structure show -net <net_name> -chain <chain_name>\n" + "esbocs check_signs_structure show -net <net_name> [-chain <chain_name>]\n" "\tShow status of checks for blocks signs structure validity\n" - "esbocs emergency_validators {add|remove} -net <net_name> -chain <chain_name> -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n" + "esbocs emergency_validators {add|remove} -net <net_name> [-chain <chain_name>] -cert <poa_cert_name> -pkey_hash <validator_pkey_hash>\n" "\tAdd or remove validator by its signature public key hash to list of validators allowed to work in emergency mode\n" - "esbocs emergency_validators show -net <net_name> -chain <chain_name>\n" + "esbocs emergency_validators show -net <net_name> [-chain <chain_name>]\n" "\tShow list of validators public key hashes allowed to work in emergency mode\n"); return 0; } @@ -222,7 +222,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) l_esbocs->_pvt = DAP_NEW_Z(dap_chain_esbocs_pvt_t); dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); if (!l_esbocs_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_ret = - 5; goto lb_err; } @@ -281,7 +281,7 @@ static int s_callback_new(dap_chain_t *a_chain, dap_config_t *a_chain_cfg) } dap_chain_esbocs_validator_t *l_validator = DAP_NEW_Z(dap_chain_esbocs_validator_t); if (!l_validator) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_ret = - 5; goto lb_err; } @@ -549,13 +549,13 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf size_t l_orders_count = 0; dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); DAP_DELETE(l_gdb_group_str); - dap_chain_net_srv_order_t *l_order_service = NULL; + const dap_chain_net_srv_order_t *l_order_service = NULL; for (size_t i = 0; i < l_orders_count; i++) { - if (l_orders[i].value_len < sizeof(dap_chain_net_srv_order_t)) { - log_it(L_ERROR, "Too small order %s with size %zu", l_orders[i].key, l_orders[i].value_len); + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); continue; } - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID) continue; dap_sign_t *l_order_sign = (dap_sign_t*)(l_order->ext_n_sign + l_order->ext_size); @@ -740,7 +740,7 @@ int dap_chain_esbocs_set_emergency_validator(dap_chain_t *a_chain, bool a_add, u return -2; dap_chain_addr_t *l_addr_new = DAP_DUP(&l_signing_addr); if (!l_addr_new) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -4; } l_esbocs_pvt->emergency_validator_addrs = dap_list_append( @@ -1776,7 +1776,7 @@ void s_session_sync_queue_add(dap_chain_esbocs_session_t *a_session, dap_chain_e void *l_message_copy = DAP_DUP_SIZE(a_message, a_message_size); if (!l_message_copy) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } dap_chain_esbocs_sync_item_t *l_sync_item; @@ -2130,7 +2130,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) NODE_ADDR_FP_ARGS_S(a_ch->stream->node), NODE_ADDR_FP_ARGS_S(l_session->my_addr)); struct esbocs_msg_args *l_args = DAP_NEW_SIZE(struct esbocs_msg_args, sizeof(struct esbocs_msg_args) + l_message_size); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } l_args->addr_from = a_ch->stream->node; @@ -2407,7 +2407,7 @@ static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain // store for new candidate l_store = DAP_NEW_Z(dap_chain_esbocs_store_t); if (!l_store) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); goto session_unlock; } l_store->candidate_size = l_candidate_size; @@ -2671,7 +2671,7 @@ static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_mess l_message->hdr.sign_size = l_sign_size; l_message = DAP_REALLOC(l_message, l_message_size + l_sign_size); if (!l_message) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } memcpy(l_message->msg_n_sign + a_data_size, l_sign, l_sign_size); @@ -2685,7 +2685,7 @@ static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_mess struct esbocs_msg_args *l_args = DAP_NEW_SIZE(struct esbocs_msg_args, sizeof(struct esbocs_msg_args) + l_message_size + l_sign_size); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_message); return; } diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 19b1f2a926e4611a18250e599ef7a90259058e36..d1d6aaa9fce6b698ab3f6964311f6f51632a4845 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -88,10 +88,7 @@ int dap_datum_mempool_init(void) */ char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain, const char *a_hash_out_type) { - if( a_datum == NULL){ - log_it(L_ERROR, "NULL datum trying to add in mempool"); - return NULL; - } + dap_return_val_if_pass(!a_datum, NULL); dap_chain_hash_fast_t l_key_hash; dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_key_hash); @@ -149,9 +146,8 @@ char *dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_fr uint256_t a_value, uint256_t a_value_fee, const char *a_hash_out_type) { // check valid param - if(!a_chain | !a_key_from || ! a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || - dap_chain_addr_check_sum(a_addr_from) || (a_addr_to && dap_chain_addr_check_sum(a_addr_to)) || IS_ZERO_256(a_value)) - return NULL; + dap_return_val_if_pass(!a_chain | !a_key_from || !a_addr_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size || + dap_chain_addr_check_sum(a_addr_from) || (a_addr_to && dap_chain_addr_check_sum(a_addr_to)) || IS_ZERO_256(a_value), NULL); const char *l_native_ticker = dap_chain_net_by_id(a_chain->net_id)->pub.native_ticker; bool l_single_channel = !dap_strcmp(a_token_ticker, l_native_ticker); @@ -577,7 +573,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a return -2; } - dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, (a_tx_num + 1) * sizeof (dap_global_db_obj_t)); + dap_global_db_obj_t * l_objs = DAP_NEW_Z_SIZE(dap_global_db_obj_t, a_tx_num * sizeof (dap_global_db_obj_t)); uint256_t l_net_fee = {}, l_total_fee = {}; dap_chain_addr_t l_addr_fee = {}; bool l_net_fee_used = dap_chain_net_tx_get_fee(a_chain->net_id, &l_net_fee, &l_addr_fee); @@ -592,13 +588,13 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a log_it(L_DEBUG, "Create %"DAP_UINT64_FORMAT_U" transactions, summary %s", a_tx_num, l_balance); dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; dap_list_t *l_list_used_out = dap_ledger_get_list_tx_outs_with_val(l_ledger, a_token_ticker, - a_addr_from, l_value_need, &l_value_transfer); + a_addr_from, l_value_need, &l_value_transfer); if (!l_list_used_out) { log_it(L_WARNING,"Not enough funds to transfer"); DAP_DELETE(l_objs); return -2; } - + dap_chain_hash_fast_t l_tx_new_hash = {0}; for (size_t i=0; i< a_tx_num ; i++){ log_it(L_DEBUG, "Prepare tx %zu",i); @@ -635,6 +631,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a "Not enough values on output to produce enough inputs: %s when need ", l_balance); strcat(l_log_str, dap_uint256_to_char(l_single_val, NULL)); log_it(L_ERROR, "%s", l_log_str); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -5; } @@ -645,6 +642,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a SUM_256_256(l_value_pack, a_value, &l_value_pack); else { dap_chain_datum_tx_delete(l_tx_new); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -3; } @@ -654,6 +652,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a SUM_256_256(l_value_pack, l_net_fee, &l_value_pack); else { dap_chain_datum_tx_delete(l_tx_new); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -3; } @@ -664,6 +663,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a SUM_256_256(l_value_pack, a_value_fee, &l_value_pack); else { dap_chain_datum_tx_delete(l_tx_new); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -3; } @@ -673,6 +673,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a if (!IS_ZERO_256(l_value_back)) { if(dap_chain_datum_tx_add_out_item(&l_tx_new, a_addr_from, l_value_back) != 1) { dap_chain_datum_tx_delete(l_tx_new); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -3; } @@ -681,6 +682,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a // add 'sign' items if(dap_chain_datum_tx_add_sign_item(&l_tx_new, a_key_from) != 1) { dap_chain_datum_tx_delete(l_tx_new); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); return -4; } @@ -712,9 +714,9 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a if ( memcmp(&l_out->addr, a_addr_from, sizeof (*a_addr_from))==0 ){ dap_chain_tx_used_out_item_t *l_item_back = DAP_NEW_Z(dap_chain_tx_used_out_item_t); if (!l_item_back) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + dap_list_free_full(l_list_used_out, NULL); DAP_DELETE(l_objs); - dap_list_free(l_list_out_items); return -6; } *l_item_back = (dap_chain_tx_used_out_item_t) { @@ -729,27 +731,25 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a l_list_tmp = l_list_tmp->next; l_out_idx_tmp++; } - dap_list_free(l_list_out_items); } SUBTRACT_256_256(l_value_transfer, l_value_pack, &l_value_transfer); // Now produce datum dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx_new, l_tx_size); - - dap_chain_datum_tx_delete(l_tx_new); - //dap_ledger_tx_add( a_chain->ledger, l_tx); - + //dap_global_db_set_sync(l_gdb_group, l_key_str, a_datum, dap_chain_datum_size(l_datum), false); l_objs[i].key = dap_chain_hash_fast_to_str_new(&l_tx_new_hash); l_objs[i].value = (uint8_t *)l_datum; l_objs[i].value_len = dap_chain_datum_size(l_datum); + l_objs[i].timestamp = dap_nanotime_now(); 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 ); + l_objs[i].key ? l_objs[i].key :"NULL" , l_objs[i].value_len ); + dap_chain_datum_tx_delete(l_tx_new); + } dap_list_free_full(l_list_used_out, 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); + DAP_DEL_Z(l_gdb_group); return 0; } @@ -770,7 +770,6 @@ static bool s_tx_create_massive_gdb_save_callback(dap_global_db_instance_t *a_db const size_t a_values_total, const size_t a_values_count, dap_global_db_obj_t *a_values, void *a_arg) { - DAP_DELETE(a_values); if(!a_rc) { log_it(L_NOTICE, "%zu transaction are placed in mempool", a_values_total); return true; @@ -1005,7 +1004,6 @@ char *dap_chain_mempool_tx_create_cond(dap_chain_net_t *a_net, log_it( L_ERROR, "Can't add sign output"); return NULL; } - size_t l_tx_size = dap_chain_datum_tx_get_size( l_tx ); dap_chain_datum_t *l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_TX, l_tx, l_tx_size ); dap_chain_datum_tx_delete(l_tx); @@ -1260,7 +1258,7 @@ dap_datum_mempool_t * dap_datum_mempool_deserialize(uint8_t *a_datum_mempool_ser //datum_mempool_size = hex2bin(a_datum_mempool_ser, datum_mempool_str_in, datum_mempool_size) / 2; dap_datum_mempool_t *datum_mempool = DAP_NEW_Z(dap_datum_mempool_t); if (!datum_mempool) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } datum_mempool->version = *(uint16_t*)(a_datum_mempool_ser + shift_size); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 40ccfc136e1dfa1beffbe2e63f8a36089f47c19a..4099260c113ba0d5e282eb8412f50a9dea5eeb08 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -336,12 +336,6 @@ typedef struct dap_ledger_private { dap_list_t *tx_add_notifiers; dap_ledger_cache_tx_check_callback_t cache_tx_check_callback; - // TPS section - dap_timerfd_t *tps_timer; - struct timespec tps_start_time; - struct timespec tps_current_time; - struct timespec tps_end_time; - size_t tps_count; // Threshold fee dap_interval_timer_t threshold_txs_free_timer, threshold_emissions_free_timer; } dap_ledger_private_t; @@ -363,7 +357,6 @@ static void s_threshold_emission_free(dap_ledger_t *a_ledger); static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_ledger_token_item_t *a_token_item , dap_chain_datum_token_t * a_token, size_t a_token_size); static int s_tsd_sign_apply(dap_ledger_t *a_ledger, dap_ledger_token_item_t *a_token_item , dap_chain_datum_token_t *a_token, size_t a_token_size); static int s_ledger_permissions_check(dap_ledger_token_item_t * a_token_item, uint16_t a_permission_id, const void * a_data,size_t a_data_size ); -static bool s_ledger_tps_callback(void *a_arg); static int s_sort_ledger_tx_item(dap_ledger_tx_item_t* a, dap_ledger_tx_item_t* b); static size_t s_threshold_emissions_max = 1000; @@ -563,13 +556,13 @@ static dap_ledger_t * dap_ledger_handle_new(void) { dap_ledger_t *l_ledger = DAP_NEW_Z(dap_ledger_t); if ( !l_ledger ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } dap_ledger_private_t * l_ledger_pvt; l_ledger->_internal = l_ledger_pvt = DAP_NEW_Z(dap_ledger_private_t); if ( !l_ledger_pvt ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_ledger); return NULL; } @@ -622,7 +615,7 @@ struct json_object *wallet_info_json_collect(dap_ledger_t *a_ledger, dap_ledger_ size_t l_addr_len = pos - a_bal->key; char *l_addr_str = DAP_NEW_STACK_SIZE(char, l_addr_len + 1); if ( !l_addr_str ) - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); memcpy(l_addr_str, a_bal->key, pos - a_bal->key); *(l_addr_str + l_addr_len) = '\0'; json_object_object_add(l_network, "address", json_object_new_string(l_addr_str)); @@ -824,7 +817,7 @@ static bool s_ledger_token_update_check(dap_ledger_token_item_t *a_cur_token_ite //Check added signs dap_chain_datum_token_t *l_token_tmp = DAP_DUP_SIZE(a_token_update, a_token_update_size); if (!l_token_tmp) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free(l_tsd_list_added_pkeys); dap_list_free(l_tsd_list_remote_pkeys); return false; @@ -1136,7 +1129,7 @@ json_object *dap_ledger_token_tx_item_list(dap_ledger_t * a_ledger, dap_chain_ad { json_object * json_arr_out = json_object_new_array(); if (!json_arr_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } @@ -1175,7 +1168,7 @@ void s_ledger_token_cache_update(dap_ledger_t *a_ledger, dap_ledger_token_item_t size_t l_cache_size = l_token_item->datum_token_size + sizeof(uint256_t); uint8_t *l_cache = DAP_NEW_STACK_SIZE(uint8_t, l_cache_size); if ( !l_cache ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } memcpy(l_cache, &l_token_item->current_supply, sizeof(uint256_t)); @@ -1343,7 +1336,7 @@ int dap_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_toke l_token_item = DAP_NEW_Z(dap_ledger_token_item_t); if ( !l_token_item ) { DAP_DELETE(l_token); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -8; } *l_token_item = (dap_ledger_token_item_t) { @@ -1363,14 +1356,14 @@ int dap_ledger_token_add(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_toke if ( !l_token_item->auth_pkeys ) { DAP_DELETE(l_token); DAP_DELETE(l_token_item); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -6; }; if ( !l_token_item->auth_pkeys ) { DAP_DELETE(l_token); DAP_DEL_Z(l_token_item->auth_pkeys); DAP_DELETE(l_token_item); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -6; } dap_stpcpy(l_token_item->ticker, l_token->ticker); @@ -2237,6 +2230,81 @@ dap_list_t * dap_ledger_token_auth_pkeys_hashes(dap_ledger_t *a_ledger, const ch return l_ret; } +json_object *s_token_item_to_json(dap_ledger_token_item_t *a_token_item) { + json_object *json_obj_datum = json_object_new_object(); + const char *l_type_str; + switch (a_token_item->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: { + switch (a_token_item->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_type_str = "PRIVATE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_type_str = "CF20"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: + l_type_str = "PUBLIC"; break; + default: l_type_str = "UNKNOWN"; break; + } + }break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: { + switch (a_token_item->subtype) { + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: + l_type_str = "SIMPLE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: + l_type_str = "PRIVATE_UPDATE"; break; + case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: + l_type_str = "CF20_UPDATE"; break; + default: l_type_str = "UNKNOWN"; break; + } + } break; + default: + l_type_str = "UNKNOWN"; break; + } + if ((a_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE) + || (a_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) { + char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply); + char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply); + json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker)); + json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str)); + json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(a_token_item->datum_token->header_native_decl.flags))); + json_object_object_add(json_obj_datum, "description", a_token_item->description_token_size != 0 ? + json_object_new_string(a_token_item->description_token) : + json_object_new_string("The token description is not set")); + json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); + json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); + json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); + json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid)); + json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total)); + json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string("")); + dap_datum_token_dump_tsd_to_json(json_obj_datum, a_token_item->datum_token, a_token_item->datum_token_size, "hex"); + size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token) - a_token_item->datum_token->header_native_decl.tsd_total_size; + dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd + a_token_item->datum_token->header_native_decl.tsd_total_size, + l_certs_field_size, "hex"); + json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string("")); + json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions))); + DAP_DEL_Z(l_balance_cur); + DAP_DEL_Z(l_balance_total); + } else { + char *l_balance_cur = dap_chain_balance_print(a_token_item->current_supply); + char *l_balance_total = dap_chain_balance_print(a_token_item->total_supply); + json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(a_token_item->ticker)); + json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); + json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); + json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); + json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(a_token_item->auth_signs_valid)); + json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(a_token_item->auth_signs_total)); + json_object_object_add(json_obj_datum, "Signs", json_object_new_string("")); + size_t l_certs_field_size = a_token_item->datum_token_size - sizeof(*a_token_item->datum_token); + dap_chain_datum_token_certs_dump_to_json(json_obj_datum, a_token_item->datum_token->data_n_tsd, + l_certs_field_size, "hex"); + json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(a_token_item->token_emissions))); + DAP_DEL_Z(l_balance_cur); + DAP_DEL_Z(l_balance_total); + } + return json_obj_datum; +} + /** * @brief Compose string list of all tokens with information * @param a_ledger @@ -2271,85 +2339,32 @@ json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_ i_tmp++; continue; } + json_obj_datum = s_token_item_to_json(l_token_item); + json_object_array_add(json_arr_out, json_obj_datum); i_tmp++; - json_obj_datum = json_object_new_object(); - const char *l_type_str; - switch (l_token_item->type) { - case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: { - switch (l_token_item->subtype) { - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: - l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: - l_type_str = "PRIVATE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: - l_type_str = "CF20"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC: - l_type_str = "PUBLIC"; break; - default: l_type_str = "UNKNOWN"; break; - } - }break; - case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: { - switch (l_token_item->subtype) { - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: - l_type_str = "SIMPLE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PRIVATE: - l_type_str = "PRIVATE_UPDATE"; break; - case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_NATIVE: - l_type_str = "CF20_UPDATE"; break; - default: l_type_str = "UNKNOWN"; break; - } - } break; - default: - l_type_str = "UNKNOWN"; break; - } - if ((l_token_item->subtype != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE) - || (l_token_item->type != DAP_CHAIN_DATUM_TOKEN_SUBTYPE_PUBLIC)) { - char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply); - char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply); - json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker)); - json_object_object_add(json_obj_datum, "type", json_object_new_string(l_type_str)); - json_object_object_add(json_obj_datum, "flags", json_object_new_string(s_flag_str_from_code(l_token_item->datum_token->header_native_decl.flags))); - json_object_object_add(json_obj_datum, "description", l_token_item->description_token_size != 0 ? - json_object_new_string(l_token_item->description_token) : - json_object_new_string("The token description is not set")); - json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); - json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); - json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); - json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid)); - json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total)); - json_object_object_add(json_obj_datum, "TSD and Signs", json_object_new_string("")); - dap_datum_token_dump_tsd_to_json(json_obj_datum, l_token_item->datum_token, l_token_item->datum_token_size, "hex"); - size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token) - l_token_item->datum_token->header_native_decl.tsd_total_size; - dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd + l_token_item->datum_token->header_native_decl.tsd_total_size, - l_certs_field_size, "hex"); - json_object_object_add(json_obj_datum, "and TSD and Signs", json_object_new_string("")); - json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions))); - json_object_array_add(json_arr_out, json_obj_datum); - DAP_DEL_Z(l_balance_cur); - DAP_DEL_Z(l_balance_total); - } else { - char *l_balance_cur = dap_chain_balance_print(l_token_item->current_supply); - char *l_balance_total = dap_chain_balance_print(l_token_item->total_supply); - json_object_object_add(json_obj_datum, "-->Token name", json_object_new_string(l_token_item->ticker)); - json_object_object_add(json_obj_datum, "Supply current", json_object_new_string(l_balance_cur)); - json_object_object_add(json_obj_datum, "Supply total", json_object_new_string(l_balance_total)); - json_object_object_add(json_obj_datum, "Decimals", json_object_new_string("18")); - json_object_object_add(json_obj_datum, "Auth signs valid", json_object_new_int(l_token_item->auth_signs_valid)); - json_object_object_add(json_obj_datum, "Auth signs total", json_object_new_int(l_token_item->auth_signs_total)); - json_object_object_add(json_obj_datum, "Signs", json_object_new_string("")); - size_t l_certs_field_size = l_token_item->datum_token_size - sizeof(*l_token_item->datum_token); - dap_chain_datum_token_certs_dump_to_json(json_obj_datum, l_token_item->datum_token->data_n_tsd, - l_certs_field_size, "hex"); - json_object_object_add(json_obj_datum, "Total emissions", json_object_new_int(HASH_COUNT(l_token_item->token_emissions))); - json_object_array_add(json_arr_out, json_obj_datum); - DAP_DEL_Z(l_balance_cur); - DAP_DEL_Z(l_balance_total); - } + } pthread_rwlock_unlock(&PVT(a_ledger)->tokens_rwlock); return json_arr_out; } +/** + * @breif Forms a JSON object with a token description for the specified ticker. + * @param a_ledger + * @param a_token_ticker + * @return + */ +json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker) { + json_object *l_jobj = NULL; + dap_ledger_token_item_t *l_token_item = NULL; + HASH_FIND_STR(PVT(a_ledger)->tokens, a_token_ticker, l_token_item); + if (l_token_item) { + return s_token_item_to_json(l_token_item); + } else { + return json_object_new_null(); + } +} + /** * @brief Get all token declatations * @param a_ledger @@ -2494,12 +2509,12 @@ static bool s_load_cache_gdb_loaded_balances_callback(dap_global_db_instance_t * for (size_t i = 0; i < a_values_count; i++) { dap_ledger_wallet_balance_t *l_balance_item = DAP_NEW_Z(dap_ledger_wallet_balance_t); if (!l_balance_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } l_balance_item->key = DAP_NEW_Z_SIZE(char, strlen(a_values[i].key) + 1); if (!l_balance_item->key) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_balance_item); return false; } @@ -2545,14 +2560,14 @@ static bool s_load_cache_gdb_loaded_txs_callback(dap_global_db_instance_t *a_dbi for (size_t i = 0; i < a_values_count; i++) { dap_ledger_tx_item_t *l_tx_item = DAP_NEW_Z(dap_ledger_tx_item_t); if ( !l_tx_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } dap_chain_hash_fast_from_str(a_values[i].key, &l_tx_item->tx_hash_fast); l_tx_item->tx = DAP_NEW_Z_SIZE(dap_chain_datum_tx_t, a_values[i].value_len - sizeof(l_tx_item->cache_data)); if ( !l_tx_item->tx ) { DAP_DELETE(l_tx_item); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } memcpy(&l_tx_item->cache_data, a_values[i].value, sizeof(l_tx_item->cache_data)); @@ -2625,7 +2640,7 @@ static bool s_load_cache_gdb_loaded_emissions_callback(dap_global_db_instance_t } dap_ledger_token_emission_item_t *l_emission_item = DAP_NEW_Z(dap_ledger_token_emission_item_t); if ( !l_emission_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } dap_chain_hash_fast_from_str(a_values[i].key, &l_emission_item->datum_token_emission_hash); @@ -2731,7 +2746,7 @@ dap_ledger_t *dap_ledger_create(dap_chain_net_t *a_net, uint16_t a_flags) { dap_ledger_t *l_ledger = dap_ledger_handle_new(); if (!l_ledger) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ledger->net = a_net; @@ -2764,7 +2779,7 @@ dap_ledger_t *dap_ledger_create(dap_chain_net_t *a_net, uint16_t a_flags) for (uint16_t i = 0; i < l_whitelist_size; ++i) { dap_ledger_hal_item_t *l_hal_item = DAP_NEW_Z(dap_ledger_hal_item_t); if (!l_hal_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_ledger_pvt); DAP_DEL_Z(l_ledger); dap_config_close(l_cfg); @@ -3012,13 +3027,13 @@ int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emissi if (HASH_COUNT(l_ledger_pvt->threshold_emissions) < s_threshold_emissions_max) { l_token_emission_item = DAP_NEW_Z(dap_ledger_token_emission_item_t); if ( !l_token_emission_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return DAP_LEDGER_EMISSION_ADD_MEMORY_PROBLEM; } l_token_emission_item->datum_token_emission = DAP_DUP_SIZE(a_token_emission, a_token_emission_size); if ( !l_token_emission_item->datum_token_emission ) { DAP_DELETE(l_token_emission_item); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return DAP_LEDGER_EMISSION_ADD_MEMORY_PROBLEM; } l_token_emission_item->datum_token_emission_size = a_token_emission_size; @@ -3053,7 +3068,7 @@ int dap_ledger_token_emission_add(dap_ledger_t *a_ledger, byte_t *a_token_emissi if (!l_token_emission_item) { l_token_emission_item = DAP_NEW_Z(dap_ledger_token_emission_item_t); if ( !l_token_emission_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return DAP_LEDGER_EMISSION_ADD_MEMORY_PROBLEM; } l_token_emission_item->datum_token_emission_size = a_token_emission_size; @@ -3312,7 +3327,7 @@ void dap_ledger_addr_get_token_ticker_all_depricated(dap_ledger_t *a_ledger, dap if(l_tx_item) { l_tickers = DAP_NEW_Z_SIZE(char *, l_tickers_size * sizeof(char*)); if ( !l_tickers ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } while(l_tx_item) { @@ -3330,7 +3345,7 @@ void dap_ledger_addr_get_token_ticker_all_depricated(dap_ledger_t *a_ledger, dap l_tickers_size += (l_tickers_size / 2); l_tickers = DAP_REALLOC(l_tickers, l_tickers_size); if ( !l_tickers ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } } @@ -3344,7 +3359,7 @@ void dap_ledger_addr_get_token_ticker_all_depricated(dap_ledger_t *a_ledger, dap l_tickers_size = l_tickers_pos + 1; l_tickers = DAP_REALLOC(l_tickers, l_tickers_size * sizeof(char*)); if ( !l_tickers ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } } @@ -3370,7 +3385,7 @@ void dap_ledger_addr_get_token_ticker_all(dap_ledger_t *a_ledger, dap_chain_addr dap_ledger_token_item_t * l_token_item, *l_tmp; char **l_tickers = DAP_NEW_Z_SIZE(char*, l_count * sizeof(char*)); if (!l_tickers) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock); return; } @@ -3390,7 +3405,7 @@ void dap_ledger_addr_get_token_ticker_all(dap_ledger_t *a_ledger, dap_chain_addr if(l_count && a_tickers){ char **l_tickers = DAP_NEW_Z_SIZE(char*, l_count * sizeof(char*)); if (!l_tickers) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_rwlock_unlock(&PVT(a_ledger)->balance_accounts_rwlock); return; } @@ -3424,8 +3439,8 @@ const char *dap_ledger_get_description_by_ticker(dap_ledger_t *a_ledger, const c * * return transaction, or NULL if transaction not found in the cache */ -static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, - dap_chain_hash_fast_t *a_tx_hash, dap_ledger_tx_item_t **a_item_out, bool a_unspent_only) +static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash, + dap_ledger_tx_item_t **a_item_out, bool a_unspent_only) { if(!a_tx_hash) return NULL; @@ -3454,12 +3469,12 @@ static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, * @return */ -dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash) +dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash) { return s_find_datum_tx_by_hash(a_ledger, a_tx_hash, NULL, false); } -dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash) +dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash) { return s_find_datum_tx_by_hash(a_ledger, a_tx_hash, NULL, true); } @@ -3887,7 +3902,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, int l_prev_tx_count = 0; // 1. Verify signature in current transaction - if (!a_from_threshold && dap_chain_datum_tx_verify_sign(a_tx) != 1) + if (!a_from_threshold && dap_chain_datum_tx_verify_sign(a_tx)) return DAP_LEDGER_TX_CHECK_INVALID_TX_SIGN; // ---------------------------------------------------------------- @@ -3908,7 +3923,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, for (dap_list_t *it = l_list_in; it; it = it->next) { dap_ledger_tx_bound_t *l_bound_item = DAP_NEW_Z(dap_ledger_tx_bound_t); if (!l_bound_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err_num = DAP_LEDGER_TX_CHECK_MEMORY_PROBLEM; break; } @@ -4412,7 +4427,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, if (!l_value_cur) { l_value_cur = DAP_NEW_Z(dap_ledger_tokenizer_t); if ( !l_value_cur ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err_num = DAP_LEDGER_TX_CHECK_MEMORY_PROBLEM; break; } @@ -4456,7 +4471,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, } else { l_value_cur = DAP_NEW_Z(dap_ledger_tokenizer_t); if ( !l_value_cur ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err_num = DAP_LEDGER_TX_CHECK_MEMORY_PROBLEM; if ( l_list_bound_items ) dap_list_free_full(l_list_bound_items, NULL); @@ -4550,7 +4565,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, if (!l_value_cur) { l_value_cur = DAP_NEW_Z(dap_ledger_tokenizer_t); if ( !l_value_cur ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_err_num = DAP_LEDGER_TX_CHECK_MEMORY_PROBLEM; break; } @@ -4719,8 +4734,7 @@ int dap_ledger_tx_cache_check(dap_ledger_t *a_ledger, */ int dap_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, size_t a_datum_size, dap_hash_fast_t *a_datum_hash) { - if (!a_tx) - return DAP_LEDGER_TX_CHECK_NULL_TX; + dap_return_val_if_pass(!a_tx, DAP_LEDGER_TX_CHECK_NULL_TX); size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx); if (l_tx_size != a_datum_size) { @@ -4731,13 +4745,11 @@ int dap_ledger_tx_add_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, int l_ret_check = dap_ledger_tx_cache_check(a_ledger, a_tx, a_datum_hash, false, NULL, NULL, NULL, NULL, NULL, false); if(s_debug_more) { - char l_tx_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(a_datum_hash, l_tx_hash_str, sizeof(l_tx_hash_str)); if (l_ret_check) log_it(L_NOTICE, "Ledger TX adding check not passed for TX %s: error %s", - l_tx_hash_str, dap_ledger_tx_check_err_str(l_ret_check)); + dap_chain_hash_fast_to_str_static(a_datum_hash), dap_ledger_tx_check_err_str(l_ret_check)); else - log_it(L_INFO, "Ledger TX adding check passed for TX %s", l_tx_hash_str); + log_it(L_INFO, "Ledger TX adding check passed for TX %s", dap_chain_hash_fast_to_str_static(a_datum_hash)); } return l_ret_check; @@ -4774,11 +4786,6 @@ static int s_sort_ledger_tx_item(dap_ledger_tx_item_t* a, dap_ledger_tx_item_t* a->tx->header.ts_created < b->tx->header.ts_created ? -1 : 1; } -void dap_ledger_set_tps_start_time(dap_ledger_t *a_ledger) -{ - clock_gettime(CLOCK_REALTIME, &PVT(a_ledger)->tps_start_time); -} - /** * @brief Add new transaction to the cache list * @param a_ledger @@ -4800,18 +4807,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha dap_ledger_tx_item_t *l_item_tmp = NULL; char *l_main_token_ticker = NULL; - if (!l_ledger_pvt->tps_timer) { -#ifndef DAP_TPS_TEST - dap_ledger_set_tps_start_time(a_ledger); -#endif - l_ledger_pvt->tps_current_time.tv_sec = l_ledger_pvt->tps_start_time.tv_sec; - l_ledger_pvt->tps_current_time.tv_nsec = l_ledger_pvt->tps_start_time.tv_nsec; - l_ledger_pvt->tps_count = 0; - if (dap_events_workers_init_status()) - l_ledger_pvt->tps_timer = dap_timerfd_start(500, s_ledger_tps_callback, l_ledger_pvt); - else - l_ledger_pvt->tps_timer = NULL; - } bool l_from_threshold = a_from_threshold; 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)); @@ -4840,14 +4835,14 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha } else { l_item_tmp = DAP_NEW_Z(dap_ledger_tx_item_t); if ( !l_item_tmp ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_item_tmp->tx_hash_fast = *a_tx_hash; l_item_tmp->tx = l_ledger_pvt->mapped ? a_tx : DAP_DUP_SIZE(a_tx, dap_chain_datum_tx_get_size(a_tx)); if ( !l_item_tmp->tx ) { DAP_DELETE(l_item_tmp); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_item_tmp->ts_added = dap_nanotime_now(); @@ -4879,7 +4874,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha if (PVT(a_ledger)->cached) { l_cache_used_outs = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * (l_outs_used + 1)); if ( !l_cache_used_outs ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_ret = -1; goto FIN; } @@ -4926,7 +4921,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha case TX_ITEM_TYPE_IN_REWARD: { dap_ledger_reward_item_t *l_item = DAP_NEW_Z(dap_ledger_reward_item_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_ret = -1; goto FIN; } @@ -5104,7 +5099,7 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha // add transaction to the cache list dap_ledger_tx_item_t *l_tx_item = DAP_NEW_Z(dap_ledger_tx_item_t); if ( !l_tx_item ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_ret = -1; goto FIN; } @@ -5142,9 +5137,6 @@ int dap_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_ha l_notify->callback(a_ledger, a_tx, a_tx_hash, l_notify->arg, DAP_LEDGER_NOTIFY_OPCODE_ADDED); } } - // Count TPS - clock_gettime(CLOCK_REALTIME, &l_ledger_pvt->tps_end_time); - l_ledger_pvt->tps_count++; if (PVT(a_ledger)->cached) { // Add it to cache size_t l_tx_cache_sz = l_tx_size + sizeof(l_tx_item->cache_data); @@ -5473,20 +5465,6 @@ FIN: return l_ret; } - -static bool s_ledger_tps_callback(void *a_arg) -{ - dap_ledger_private_t *l_ledger_pvt = (dap_ledger_private_t *)a_arg; - if (l_ledger_pvt->tps_current_time.tv_sec != l_ledger_pvt->tps_end_time.tv_sec || - l_ledger_pvt->tps_current_time.tv_nsec != l_ledger_pvt->tps_end_time.tv_nsec) { - l_ledger_pvt->tps_current_time.tv_sec = l_ledger_pvt->tps_end_time.tv_sec; - l_ledger_pvt->tps_current_time.tv_nsec = l_ledger_pvt->tps_end_time.tv_nsec; - return true; - } - l_ledger_pvt->tps_timer = NULL; - return false; -} - int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_chain_hash_fast_t *a_tx_hash) { #ifndef DAP_LEDGER_TEST @@ -5652,7 +5630,7 @@ unsigned dap_ledger_count(dap_ledger_t *a_ledger) * @param a_ts_to * @return */ -uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from, dap_time_t a_ts_to) +uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_nanotime_t a_ts_from, dap_nanotime_t a_ts_to) { uint64_t l_ret = 0; dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); @@ -5660,44 +5638,26 @@ uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from, pthread_rwlock_rdlock(&l_ledger_pvt->ledger_rwlock); if ( a_ts_from && a_ts_to) { HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){ - if ( l_iter_current->tx->header.ts_created >= a_ts_from && l_iter_current->cache_data.ts_created <= a_ts_to ) - l_ret++; + if ( l_iter_current->ts_added >= a_ts_from && l_iter_current->ts_added <= a_ts_to ) + l_ret++; } } else if ( a_ts_to ){ HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){ - if ( l_iter_current->tx->header.ts_created <= a_ts_to ) - l_ret++; + if ( l_iter_current->ts_added <= a_ts_to ) + l_ret++; } } else if ( a_ts_from ){ HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){ - if ( l_iter_current->tx->header.ts_created >= a_ts_from ) - l_ret++; - } - }else { - HASH_ITER(hh, l_ledger_pvt->ledger_items , l_iter_current, l_item_tmp){ - l_ret++; + if ( l_iter_current->ts_added >= a_ts_from ) + l_ret++; } + } else { + l_ret = HASH_COUNT(l_ledger_pvt->ledger_items); } - pthread_rwlock_unlock(&l_ledger_pvt->ledger_rwlock); return l_ret; } -size_t dap_ledger_count_tps(dap_ledger_t *a_ledger, struct timespec *a_ts_from, struct timespec *a_ts_to) -{ - if (!a_ledger) - return 0; - dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); - if (a_ts_from) { - a_ts_from->tv_sec = l_ledger_pvt->tps_start_time.tv_sec; - a_ts_from->tv_nsec = l_ledger_pvt->tps_start_time.tv_nsec; - } - if (a_ts_to) { - a_ts_to->tv_sec = l_ledger_pvt->tps_end_time.tv_sec; - a_ts_to->tv_nsec = l_ledger_pvt->tps_end_time.tv_nsec; - } - return l_ledger_pvt->tps_count; -} /** * Check whether used 'out' items @@ -5780,7 +5740,7 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a if (!memcmp(a_addr, &l_tx_out->addr, sizeof(dap_chain_addr_t))) { // if 'out' item not used & transaction is valid if(!s_ledger_tx_hash_is_used_out_item(l_iter_current, l_out_idx_tmp, NULL) && - dap_chain_datum_tx_verify_sign(l_cur_tx)) { + !dap_chain_datum_tx_verify_sign(l_cur_tx)) { uint256_t l_add = dap_chain_uint256_from(l_tx_out->header.value); SUM_256_256(balance, l_add, &balance); } @@ -5796,7 +5756,7 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a if (!memcmp(a_addr, &l_tx_out->addr, sizeof(dap_chain_addr_t))) { // if 'out' item not used & transaction is valid if(!s_ledger_tx_hash_is_used_out_item(l_iter_current, l_out_idx_tmp, NULL) && - dap_chain_datum_tx_verify_sign(l_cur_tx)) { + !dap_chain_datum_tx_verify_sign(l_cur_tx)) { SUM_256_256(balance, l_tx_out->header.value, &balance); } } @@ -5811,7 +5771,7 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a if (!memcmp(a_addr, &l_tx_out->addr, sizeof(dap_chain_addr_t))) { // if 'out' item not used & transaction is valid if(!s_ledger_tx_hash_is_used_out_item(l_iter_current, l_out_idx_tmp, NULL) && - dap_chain_datum_tx_verify_sign(l_cur_tx)) { + !dap_chain_datum_tx_verify_sign(l_cur_tx)) { SUM_256_256(balance, l_tx_out->header.value, &balance); } } @@ -6294,7 +6254,7 @@ int dap_ledger_verificator_add(dap_chain_tx_out_cond_subtype_t a_subtype, dap_le } l_new_verificator = DAP_NEW(dap_ledger_verificator_t); if (!l_new_verificator) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_new_verificator->subtype = (int)a_subtype; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index d4d21553ed89149a7aafe38aea13f48a031589fd..570b45583fa91dc3865d3fb1b926dd506c9742fc 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -186,6 +186,7 @@ typedef struct dap_chain_net_pvt{ struct block_reward *rewards; dap_chain_net_decree_t *decree; decree_table_t *decrees; + anchor_table_t *anchors; } dap_chain_net_pvt_t; typedef struct dap_chain_net_item{ @@ -260,29 +261,29 @@ int dap_chain_net_init() dap_link_manager_init(&s_link_manager_callbacks); dap_chain_node_init(); dap_cli_server_cmd_add ("net", s_cli_net, "Network commands", - "net list [chains -net <chain net name>]\n" + "net list [chains -net <net_name>]\n" "\tList all networks or list all chains in selected network\n" - "net -net <chain net name> [-mode {update | all}] go {online | offline | sync}\n" + "net -net <net_name> [-mode {update | all}] go {online | offline | sync}\n" "\tFind and establish links and stay online. \n" "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" - "net -net <chain net name> get {status | fee | id}\n" + "net -net <net_name> get {status | fee | id}\n" "\tDisplays the current current status, current fee or net id.\n" - "net -net <chain net name> stats {tx | tps} [-from <From time>] [-to <To time>] [-prev_sec <Seconds>] \n" + "net -net <net_name> stats {tx | tps} [-from <from_time>] [-to <to_time>] [-prev_sec <seconds>] \n" "\tTransactions statistics. Time format is <Year>-<Month>-<Day>_<Hours>:<Minutes>:<Seconds> or just <Seconds> \n" - "net -net <chain net name> [-mode {update | all}] sync {all | gdb | chains}\n" + "net -net <net_name> [-mode {update | all}] sync {all | gdb | chains}\n" "\tSyncronyze gdb, chains or everything\n" "\tMode \"update\" is by default when only new chains and gdb are updated. Mode \"all\" updates everything from zero\n" - "net -net <chain net name> link {list | add | del | info [-addr] | disconnect_all}\n" + "net -net <net_name> link {list | add | del | info [-addr]| disconnect_all}\n" "\tList, add, del, dump or establish links\n" - "net -net <chain net name> ca add {-cert <cert name> | -hash <cert hash>}\n" + "net -net <net_name> ca add {-cert <cert_name> | -hash <cert_hash>}\n" "\tAdd certificate to list of authority cetificates in GDB group\n" - "net -net <chain net name> ca list\n" + "net -net <net_name> ca list\n" "\tPrint list of authority cetificates from GDB group\n" - "net -net <chain net name> ca del -hash <cert hash> [-H {hex | base58(default)}]\n" + "net -net <net_name> ca del -hash <cert_hash> [-H {hex | base58(default)}]\n" "\tDelete certificate from list of authority cetificates in GDB group by it's hash\n" - "net -net <chain net name> ledger reload\n" + "net -net <net_name> ledger reload\n" "\tPurge the cache of chain net ledger and recalculate it from chain file\n" - "net -net <chain net name> poa_certs list\n" + "net -net <net_name> poa_certs list\n" "\tPrint list of PoA cerificates for this network\n"); s_debug_more = dap_config_get_item_bool_default(g_config,"chain_net","debug_more", s_debug_more); @@ -316,12 +317,9 @@ int dap_chain_net_init() s_net_init(l_dir_entry->d_name, l_acl_idx++); } closedir(l_net_dir); - }else{ - int l_errno = errno; - char l_errbuf[128]; - l_errbuf[0] = 0; - strerror_r(l_errno,l_errbuf,sizeof (l_errbuf)); - log_it(L_WARNING,"Can't open entries on path %s: \"%s\" (code %d)", l_net_dir_str, l_errbuf, l_errno); + } else { + log_it(L_WARNING, "Can't open entries on path %s, error %d: \"%s\"", + l_net_dir_str, errno, dap_strerror(errno)); } DAP_DELETE (l_net_dir_str); @@ -383,12 +381,10 @@ int dap_chain_net_state_go_to(dap_chain_net_t *a_net, dap_chain_net_state_t a_ne dap_link_manager_set_net_condition(a_net->pub.id.uint64, true); for (uint16_t i = 0; i < PVT(a_net)->permanent_links_count; ++i) { dap_link_info_t *l_permalink_info = PVT(a_net)->permanent_links[i]; - if (dap_link_manager_link_create(&l_permalink_info->node_addr, a_net->pub.id.uint64)) { + if (dap_chain_net_link_add(a_net, &l_permalink_info->node_addr, l_permalink_info->uplink_addr, l_permalink_info->uplink_port)) { log_it(L_ERROR, "Can't create permanent link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_permalink_info->node_addr)); continue; } - if (l_permalink_info->uplink_port) - dap_link_manager_link_update(&l_permalink_info->node_addr, l_permalink_info->uplink_addr, l_permalink_info->uplink_port); } if (a_new_state == NET_STATE_ONLINE) dap_chain_esbocs_start_timer(a_net->pub.id); @@ -396,10 +392,9 @@ int dap_chain_net_state_go_to(dap_chain_net_t *a_net, dap_chain_net_state_t a_ne return dap_proc_thread_callback_add(NULL, s_net_states_proc, a_net); } -dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net) +DAP_INLINE dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net) { - dap_chain_net_state_t l_ret = PVT(a_net)->state_target; - return l_ret; + return PVT(a_net)->state_target; } static struct request_link_info *s_balancer_link_from_cfg(dap_chain_net_t *a_net) @@ -582,28 +577,58 @@ int s_link_manager_fill_net_info(dap_link_t *a_link) json_object *s_net_sync_status(dap_chain_net_t *a_net) { // sanity check dap_return_val_if_pass(!a_net, NULL); -// func work - json_object *l_ret = json_object_new_object(); - size_t - l_count_el = 0, - l_count_el_all = 0, - l_node_link_nodes = 0; + size_t l_count_atoms = 0; + json_object *l_jobj_chains_array = json_object_new_object(); dap_chain_t *l_chain = NULL; - DL_FOREACH(a_net->pub.chains, l_chain){ - l_count_el += l_chain->callback_count_atom(l_chain); - l_count_el_all += l_chain->atom_num_last; - } - double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0; - char *l_percent_str = dap_strdup_printf("%.3f", l_percent); - json_object *l_jobj_percent = json_object_new_string(l_percent_str); - DAP_DELETE(l_percent_str); - json_object *l_jobj_total = json_object_new_uint64(l_count_el_all); - json_object *l_jobj_current = json_object_new_uint64(l_count_el); - json_object_object_add(l_ret, "current", l_jobj_current); - json_object_object_add(l_ret, "total", l_jobj_total); - json_object_object_add(l_ret, "percent", l_jobj_percent); - return l_ret; + DL_FOREACH(a_net->pub.chains, l_chain) { + json_object *l_jobj_chain = json_object_new_object(); + json_object *l_jobj_chain_status = NULL; + json_object *l_jobj_percent = NULL; + double l_percent = l_chain->callback_count_atom(l_chain) ? + (double) (l_chain->callback_count_atom(l_chain) * 100) / l_chain->atom_num_last : 0; + if (l_percent > 100) + l_percent = 100; + char *l_percent_str = dap_strdup_printf("%.3f", l_percent); + dap_chain_net_state_t l_state = PVT(a_net)->state; + switch (l_state) { + case NET_STATE_OFFLINE: + case NET_STATE_LINKS_PREPARE: + case NET_STATE_LINKS_ESTABLISHED: + case NET_STATE_LINKS_CONNECTING: + l_jobj_chain_status = json_object_new_string("not synced"); + l_jobj_percent = json_object_new_string(" - %"); + break; + case NET_STATE_ONLINE: + l_jobj_chain_status = json_object_new_string("synced"); + l_jobj_percent = json_object_new_string(l_percent_str); + break; + case NET_STATE_SYNC_CHAINS: + if (PVT(a_net)->sync_context.cur_chain && PVT(a_net)->sync_context.cur_chain->id.uint64 == l_chain->id.uint64) { + l_jobj_chain_status = json_object_new_string("sync in process"); + l_jobj_percent = json_object_new_string(l_percent_str); + } else { + if (l_chain->atom_num_last == l_chain->callback_count_atom(l_chain)) { + l_jobj_chain_status = json_object_new_string("synced"); + l_jobj_percent = json_object_new_string(l_percent_str); + } else { + l_jobj_chain_status = json_object_new_string("not synced"); + l_jobj_percent = json_object_new_string(" - %"); + } + } + break; + } + DAP_DELETE(l_percent_str); + json_object *l_jobj_current = json_object_new_uint64(l_chain->callback_count_atom(l_chain)); + json_object *l_jobj_total = json_object_new_uint64(l_chain->atom_num_last); + json_object_object_add(l_jobj_chain, "status", l_jobj_chain_status); + json_object_object_add(l_jobj_chain, "current", l_jobj_current); + json_object_object_add(l_jobj_chain, "in network", l_jobj_total); + json_object_object_add(l_jobj_chain, "percent", l_jobj_percent); + json_object_object_add(l_jobj_chains_array, l_chain->name, l_jobj_chain); + + } + return l_jobj_chains_array; } struct json_object *dap_chain_net_states_json_collect(dap_chain_net_t *a_net) { @@ -1201,8 +1226,6 @@ static int s_cli_net(int argc, char **argv, void **reply) time_t l_from_ts = mktime(&l_from_tm); time_t l_to_ts = mktime(&l_to_tm); // Produce strings - char l_from_str_new[50]; - char l_to_str_new[50]; strftime(l_from_str_new, sizeof(l_from_str_new), c_time_fmt,&l_from_tm ); strftime(l_to_str_new, sizeof(l_to_str_new), c_time_fmt,&l_to_tm ); json_object *l_jobj_stats = json_object_new_object(); @@ -1211,102 +1234,58 @@ static int s_cli_net(int argc, char **argv, void **reply) dap_json_rpc_allocation_error; return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } - if (l_from_str) { - json_object *l_jobj_from = json_object_new_string(l_from_str); - if (!l_jobj_from) { - json_object_put(l_jobj_return); - json_object_put(l_jobj_stats); - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_object_add(l_jobj_stats, "from", l_jobj_from); - } - if (l_to_str) { - json_object *l_jobj_to = json_object_new_string(l_to_str); - if (!l_jobj_to) { - json_object_put(l_jobj_return); - json_object_put(l_jobj_stats); - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_object_add(l_jobj_stats, "to", l_jobj_to); + json_object *l_jobj_from = json_object_new_string(l_from_str_new); + json_object *l_jobj_to = json_object_new_string(l_to_str_new); + if (!l_jobj_from || !l_jobj_to) { + json_object_put(l_jobj_return); + json_object_put(l_jobj_stats); + json_object_put(l_jobj_from); + json_object_put(l_jobj_to); + dap_json_rpc_allocation_error; + return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } + json_object_object_add(l_jobj_stats, "from", l_jobj_from); + json_object_object_add(l_jobj_stats, "to", l_jobj_to); log_it(L_INFO, "Calc TPS from %s to %s", l_from_str_new, l_to_str_new); - uint64_t l_tx_count = dap_ledger_count_from_to ( l_net->pub.ledger, l_from_ts, l_to_ts); + uint64_t l_tx_count = dap_ledger_count_from_to ( l_net->pub.ledger, l_from_ts * 1000000000, l_to_ts * 1000000000); long double l_tpd = l_to_ts == l_from_ts ? 0 : (long double) l_tx_count / (long double) ((long double)(l_to_ts - l_from_ts) / 86400); char *l_tpd_str = dap_strdup_printf("%.3Lf", l_tpd); json_object *l_jobj_tpd = json_object_new_string(l_tpd_str); DAP_DELETE(l_tpd_str); json_object *l_jobj_total = json_object_new_uint64(l_tx_count); +#ifdef DAP_TPS_TEST + long double l_tps = l_to_ts == l_from_ts ? 0 : + (long double) l_tx_count / (long double) (long double)(l_to_ts - l_from_ts); + char *l_tps_str = dap_strdup_printf("%.3Lf", l_tps); + json_object *l_jobj_tps = json_object_new_string(l_tps_str); + DAP_DELETE(l_tps_str); + if (!l_jobj_tpd || !l_jobj_total || !l_jobj_tps) { + json_object_put(l_jobj_tps); +#else if (!l_jobj_tpd || !l_jobj_total) { +#endif + json_object_put(l_jobj_return); json_object_put(l_jobj_stats); + json_object_put(l_jobj_from); + json_object_put(l_jobj_to); json_object_put(l_jobj_tpd); json_object_put(l_jobj_total); dap_json_rpc_allocation_error; return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; } +#ifdef DAP_TPS_TEST + json_object_object_add(l_jobj_stats, "transaction_per_sec", l_jobj_tps); +#endif json_object_object_add(l_jobj_stats, "transaction_per_day", l_jobj_tpd); json_object_object_add(l_jobj_stats, "total", l_jobj_total); json_object_object_add(l_jobj_return, "transaction_statistics", l_jobj_stats); l_ret = DAP_CHAIN_NET_JSON_RPC_OK; - } -#ifdef DAP_TPS_TEST - else if (strcmp(l_stats_str, "tps") == 0) { - struct timespec l_from_time_acc = {}, l_to_time_acc = {}; - json_object *l_jobj_values = json_object_new_object(); - if (!l_jobj_values) { - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - size_t l_tx_num = dap_ledger_count_tps(l_net->pub.ledger, &l_from_time_acc, &l_to_time_acc); - if (l_tx_num) { - localtime_r(&l_from_time_acc.tv_sec, &l_from_tm); - strftime(l_from_str_new, sizeof(l_from_str_new), c_time_fmt, &l_from_tm); - localtime_r(&l_to_time_acc.tv_sec, &l_to_tm); - strftime(l_to_str_new, sizeof(l_to_str_new), c_time_fmt, &l_to_tm); - json_object *l_jobj_from = json_object_new_string(l_from_str_new); - json_object *l_jobj_to = json_object_new_string(l_to_str_new); - uint64_t l_diff_ns = (l_to_time_acc.tv_sec - l_from_time_acc.tv_sec) * 1000000000 + - l_to_time_acc.tv_nsec - l_from_time_acc.tv_nsec; - long double l_tps = (long double)(l_tx_num * 1000000000) / (long double)(l_diff_ns); - char *l_tps_str = dap_strdup_printf("%.3Lf", l_tps); - json_object *l_jobj_tps = json_object_new_string(l_tps_str); - DAP_DELETE(l_tps_str); - if (!l_jobj_from || !l_jobj_to || !l_jobj_tps) { - json_object_put(l_jobj_return); - json_object_put(l_jobj_values); - json_object_put(l_jobj_from); - json_object_put(l_jobj_to); - json_object_put(l_jobj_tps); - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_object_add(l_jobj_values, "from", l_jobj_from); - json_object_object_add(l_jobj_values, "to", l_jobj_to); - json_object_object_add(l_jobj_values, "tps", l_jobj_tps); - } - json_object *l_jobj_total = json_object_new_uint64(l_tx_num); - if (!l_jobj_total) { - json_object_put(l_jobj_return); - json_object_put(l_jobj_values); - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_object_add(l_jobj_values, "total", l_jobj_total); - json_object_object_add(l_jobj_return, "transactions_per_second_peak", l_jobj_values); - l_ret = DAP_CHAIN_NET_JSON_RPC_OK; - } -#endif - else { + } else { json_object_put(l_jobj_return); -#ifdef DAP_TPS_TEST - dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS, "Subcommand 'stats' requires one of parameter: tx, tps"); -#else dap_json_rpc_error_add(DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS, "%s", "Subcommand 'stats' requires one of parameter: tx"); -#endif return DAP_CHAIN_NET_JSON_RPC_UNDEFINED_PARAMETER_COMMAND_STATS; } } else if ( l_go_str){ @@ -1926,7 +1905,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) // Add network to the list dap_chain_net_item_t *l_net_item = DAP_NEW_Z(dap_chain_net_item_t); if (!l_net_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -4; @@ -1942,7 +1921,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) if (l_net_pvt->permanent_links_count) { l_net_pvt->permanent_links = DAP_NEW_Z_COUNT(dap_link_info_t *, l_net_pvt->permanent_links_count); if (!l_net_pvt->permanent_links) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -4; @@ -1951,43 +1930,53 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) for (uint16_t i = 0; i < l_net_pvt->permanent_links_count; ++i) { l_net_pvt->permanent_links[i] = DAP_NEW_Z(dap_link_info_t); if (!l_net_pvt->permanent_links[i]) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -4; } if (dap_stream_node_addr_from_str(&l_net_pvt->permanent_links[i]->node_addr, l_permanent_nodes_addrs[i])) { - log_it(L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", l_permanent_nodes_addrs[i]); + log_it(L_ERROR, "Incorrect format of node address \"%s\", fix net config and restart node", l_permanent_nodes_addrs[i]); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -16; } } - uint16_t l_permalink_hosts_count = 0; + uint16_t l_permalink_hosts_count = 0, i, e; char **l_permanent_links_hosts = dap_config_get_array_str(l_cfg, "general", "permanent_nodes_hosts", &l_permalink_hosts_count); - for (uint16_t i = 0; i < dap_min(l_permalink_hosts_count, l_net_pvt->permanent_links_count); ++i) { - uint16_t l_port = 0; - char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; - if (dap_net_parse_hostname(l_permanent_links_hosts[i], l_host, &l_port) || !l_port) { - log_it(L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", - l_permanent_links_hosts[i]); - dap_chain_net_delete(l_net); - dap_config_close(l_cfg); - return -16; + for (i = 0, e = 0; i < dap_min(l_permalink_hosts_count, l_net_pvt->permanent_links_count); ++i) { + char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; uint16_t l_port = 0; + struct sockaddr_storage l_saddr; + if ( dap_net_parse_config_address(l_permanent_links_hosts[i], l_host, &l_port, NULL, NULL) < 0 + || dap_net_resolve_host(l_host, dap_itoa(l_port), false, &l_saddr, NULL) < 0 ) + { + log_it(L_ERROR, "Incorrect address \"%s\", fix \"%s\" network config" + "or check internet connection and restart node", + a_net_name, l_permanent_links_hosts[i]); + ++e; + continue; } l_net_pvt->permanent_links[i]->uplink_port = l_port; dap_strncpy(l_net_pvt->permanent_links[i]->uplink_addr, l_host, DAP_HOSTADDR_STRLEN); } + if ( i && (e == i) ) { + log_it(L_ERROR, "%d / %d permanent links are invalid or can't be accessed, fix \"%s\"" + "network config or check internet connection and restart node", + e, i, a_net_name); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -16; + } char **l_authorized_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "authorized_nodes_addrs", &l_net_pvt->authorized_nodes_count); if (!l_net_pvt->authorized_nodes_count) log_it(L_WARNING, "Can't read PoA nodes addresses"); else l_net_pvt->authorized_nodes_addrs = DAP_NEW_Z_COUNT(dap_chain_node_addr_t, l_net_pvt->authorized_nodes_count); - for (uint16_t i = 0; i < l_net_pvt->authorized_nodes_count; ++i) { + for (i = 0; i < l_net_pvt->authorized_nodes_count; ++i) { dap_chain_node_addr_t l_addr; if (dap_stream_node_addr_from_str(&l_addr, l_authorized_nodes_addrs[i])) { - log_it(L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", l_authorized_nodes_addrs[i]); + log_it(L_ERROR, "Incorrect format of node address \"%s\", fix net config and restart node", l_authorized_nodes_addrs[i]); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -17; @@ -2000,24 +1989,26 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) if (!l_net_pvt->seed_nodes_count) log_it(L_WARNING, "Can't read seed nodes addresses, work with local balancer only"); else if (!(l_net_pvt->seed_nodes_info = DAP_NEW_Z_COUNT(struct request_link_info *, l_net_pvt->seed_nodes_count))) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -4; } - for (uint16_t i = 0; i < l_net_pvt->seed_nodes_count; ++i) { - uint16_t l_port = 0; - char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; - if (dap_net_parse_hostname(l_seed_nodes_hosts[i], l_host, &l_port) || !l_port) { - log_it(L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", - l_seed_nodes_hosts[i]); - dap_chain_net_delete(l_net); - dap_config_close(l_cfg); - return -16; + for (i = 0, e = 0; i < l_net_pvt->seed_nodes_count; ++i) { + char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; uint16_t l_port = 0; + struct sockaddr_storage l_saddr; + if ( dap_net_parse_config_address(l_seed_nodes_hosts[i], l_host, &l_port, NULL, NULL) < 0 + || dap_net_resolve_host(l_host, dap_itoa(l_port), false, &l_saddr, NULL) < 0) + { + log_it(L_ERROR, "Incorrect address \"%s\", fix \"%s\" network config" + "or check internet connection and restart node", + a_net_name, l_seed_nodes_hosts[i]); + ++e; + continue; } l_net_pvt->seed_nodes_info[i] = DAP_NEW_Z(struct request_link_info); if (!l_net_pvt->seed_nodes_info[i]) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -4; @@ -2025,6 +2016,14 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) l_net_pvt->seed_nodes_info[i]->port = l_port; dap_strncpy(l_net_pvt->seed_nodes_info[i]->addr, l_host, DAP_HOSTADDR_STRLEN); } + if ( i && (e == i) ) { + log_it(L_ERROR, "%d / %d seed links are invalid or can't be accessed, fix \"%s\"" + "network config or check internet connection and restart node", + e, i, a_net_name); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -16; + } /* *** Chains init by configs *** */ char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), l_net->pub.name); @@ -2044,7 +2043,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) continue; char *l_entry_name = dap_strdup(l_dir_entry->d_name); if (!l_entry_name) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_chain_net_delete(l_net); closedir(l_chains_dir); return -8; @@ -2058,7 +2057,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) if(l_cfg_new) { list_priority *l_chain_prior = DAP_NEW_Z(list_priority); if (!l_chain_prior) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_entry_name); dap_config_close(l_cfg_new); closedir(l_chains_dir); @@ -2198,7 +2197,7 @@ bool s_net_load(void *a_arg) //dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Initialized chain files"); } - l_chain->atom_num_last = l_chain->callback_count_atom(l_chain); + l_chain->atom_num_last = 0; l_chain = l_chain->next; } // Process thresholds if any @@ -2339,7 +2338,8 @@ bool s_net_load(void *a_arg) if (!l_ext_addr) { log_it(L_INFO, "External address is not set, will be detected automatically"); } else { - if ( dap_net_parse_hostname(l_ext_addr, l_host, &l_ext_port) ) + struct sockaddr_storage l_saddr = { }; + if ( 0 > dap_net_parse_config_address(l_ext_addr, l_host, &l_ext_port, &l_saddr, NULL) ) log_it(L_ERROR, "Invalid server address \"%s\", fix config and restart node", l_ext_addr); else { uint8_t l_hostlen = dap_strlen(l_host); @@ -2348,9 +2348,11 @@ bool s_net_load(void *a_arg) } } if ( !l_net_pvt->node_info->ext_port ) { - char **l_listening = dap_config_get_array_str(g_config, "server", "listen_address", NULL); - l_net_pvt->node_info->ext_port = l_listening && !dap_net_parse_hostname(*l_listening, NULL, &l_ext_port) && l_ext_port - ? l_ext_port : 8079; // TODO: default port? + char **l_listening = dap_config_get_array_str(g_config, "server", DAP_CFG_PARAM_LISTEN_ADDRS, NULL); + l_net_pvt->node_info->ext_port = + ( l_listening && dap_net_parse_config_address(*l_listening, NULL, &l_ext_port, NULL, NULL) > 0 && l_ext_port ) + ? l_ext_port + : dap_config_get_item_int16_default(g_config, "server", DAP_CFG_PARAM_LEGACY_PORT, 8079); // TODO: default port? } } // otherwise, we're in seed list - seed config predominates server config thus disambiguating the settings @@ -2407,6 +2409,8 @@ static void s_ch_in_pkt_callback(dap_stream_ch_t *a_ch, uint8_t a_type, const vo a_type, a_data_size, NODE_ADDR_FP_ARGS_S(a_ch->stream->node)); dap_chain_net_t *l_net = a_arg; dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); + if (l_net_pvt->state == NET_STATE_LINKS_ESTABLISHED) + l_net_pvt->state = NET_STATE_SYNC_CHAINS; switch (a_type) { case DAP_CHAIN_CH_PKT_TYPE_CHAIN_SUMMARY: @@ -2451,7 +2455,7 @@ static void s_ch_in_pkt_callback(dap_stream_ch_t *a_ch, uint8_t a_type, const vo : c_dap_chain_cell_id_null, NULL); if (!l_iter) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_ch_write_error_unsafe(a_ch, l_net->pub.id, l_net_pvt->sync_context.cur_chain->id, l_net_pvt->sync_context.cur_cell @@ -2587,7 +2591,7 @@ static void s_sync_timer_callback(void *a_arg) l_net_pvt->sync_context.cur_cell ? l_net_pvt->sync_context.cur_cell->id : c_dap_chain_cell_id_null, &l_request, sizeof(l_request), DAP_CHAIN_CH_PKT_VERSION_CURRENT); if (!l_chain_pkt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } log_it(L_INFO, "Start synchronization process with " NODE_ADDR_FP_STR @@ -3205,7 +3209,7 @@ int dap_chain_datum_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t log_it(L_WARNING, "Corrupted anchor, datum size %zd is not equal to size of anchor %zd", l_datum_data_size, l_anchor_size); return -102; } - return dap_chain_net_anchor_load(l_anchor, a_chain); + return dap_chain_net_anchor_load(l_anchor, a_chain, a_datum_hash); } case DAP_CHAIN_DATUM_TOKEN_DECL: return dap_ledger_token_load(l_ledger, a_datum->data, a_datum->header.data_size); @@ -3217,7 +3221,7 @@ int dap_chain_datum_add(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, size_t dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data; size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); if (l_tx_size != l_datum_data_size) { - log_it(L_WARNING, "Corrupted trnsaction, datum size %zd is not equal to size of TX %zd", l_datum_data_size, l_tx_size); + log_it(L_WARNING, "Corrupted transaction, datum size %zd is not equal to size of TX %zd", l_datum_data_size, l_tx_size); return -102; } return dap_ledger_tx_load(l_ledger, l_tx, a_datum_hash); @@ -3252,32 +3256,22 @@ int dap_chain_datum_remove(dap_chain_t *a_chain, dap_chain_datum_t *a_datum, siz dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; switch (a_datum->header.type_id) { case DAP_CHAIN_DATUM_DECREE: { - /*dap_chain_datum_decree_t *l_decree = (dap_chain_datum_decree_t *)a_datum->data; - size_t l_decree_size = dap_chain_datum_decree_get_size(l_decree); - if (l_decree_size != l_datum_data_size) { - log_it(L_WARNING, "Corrupted decree, datum size %zd is not equal to size of decree %zd", l_datum_data_size, l_decree_size); - return -102; - }*/ - return 0; //dap_chain_net_decree_load(l_decree, a_chain, a_datum_hash); + return 0; } case DAP_CHAIN_DATUM_ANCHOR: { dap_chain_datum_anchor_t *l_anchor = (dap_chain_datum_anchor_t *)a_datum->data; - - - size_t l_anchor_size = dap_chain_datum_anchor_get_size(l_anchor); if (l_anchor_size != l_datum_data_size) { log_it(L_WARNING, "Corrupted anchor, datum size %zd is not equal to size of anchor %zd", l_datum_data_size, l_anchor_size); return -102; } - return dap_chain_net_anchor_unload(l_anchor, a_chain); + return dap_chain_net_anchor_unload(l_anchor, a_chain, a_datum_hash); } case DAP_CHAIN_DATUM_TOKEN_DECL: - return 0;//dap_ledger_token_load(l_ledger, a_datum->data, a_datum->header.data_size); + return 0; case DAP_CHAIN_DATUM_TOKEN_EMISSION: - return 0;//dap_ledger_token_emission_load(l_ledger, a_datum->data, a_datum->header.data_size, a_datum_hash); - + return 0; case DAP_CHAIN_DATUM_TX: { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data; size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); @@ -3365,4 +3359,8 @@ void dap_chain_net_set_net_decree(dap_chain_net_t *a_net, dap_chain_net_decree_t decree_table_t **dap_chain_net_get_decrees(dap_chain_net_t *a_net) { return a_net ? &(PVT(a_net)->decrees) : NULL; -} \ No newline at end of file +} + +anchor_table_t **dap_chain_net_get_anchors(dap_chain_net_t *a_net) { + return a_net ? &(PVT(a_net)->anchors) : NULL; +} diff --git a/modules/net/dap_chain_net_anchor.c b/modules/net/dap_chain_net_anchor.c index 2fab9b011989ffbf390aae33f44aa85aee285014..55a23ec8095c70c43c35fdec3be9a28181a346b0 100644 --- a/modules/net/dap_chain_net_anchor.c +++ b/modules/net/dap_chain_net_anchor.c @@ -40,6 +40,12 @@ #define LOG_TAG "chain_net_anchor" +typedef struct anchor_table{ + dap_hash_fast_t anchor_hash; + dap_chain_datum_anchor_t *anchor; + UT_hash_handle hh; +} anchor_table_t; + // private function prototypes static bool s_verify_pubkeys(dap_sign_t *a_sign, dap_sign_t **a_decree_signs, size_t a_num_of_decree_sign); static inline dap_sign_t *s_concate_all_signs_in_array(dap_sign_t *a_in_signs, size_t a_signs_size, size_t *a_sings_count, size_t *a_signs_arr_size); @@ -134,7 +140,7 @@ int dap_chain_net_anchor_verify(dap_chain_net_t *a_net, dap_chain_datum_anchor_t return s_anchor_verify(a_net, a_anchor, a_data_size, false); } -int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain) +int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain, dap_hash_fast_t *a_anchor_hash) { int ret_val = 0; @@ -165,90 +171,106 @@ int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t * return -109; } - if ((ret_val = dap_chain_net_decree_apply(&l_hash, NULL, a_chain)) != 0) + if ((ret_val = dap_chain_net_decree_apply(&l_hash, NULL, a_chain)) != 0){ log_it(L_WARNING, "Decree applying failed"); + return ret_val; + } + + + anchor_table_t **l_anchors = dap_chain_net_get_anchors(l_net); + anchor_table_t *l_new_anchor = DAP_NEW_Z(anchor_table_t); + l_new_anchor->anchor_hash = *a_anchor_hash; + l_new_anchor->anchor = a_anchor; + HASH_ADD(hh, *l_anchors, anchor_hash, sizeof(l_new_anchor->anchor_hash), l_new_anchor); return ret_val; } -dap_chain_datum_anchor_t * s_find_previous_anchor(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain) +dap_chain_datum_anchor_t * s_find_previous_anchor(dap_hash_fast_t *a_old_anchor_hash, dap_chain_net_t *a_net) { - if (!a_anchor || !a_chain){ + if (!a_old_anchor_hash || !a_net){ log_it(L_ERROR,"Params are NULL"); return NULL; } - dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); + + dap_chain_net_t *l_net = a_net; dap_chain_datum_anchor_t * l_ret_anchor = NULL; + dap_chain_datum_anchor_t *l_old_anchor = NULL; + + anchor_table_t **l_anchors_ptr = dap_chain_net_get_anchors(l_net); + anchor_table_t *l_anchor = NULL; + HASH_FIND(hh, *l_anchors_ptr, a_old_anchor_hash, sizeof(*a_old_anchor_hash), l_anchor); + if (!l_old_anchor){ + log_it(L_WARNING,"Can not find anchor"); + return NULL; + } + + l_old_anchor = l_anchor->anchor; dap_hash_fast_t l_old_decrere_hash = {}; - if (dap_chain_datum_anchor_get_hash_from_data(a_anchor, &l_old_decrere_hash) != 0) + if (dap_chain_datum_anchor_get_hash_from_data(l_old_anchor, &l_old_decrere_hash) != 0) return NULL; dap_chain_datum_decree_t *l_old_decree = dap_chain_net_decree_get_by_hash(l_net, &l_old_decrere_hash, NULL); uint16_t l_old_decree_type = l_old_decree->header.type; uint16_t l_old_decree_subtype = l_old_decree->header.sub_type; - dap_chain_cell_t *l_cell = a_chain->cells; - size_t l_atom_size = 0; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, 0); - dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_LAST, &l_atom_size); - while(l_atom && l_atom_size){ + anchor_table_t *l_anchors = HASH_LAST(*l_anchors_ptr); + for(; l_anchors; l_anchors = l_anchors->hh.prev){ 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); - dap_chain_datum_t *l_datum, *l_datum2; - for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - if ( ! (l_datum = l_datums[l_datum_n]) ) - continue; - - if (l_datum->header.type_id != DAP_CHAIN_DATUM_ANCHOR || a_anchor == (dap_chain_datum_anchor_t *)l_datum->data) - continue; - dap_chain_datum_anchor_t *l_curr_anchor = (dap_chain_datum_anchor_t *)l_datum->data; - dap_hash_fast_t l_hash = {}; - if (dap_chain_datum_anchor_get_hash_from_data(l_curr_anchor, &l_hash) != 0) - continue; + dap_chain_datum_anchor_t *l_curr_anchor = l_anchors->anchor; + dap_hash_fast_t l_hash = {}; + if (dap_chain_datum_anchor_get_hash_from_data(l_curr_anchor, &l_hash) != 0) + continue; + + bool l_is_applied = false; + dap_chain_datum_decree_t *l_decree = dap_chain_net_decree_get_by_hash(l_net, &l_hash, &l_is_applied); + if (!l_decree) + continue; + + if (l_decree->header.type == l_old_decree_type && l_old_decree_type == DAP_CHAIN_DATUM_DECREE_TYPE_COMMON && + l_old_decree_subtype == DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE && + l_decree->header.sub_type == DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_APPROVE){ - bool l_is_applied = false; - dap_chain_datum_decree_t *l_decree = dap_chain_net_decree_get_by_hash(l_net, &l_hash, &l_is_applied); - if (!l_decree) + dap_chain_addr_t l_addr_old, l_addr_new = {}; + if (dap_chain_datum_decree_get_stake_signing_addr(l_old_decree, &l_addr_old)){ continue; + } - if (l_decree->header.type == l_old_decree_type && l_old_decree_type == DAP_CHAIN_DATUM_DECREE_TYPE_COMMON && - l_old_decree_subtype == DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE && - l_decree->header.sub_type == DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_APPROVE){ - - dap_chain_addr_t l_addr_old, l_addr_new = {}; - if (dap_chain_datum_decree_get_stake_signing_addr(l_old_decree, &l_addr_old)){ - continue; - } - - if (dap_chain_datum_decree_get_stake_signing_addr(l_decree, &l_addr_new)){ - continue; - } + if (dap_chain_datum_decree_get_stake_signing_addr(l_decree, &l_addr_new)){ + continue; + } - if(dap_chain_addr_compare(&l_addr_old, &l_addr_new)){ - l_ret_anchor = l_curr_anchor; - dap_chain_net_decree_reset_applied(l_net, &l_hash); - break; - } - } else if (l_decree->header.type == l_old_decree_type && l_decree->header.sub_type == l_old_decree_subtype){ - // check addr if l_decree type is stake approve + if(dap_chain_addr_compare(&l_addr_old, &l_addr_new)){ l_ret_anchor = l_curr_anchor; dap_chain_net_decree_reset_applied(l_net, &l_hash); - break; + break; } + } else if (l_decree->header.type == l_old_decree_type && l_decree->header.sub_type == l_old_decree_subtype){ + // check addr if l_decree type is stake approve + l_ret_anchor = l_curr_anchor; + dap_chain_net_decree_reset_applied(l_net, &l_hash); + break; } - DAP_DEL_Z(l_datums); if (l_ret_anchor) break; - // go to previous atom - l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_PREV, &l_atom_size); } - a_chain->callback_atom_iter_delete(l_atom_iter); return l_ret_anchor; } -int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain) +void s_delete_anchor(dap_chain_net_t *a_net, dap_hash_fast_t *a_anchor_hash) +{ + anchor_table_t **l_anchors_ptr = dap_chain_net_get_anchors(a_net); + anchor_table_t *l_anchor = NULL; + HASH_FIND(hh, *l_anchors_ptr, a_anchor_hash, sizeof(*a_anchor_hash), l_anchor); + if(l_anchor){ + HASH_DEL(*l_anchors_ptr, l_anchor); + DAP_DEL_Z(l_anchor); + } +} + +int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain, dap_hash_fast_t *a_anchor_hash) { int ret_val = 0; @@ -287,7 +309,8 @@ int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t { case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_FEE:{ dap_chain_net_decree_reset_applied(l_net, &l_hash); - dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor, a_chain); + dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor_hash, l_net); + s_delete_anchor(l_net, a_anchor_hash); if (l_new_anchor){// if previous anchor is founded apply it dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_new_anchor, &l_hash)) != 0){ @@ -317,12 +340,14 @@ int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t } dap_chain_net_srv_stake_key_invalidate(&l_signing_addr); dap_chain_net_decree_reset_applied(l_net, &l_hash); + s_delete_anchor(l_net, a_anchor_hash); } break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_INVALIDATE:{ // Find previous anchor with this stake approve and apply it dap_chain_net_decree_reset_applied(l_net, &l_hash); - dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor, a_chain); + dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor_hash, l_net); + s_delete_anchor(l_net, a_anchor_hash); if (l_new_anchor){// if previous anchor is founded apply it dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_new_anchor, &l_hash)) != 0){ @@ -338,7 +363,8 @@ int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_MIN_VALUE:{ dap_chain_net_decree_reset_applied(l_net, &l_hash); - dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor, a_chain); + dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor_hash, l_net); + s_delete_anchor(l_net, a_anchor_hash); if (l_new_anchor){// if previous anchor is founded apply it dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_new_anchor, &l_hash)) != 0){ @@ -357,7 +383,8 @@ int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_STAKE_MIN_VALIDATORS_COUNT:{ dap_chain_net_decree_reset_applied(l_net, &l_hash); - dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor, a_chain); + dap_chain_datum_anchor_t * l_new_anchor = s_find_previous_anchor(a_anchor_hash, l_net); + s_delete_anchor(l_net, a_anchor_hash); if (l_new_anchor){// if previous anchor is founded apply it dap_chain_hash_fast_t l_hash = {0}; if ((ret_val = dap_chain_datum_anchor_get_hash_from_data(l_new_anchor, &l_hash)) != 0){ @@ -378,6 +405,7 @@ int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t // find previous anchor with rewarrd and apply it dap_chain_net_decree_reset_applied(l_net, &l_hash); dap_chain_net_remove_last_reward(dap_chain_net_by_id(a_chain->net_id)); + s_delete_anchor(l_net, a_anchor_hash); } break; case DAP_CHAIN_DATUM_DECREE_COMMON_SUBTYPE_OWNERS: diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index cbe144ca641039acf49446974037904599bc0397..17f20611bb712c8627109d4dbb9bd4fbba5aafc7 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -153,7 +153,7 @@ static void s_balancer_link_prepare_error(dap_balancer_link_request_t *a_request struct json_object *l_json = s_balancer_states_json_collect(a_request->net, a_host_addr, a_host_port); char l_err_str[512] = { '\0' }; snprintf(l_err_str, sizeof(l_err_str) - , "Link from balancer %s:%u in net %s can't be prepared, errno %d" + , "Links from balancer %s:%u in net %s can't be prepared, connection errno %d" , a_host_addr, a_host_port, a_request->net->pub.name, a_errno); log_it(L_WARNING, "%s", l_err_str); json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str)); @@ -172,7 +172,7 @@ void s_http_balancer_link_prepare_success(void *a_response, { dap_balancer_link_request_t *l_balancer_request = (dap_balancer_link_request_t *)a_arg; if (a_response_code != 200) { - log_it(L_ERROR, "The server responded with code %d. It is not possible to install the link.", a_response_code); + log_it(L_ERROR, "The server responded with code %d. It is not possible to install the link to %s:%u in net %s", a_response_code, l_balancer_request->host_addr, l_balancer_request->host_port, l_balancer_request->net->pub.name); s_balancer_link_prepare_error(l_balancer_request, l_balancer_request->host_addr, l_balancer_request->host_port, a_response_code); l_balancer_request->request_info->request_time = dap_time_now(); DAP_DELETE(l_balancer_request); @@ -185,6 +185,7 @@ void s_http_balancer_link_prepare_success(void *a_response, log_it(L_ERROR, "Invalid balancer response size %zu (expected %zu) in net %s from %s:%u", a_response_size, l_response_size_need, l_balancer_request->net->pub.name, l_balancer_request->host_addr, l_balancer_request->host_port); l_balancer_request->request_info->request_time = dap_time_now(); } else { + log_it(L_INFO, "Valid balancer response from %s:%u in net %s with %"DAP_UINT64_FORMAT_U" links", l_balancer_request->host_addr, l_balancer_request->host_port, l_balancer_request->net->pub.name, l_link_full_node_list->count_node); s_balancer_link_prepare_success(l_balancer_request->net, l_link_full_node_list, l_balancer_request->host_addr, l_balancer_request->host_port); l_balancer_request->request_info->request_time = 0; } @@ -220,7 +221,7 @@ static dap_chain_net_links_t *s_get_node_addrs(dap_chain_net_t *a_net, uint16_t // preparing dap_list_t *l_nodes_list = dap_chain_node_get_states_list_sort(a_net, a_ignored ? (dap_chain_node_addr_t *)a_ignored->nodes_info : (dap_chain_node_addr_t *)NULL, a_ignored ? a_ignored->count_node : 0); if (!l_nodes_list) { - log_it(L_DEBUG, "There isn't any nodes to list prepare in net %s", a_net->pub.name); + log_it(L_DEBUG, "There isn't any nodes to %s list prepare in net %s", a_external_call ? "external" : "local", a_net->pub.name); if (!a_external_call) return NULL; } @@ -234,7 +235,7 @@ static dap_chain_net_links_t *s_get_node_addrs(dap_chain_net_t *a_net, uint16_t // memory alloc dap_chain_net_links_t *l_ret = DAP_NEW_Z_SIZE(dap_chain_net_links_t, sizeof(dap_chain_net_links_t) + l_nodes_count * sizeof(dap_link_info_t)); if (!l_ret) { - log_it(L_ERROR, "%s", g_error_memory_alloc); + log_it(L_ERROR, "%s", c_error_memory_alloc); dap_list_free_full(l_nodes_list, NULL); return NULL; } @@ -271,7 +272,7 @@ static dap_chain_net_links_t *s_get_node_addrs_old(dap_chain_net_t *a_net, uint1 // memory alloc dap_chain_net_links_t *l_ret = DAP_NEW_Z_SIZE(dap_chain_net_links_t, sizeof(dap_chain_net_links_t) + l_nodes_count * sizeof(dap_chain_node_info_old_t)); if (!l_ret) { - log_it(L_ERROR, "%s", g_error_memory_alloc); + log_it(L_ERROR, "%s", c_error_memory_alloc); dap_list_free_full(l_nodes_list, NULL); return NULL; } @@ -357,7 +358,7 @@ int dap_chain_net_balancer_handshake(dap_chain_node_info_t *a_node_info, dap_cha */ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg) { - log_it(L_DEBUG,"Proc enc http request"); + log_it(L_DEBUG,"Proc enc http request from %s", a_http_simple->es_hostaddr); http_status_code_t *l_return_code = (http_status_code_t *)a_arg; if (strcmp(a_http_simple->http_client->url_path, DAP_BALANCER_URI_HASH)) { @@ -467,6 +468,7 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad *l_links = s_get_node_addrs(a_net, l_required_links_count, l_ignored_addrs, false); // links from local GDB if (l_links) { + log_it(L_INFO, "%"DAP_UINT64_FORMAT_U" links successful prepared from global-db in net %s", l_links->count_node, a_net->pub.name); s_balancer_link_prepare_success(a_net, l_links, NULL, 0); if (l_links->count_node >= l_required_links_count) { DAP_DEL_MULTY(l_ignored_addrs, l_links); diff --git a/modules/net/dap_chain_net_decree.c b/modules/net/dap_chain_net_decree.c index 9433256eb788451facee26a448f68c9b9409c27d..46d6c126472ff3e5c110872b348a772d2e4116d5 100644 --- a/modules/net/dap_chain_net_decree.c +++ b/modules/net/dap_chain_net_decree.c @@ -245,7 +245,6 @@ int dap_chain_net_decree_apply(dap_hash_fast_t *a_decree_hash, dap_chain_datum_d decree_table_t **l_decrees = dap_chain_net_get_decrees(l_net), *l_new_decree; HASH_FIND(hh, *l_decrees, a_decree_hash, sizeof(dap_hash_fast_t), l_new_decree); - if (!l_new_decree) { l_new_decree = DAP_NEW_Z(decree_table_t); if (!l_new_decree) { diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c index 87257742cb90bea3253f193b4ae69c3fcb56e43d..f24751925081e83a881083e5b9decd6e1055ceba 100644 --- a/modules/net/dap_chain_net_node_list.c +++ b/modules/net/dap_chain_net_node_list.c @@ -259,7 +259,7 @@ int dap_chain_net_node_list_request(dap_chain_net_t *a_net, uint16_t a_port, boo struct node_link_request *l_link_node_request = s_node_list_request_init(); if (!l_link_node_request) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -4; }; diff --git a/modules/net/dap_chain_net_tx.c b/modules/net/dap_chain_net_tx.c index 3f9b24196eeed49421984934a17016ea94441a53..f6222d67745a4e8d3f2dff15e670503ef343798e 100644 --- a/modules/net/dap_chain_net_tx.c +++ b/modules/net/dap_chain_net_tx.c @@ -78,7 +78,7 @@ static void s_tx_cond_all_with_spends_by_srv_uid_callback(dap_chain_net_t* a_net if (l_tx_prev_out_item){ // we found previous out_cond with target srv_uid dap_chain_datum_tx_spends_item_t *l_item_in = DAP_NEW_Z(dap_chain_datum_tx_spends_item_t); if (!l_item_in) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return ; } size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); @@ -99,7 +99,7 @@ static void s_tx_cond_all_with_spends_by_srv_uid_callback(dap_chain_net_t* a_net if(l_tx_out_cond->header.srv_uid.uint64 == l_arg->srv_uid.uint64){ dap_chain_datum_tx_spends_item_t * l_item = DAP_NEW_Z(dap_chain_datum_tx_spends_item_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return ; } size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); @@ -132,14 +132,14 @@ dap_chain_datum_tx_spends_items_t * dap_chain_net_get_tx_cond_all_with_spends_by { cond_all_with_spends_by_srv_uid_arg_t *l_ret = DAP_NEW_Z(cond_all_with_spends_by_srv_uid_arg_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->ret = DAP_NEW_Z(dap_chain_datum_tx_spends_items_t); if (!l_ret->ret) { DAP_DEL_Z(l_ret); - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->srv_uid = a_srv_uid; @@ -294,7 +294,7 @@ static void s_get_tx_cond_chain_callback(dap_chain_net_t* a_net, dap_chain_datum }else if(a_tx){ dap_hash_fast_t * l_tx_hash = a_tx_hash; if (!l_tx_hash) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } if (dap_hash_fast_compare(l_tx_hash,l_args->tx_begin_hash)) { @@ -327,7 +327,7 @@ dap_list_t * dap_chain_net_get_tx_cond_chain(dap_chain_net_t * a_net, dap_hash_f { struct get_tx_cond_all_from_tx * l_args = DAP_NEW_Z(struct get_tx_cond_all_from_tx); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_args->tx_begin_hash = a_tx_hash; @@ -448,7 +448,7 @@ dap_list_t * dap_chain_net_get_tx_cond_all_for_addr(dap_chain_net_t * a_net, dap { struct get_tx_cond_all_for_addr * l_args = DAP_NEW_Z(struct get_tx_cond_all_for_addr); if (!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_args->addr = a_addr; diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index a0b601f7eceb6a1957734e228270d7cb182581e5..3ab907653d4e1793692bf5e5ada09723fb71a6b1 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -271,6 +271,7 @@ bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_datum_t *a_d if (l_verify_datum != 0 && l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS && l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION && + l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NOT_ENOUGH_SIGNS && l_verify_datum != DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE) return true; if (!l_verify_datum @@ -289,10 +290,38 @@ void dap_chain_node_mempool_process_all(dap_chain_t *a_chain, bool a_force) dap_chain_net_t *l_net = dap_chain_net_by_id(a_chain->net_id); if (!a_force && !l_net->pub.mempool_autoproc) return; +#ifdef DAP_TPS_TEST + FILE *l_file = fopen("/opt/cellframe-node/share/ca/mempool_start.txt", "r"); + if (l_file) { + fclose(l_file); + l_file = fopen("/opt/cellframe-node/share/ca/mempool_finish.txt", "r"); + if(!l_file) { + log_it(L_TPS, "Wait mempool"); + return; + } + log_it(L_TPS, "Mempool ready"); + fclose(l_file); + l_file = fopen("/opt/cellframe-node/share/ca/tps_start.txt", "r"); + if (!l_file) { + l_file = fopen("/opt/cellframe-node/share/ca/tps_start.txt", "w"); + char l_from_str[50]; + const char c_time_fmt[]="%Y-%m-%d_%H:%M:%S"; + struct tm l_from_tm = {}; + time_t l_ts_now = time(NULL); + localtime_r(&l_ts_now, &l_from_tm); + strftime(l_from_str, sizeof(l_from_str), c_time_fmt, &l_from_tm); + fputs(l_from_str, l_file); + } + fclose(l_file); + } +#endif char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); size_t l_objs_size = 0; dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_mempool, &l_objs_size); if (l_objs_size) { +#ifdef DAP_TPS_TEST + log_it(L_TPS, "Get %zu datums from mempool", l_objs_size); +#endif for (size_t i = 0; i < l_objs_size; i++) { if (!l_objs[i].value_len) continue; @@ -410,12 +439,6 @@ dap_list_t *dap_chain_node_get_states_list_sort(dap_chain_net_t *a_net, dap_chai log_it(L_ERROR, "Invalid record, key %s", l_objs[i].key); continue; } - dap_nanotime_t l_timestamp = 0; - dap_chain_node_net_states_info_t *l_store_obj = (dap_chain_node_net_states_info_t *)dap_global_db_get_sync(l_gdb_group, l_objs[i].key, NULL, NULL, &l_timestamp); - if (!l_store_obj) { - log_it(L_ERROR, "Can't find state about %s node", l_objs[i].key); - continue; - } bool l_ignored = false; for(size_t j = 0; !l_ignored && j < a_ignored_count; ++j) { l_ignored = a_ignored[j].uint64 == ((dap_chain_node_info_t*)(l_objs + i)->value)->address.uint64; @@ -426,17 +449,22 @@ dap_list_t *dap_chain_node_get_states_list_sort(dap_chain_net_t *a_net, dap_chai } dap_chain_node_states_info_t *l_item = DAP_NEW_Z(dap_chain_node_states_info_t); if(!l_item) { - log_it(L_ERROR, "%s", g_error_memory_alloc); + log_it(L_ERROR, "%s", c_error_memory_alloc); break; } + dap_nanotime_t l_state_timestamp = 0; + dap_chain_node_net_states_info_t *l_state_store_obj = (dap_chain_node_net_states_info_t *)dap_global_db_get_sync(l_gdb_group, l_objs[i].key, NULL, NULL, &l_state_timestamp); + if (!l_state_store_obj) { + log_it(L_WARNING, "Can't find state about %s node, apply low priority", l_objs[i].key); + } l_item->link_info.node_addr.uint64 = ((dap_chain_node_info_t*)(l_objs + i)->value)->address.uint64; l_item->link_info.uplink_port = ((dap_chain_node_info_t*)(l_objs + i)->value)->ext_port; dap_strncpy(l_item->link_info.uplink_addr, ((dap_chain_node_info_t*)(l_objs + i)->value)->ext_host, sizeof(l_item->link_info.uplink_addr) - 1); - l_item->atoms_count = l_store_obj->atoms_count; - l_item->downlinks_count = l_store_obj->downlinks_count; - l_item->timestamp = l_timestamp; + l_item->atoms_count = l_state_store_obj ? l_state_store_obj->atoms_count : 0; + l_item->downlinks_count = l_state_store_obj ? l_state_store_obj->downlinks_count : (uint32_t)(-1); + l_item->timestamp = l_state_timestamp; l_ret = dap_list_insert_sorted(l_ret, (void *)l_item, s_node_states_info_cmp); - DAP_DELETE(l_store_obj); + DAP_DELETE(l_state_store_obj); } DAP_DELETE(l_gdb_group); dap_global_db_objs_delete(l_objs, l_node_count); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 90258d37942d8303d576edf49185ff722767eabe..eee2e5e2a920b000e05260910540251213a87370 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -58,35 +58,21 @@ static bool s_debug_cli = false; */ int dap_chain_node_cli_init(dap_config_t * g_config) { - s_debug_cli = dap_config_get_item_bool_default(g_config,"conserver","debug_cli",false); - - bool l_conserver_enabled = dap_config_get_item_bool_default( g_config, "conserver", "enabled", true ); - - if ( !l_conserver_enabled ) { - - log_it( L_WARNING, "Console Server is dissabled." ); - return 0; - } - - uint16_t l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port_tcp",0); // For backward compatibility - if(l_listen_port == 0) - l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port",0); - - dap_cli_server_init( s_debug_cli, - l_listen_port ? dap_config_get_item_str(g_config, "conserver", "listen_address") - : dap_config_get_item_str( g_config, "conserver", "listen_unix_socket_path"), - l_listen_port, dap_config_get_item_str( g_config, "conserver", "listen_unix_socket_permissions") - ); + if ( !dap_config_get_item_bool_default(g_config, "cli-server", "enabled", true) ) + return log_it( L_WARNING, "CLI server is disabled" ), 0; + s_debug_cli = dap_config_get_item_bool_default(g_config, "cli-server", "debug-cli", false); + if ( dap_cli_server_init(s_debug_cli, "cli-server") ) + return log_it(L_ERROR, "Can't init CLI server!"), -1; dap_cli_server_cmd_add("global_db", com_global_db, "Work with global database", - "global_db cells add -cell <cell id> \n" + "global_db cells add -cell <cell_id> \n" "global_db flush \n\n" "global_db write -group <group_name> -key <key_name> -value <value>\n" "global_db read -group <group_name> -key <key_name>\n" "global_db delete -group <group_name> -key <key_name>\n" "global_db group_list\n" "global_db drop_table -group <group_name>\n" - "global_db get_keys -group <group name>" + "global_db get_keys -group <group_name>" // "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" ); @@ -95,7 +81,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "mempool check -cert <priv_cert_name> -net <net_name> {-file <filename> | -hash <hash>} [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n" ); dap_cli_server_cmd_add("node", com_node, "Work with node", - "node add -net <net_name> [ -port <port> ]\n\n" + "node add -net <net_name> [-port <port>]\n\n" "node del -net <net_name> {-addr <node_address> | -alias <node_alias>}\n\n" "node link {add | del} -net <net_name> {-addr <node_address> | -alias <node_alias>} -link <node_address>\n\n" "node alias -addr <node_address> -alias <node_alias>\n\n" @@ -103,10 +89,10 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "node handshake -net <net_name> {-addr <node_address> | -alias <node_alias>}\n" "node connections -net <net_name>\n" "node balancer -net <net_name>\n" - "node dump [ -net <net_name> | -addr <node_address> ]\n\n" - "node list -net <net_name> [ -addr <node_address> | -alias <node_alias>] [-full]\n\n" - "node ban -net <net_name> -chain <chain_name> -certs <certs_name> [ -addr <node_address> | -ip <ip v4 or v6 address> ]\n" - "node unban -net <net_name> -chain <chain_name> -certs <certs_name> [ -addr <node_address> | -ip <ip v4 or v6 address> ]\n" + "node dump [-net <net_name> | -addr <node_address>]\n\n" + "node list -net <net_name> [-addr <node_address> | -alias <node_alias>] [-full]\n\n" + "node ban -net <net_name> -chain <chain_name> -certs <certs_name> [-addr <node_address> | -ip <ip_v4_or_v6_address>]\n" + "node unban -net <net_name> -chain <chain_name> -certs <certs_name> [-addr <node_address> | -ip <ip_v4_or_v6_address>]\n" "node banlist\n\n"); #ifndef DAP_OS_ANDROID dap_cli_server_cmd_add ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts", @@ -191,21 +177,21 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Token commands dap_cli_server_cmd_add ("token_decl", com_token_decl, "Token declaration", "Simple token declaration:\n" - "token_decl -net <net_name> [-chain <chain_name>] -token <token_ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n" - "\t Declare new simple token for <netname>:<chain_name> with ticker <token_ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n" + "token_decl -net <net_name> [-chain <chain_name>] -token <token_ticker> -total_supply <total_supply> -signs_total <sign_total> -signs_emission <signs_for_emission> -certs <certs_list>\n" + "\t Declare new simple token for <net_name>:<chain_name> with ticker <token_ticker>, maximum emission <total_supply> and <signs_for_emission> from <signs_total> signatures on valid emission\n" "\nExtended private token declaration\n" - "token_decl -net <net_name> [-chain <chain_name>] -token <token_ticker> -type private -total_supply <total supply> " - "-decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list> -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" - "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" - "\t Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" - "\t and custom parameters list <Param 1>, <Param 2>...<Param N>.\n" + "token_decl -net <net_name> [-chain <chain_name>] -token <token_ticker> -type private -total_supply <total_supply> " + "-decimals <18> -signs_total <sign_total> -signs_emission <signs_for_emission> -certs <certs_list> -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" + "\t [-<Param_name_1> <Param_Value_1>] [-Param_name_2> <Param_Value_2>] ...[-<Param_Name_N> <Param_Value_N>]\n" + "\t Declare new token for <net_name>:<chain_name> with ticker <token_ticker>, flags <Flag_1>,<Flag_2>...<Flag_N>\n" + "\t and custom parameters list <Param_1>, <Param_2>...<Param_N>.\n" "\nExtended CF20 token declaration\n" "token_decl -net <net_name> [-chain <chain_name>] -token <token_ticker> -type CF20 " - "-total_supply <total supply/if 0 = endless> -decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n" - "\t -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" - "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" - "\t Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" - "\t and custom parameters list <Param 1>, <Param 2>...<Param N>.\n" + "-total_supply <total_supply/if_0 =_endless> -decimals <18> -signs_total <sign_total> -signs_emission <signs_for_emission> -certs <certs_list>\n" + "\t -flags [<Flag_1>][,<Flag_2>]...[,<Flag_N>]...\n" + "\t [-<Param_name_1> <Param_Value_1>] [-Param_name_2> <Param_Value_2>] ...[-<Param_Name_N> <Param_Value_N>]\n" + "\t Declare new token for <net_name>:<chain_name> with ticker <token_ticker>, flags <Flag_1>,<Flag_2>...<Flag_N>\n" + "\t and custom parameters list <Param_1>, <Param_2>...<Param_N>.\n" "\n" "==Flags==" "\t ALL_BLOCKED:\t Blocked all permissions, usefull add it first and then add allows what you want to allow\n" @@ -244,8 +230,8 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Token commands dap_cli_server_cmd_add ("token_decl_sign", com_token_decl_sign, "Token declaration add sign", - "token_decl_sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs list>\n" - "\t Sign existent <datum hash> in mempool with <certs list>\n" + "token_decl_sign -net <net_name> [-chain <chain_name>] -datum <datum_hash> -certs <certs_list>\n" + "\t Sign existent <datum_hash> in mempool with <certs_list>\n" ); dap_cli_server_cmd_add ("token_emit", com_token_emit, "Token emission", @@ -257,14 +243,14 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\tList mempool (entries or transaction) for (selected chain network or wallet)\n" "mempool check -net <net_name> [-chain <chain_name>] -datum <datum_hash>\n" "\tCheck mempool entrie for presence in selected chain network\n" - "mempool proc -net <net_name> -chain <chain_name> -datum <datum_hash>\n" + "mempool proc -net <net_name> [-chain <chain_name>] -datum <datum_hash>\n" "\tProc mempool entrie with specified hash for selected chain network\n" "\tCAUTION!!! This command will process transaction with any comission! Parameter minimum_comission will not be taken into account!\n" "mempool proc_all -net <net_name> -chain <chain_name>\n" "\tProc mempool all entries for selected chain network\n" - "mempool delete -net <net_name> -chain <chain_name> -datum <datum_hash>\n" + "mempool delete -net <net_name> [-chain <chain_name>] -datum <datum_hash>\n" "\tDelete datum with hash <datum hash> for selected chain network\n" - "mempool dump -net <net_name> -chain <chain_name> -datum <datum_hash>\n" + "mempool dump -net <net_name> [-chain <chain_name>] -datum <datum_hash>\n" "\tOutput information about datum in mempool\n" "mempool add_ca -net <net_name> [-chain <chain_name>] -ca_name <pub_cert_name>\n" "\tAdd pubic certificate into the mempool to prepare its way to chains\n" @@ -333,7 +319,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) //Import GDB from JSON dap_cli_server_cmd_add("gdb_import", cmd_gdb_import, "Import gdb from JSON", - "gdb_import filename <filename without extension>"); + "gdb_import filename <filename_without_extension>"); dap_cli_server_cmd_add ("remove", cmd_remove, "Delete chain files or global database", "remove -gdb\n" diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index e025837b336ccda09f9717ddb63163729e16122f..c87bad5eb43f5f85fcab2b5f98526f79701d25a2 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -109,6 +109,18 @@ int _cmd_mempool_add_ca(dap_chain_net_t *a_net, dap_chain_t *a_chain, dap_cert_t *a_cert, void **a_str_reply); +dap_chain_t *s_get_chain_with_datum(dap_chain_net_t *a_net, const char *a_datum_hash) { + dap_chain_t *l_chain = NULL; + DL_FOREACH(a_net->pub.chains, l_chain) { + char *l_gdb_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); + bool is_hash = dap_global_db_driver_is(l_gdb_mempool, a_datum_hash); + DAP_DELETE(l_gdb_mempool); + if (is_hash) + return l_chain; + } + return NULL; +} + /** * @brief node_info_read_and_reply * Read node from base @@ -958,10 +970,12 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply) switch (cmd_num) { case CMD_ADD: { + int l_res = -10; if (l_addr_str && dap_chain_net_is_my_node_authorized(l_net)) { // We're in authorized list, add directly uint16_t l_port = 0; - if (dap_net_parse_hostname(l_hostname, l_node_info->ext_host, &l_port)) { + struct sockaddr_storage l_verifier = { }; + if ( 0 > dap_net_parse_config_address(l_hostname, l_node_info->ext_host, &l_port, &l_verifier, NULL) ) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't parse host string %s", l_hostname); return -6; } @@ -974,27 +988,31 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply) } } l_node_info->ext_host_len = dap_strlen(l_node_info->ext_host); - int l_res = dap_chain_node_info_save(l_net, l_node_info); + l_res = dap_chain_node_info_save(l_net, l_node_info); if (l_res) dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't add node %s, error %d", l_addr_str, l_res); else dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully added node %s", l_addr_str); - return l_res; - } - // Synchronous request, wait for reply - int l_res = dap_chain_net_node_list_request(l_net, - l_port_str ? strtoul(l_port_str, NULL, 10) : dap_chain_net_get_my_node_info(l_net)->ext_port, - true, 'a'); - switch (l_res) - { - case 1: dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully added"); return 0; - case 2: dap_cli_server_cmd_set_reply_text(a_str_reply, "No server"); break; - case 3: dap_cli_server_cmd_set_reply_text(a_str_reply, "Didn't add your address node to node list"); break; - case 4: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't calculate hash for your addr"); break; - case 5: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't do handshake for your node"); break; - case 6: dap_cli_server_cmd_set_reply_text(a_str_reply, "The node already exists"); break; - case 7: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't process node list HTTP request"); break; - default:dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't process request, error %d", l_res); break; + } else if (l_hostname) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "You have no access rights"); + } else if (l_addr_str) { + // Synchronous request, wait for reply + l_res = dap_chain_net_node_list_request(l_net, + l_port_str ? strtoul(l_port_str, NULL, 10) : dap_chain_net_get_my_node_info(l_net)->ext_port, + true, 'a'); + switch (l_res) + { + case 1: dap_cli_server_cmd_set_reply_text(a_str_reply, "Successfully added"); return 0; + case 2: dap_cli_server_cmd_set_reply_text(a_str_reply, "No server"); break; + case 3: dap_cli_server_cmd_set_reply_text(a_str_reply, "Didn't add your address node to node list"); break; + case 4: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't calculate hash for your addr"); break; + case 5: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't do handshake for your node"); break; + case 6: dap_cli_server_cmd_set_reply_text(a_str_reply, "The node already exists"); break; + case 7: dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't process node list HTTP request"); break; + default:dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't process request, error %d", l_res); break; + } + } else { + dap_cli_server_cmd_set_reply_text(a_str_reply, "node add requires parameter '-addr'"); } return l_res; } @@ -2121,7 +2139,8 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_sign_types[0] = dap_sign_type_from_str(l_sign_type_str); if (l_sign_types[0].type == SIG_TYPE_NULL){ dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, - "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi\n sig_multi2\n",l_wallet_name); + "'%s' unknown signature type, please use:\n%s", + l_sign_type_str, dap_sign_get_str_recommended_types()); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; } @@ -2137,7 +2156,8 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; } if (!l_sign_count) { dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, - "Unknown signature type, please use:\n sig_picnic\n sig_dil\n sig_falcon\n sig_multi\n sig_multi2\n",l_wallet_name); + "'%s' unknown signature type, please use:\n%s", + l_sign_type_str, dap_sign_get_str_recommended_types()); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR; } @@ -2148,7 +2168,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; // Check unsupported tesla and bliss algorithm for (size_t i = 0; i < l_sign_count; ++i) { - if (l_sign_types[i].type == SIG_TYPE_TESLA || l_sign_types[i].type == SIG_TYPE_BLISS|| l_sign_types[i].type == SIG_TYPE_PICNIC) { + if (dap_sign_type_is_depricated(l_sign_types[i])) { if (l_restore_opt || l_restore_legacy_opt) { dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_WALLET_UNKNOWN_SIGN_ERR, "CAUTION!!! CAUTION!!! CAUTION!!!\nThe Bliss, Tesla and Picnic signatures are deprecated. We recommend you to create a new wallet with another available signature and transfer funds there.\n"); @@ -2170,7 +2190,7 @@ int l_arg_index = 1, l_rc, cmd_num = CMD_NONE; l_seed_size = (l_restore_str_size - 2) / 2; l_seed = DAP_NEW_Z_SIZE(uint8_t, l_seed_size); if(!l_seed) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); json_object_put(json_arr_out); return DAP_CHAIN_NODE_CLI_COM_TX_WALLET_MEMORY_ERR; } @@ -3191,16 +3211,6 @@ static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_h return 1; } if (dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash_str) == 0) { - char *l_msg_str = dap_strdup_printf("Datum %s deleted", a_datum_hash_str); - json_object *l_msg = json_object_new_string(l_msg_str); - DAP_DELETE(l_msg_str); - if (!l_msg) { - dap_json_rpc_allocation_error; - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_data_tmp); - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_array_add(*a_json_reply, l_msg); DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_data_tmp); return 0; @@ -3231,30 +3241,40 @@ int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND_IN_ARGUMENT; } int res = 0; + json_object *l_jobj_ret = json_object_new_object(); + json_object *l_jobj_net = json_object_new_string(a_net->pub.name); + json_object *l_jobj_chain = NULL; + json_object *l_jobj_datum_hash = json_object_new_string(a_datum_hash); if (!a_chain) { - dap_chain_t * l_chain; - DL_FOREACH(a_net->pub.chains, l_chain){ + dap_chain_t * l_chain = s_get_chain_with_datum(a_net, a_datum_hash); + if (l_chain) { res = mempool_delete_for_chain(l_chain, a_datum_hash, a_json_reply); - if (res == 0) { - break; - } + l_jobj_chain = json_object_new_string(l_chain->name); + } else { + res = 1; + l_jobj_chain = json_object_new_string("empty chain parameter"); } } else { res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_reply); + l_jobj_chain = json_object_new_string(a_chain->name); + } + json_object_object_add(l_jobj_ret, "net", l_jobj_net); + json_object_object_add(l_jobj_ret, "chain", l_jobj_chain); + json_object_object_add(l_jobj_ret, "hash", l_jobj_datum_hash); + json_object_object_add(l_jobj_ret, "action", json_object_new_string("delete")); + json_object *l_jobj_ret_code = json_object_new_int(res); + json_object_object_add(l_jobj_ret, "retCode", l_jobj_ret_code); + json_object *l_jobj_status = NULL; + if (!res) { + l_jobj_status = json_object_new_string("deleted"); + } else if (res == 1) { + l_jobj_status = json_object_new_string("datum not found"); + } else { + l_jobj_status = json_object_new_string("datum was found but could not be deleted"); } + json_object_object_add(l_jobj_ret, "status", l_jobj_status); + json_object_array_add(*a_json_reply, l_jobj_ret); if (res) { - char *l_msg_str = dap_strdup_printf("Error! Can't %s datum %s", res == 1 ? "find" : "delete", a_datum_hash); - if (!l_msg_str) { - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object *l_msg = json_object_new_string(l_msg_str); - DAP_DELETE(l_msg_str); - if (!l_msg) { - dap_json_rpc_allocation_error; - return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; - } - json_object_array_add(*a_json_reply, l_msg); return COM_MEMPOOL_DELETE_ERR_DATUM_NOT_FOUND; } return 0; @@ -3457,9 +3477,10 @@ int _cmd_mempool_proc(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * "Need master node role or higher for network %s to process this command", a_net->pub.name); return DAP_COM_MEMPOOL_PROC_LIST_ERROR_NODE_ROLE_NOT_FULL; } + dap_chain_t *l_chain = !a_chain ? s_get_chain_with_datum(a_net, a_datum_hash) : a_chain; int ret = 0; - char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + char *l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); if (!l_gdb_group_mempool){ dap_json_rpc_error_add(DAP_COM_MEMPOOL_PROC_LIST_ERROR_CAN_NOT_GROUP_NAME, "Failed to get mempool group name on network %s", a_net->pub.name); @@ -3654,10 +3675,7 @@ int _cmd_mempool_proc_all(dap_chain_net_t *a_net, dap_chain_t *a_chain, void **a json_object_object_add(l_ret, "warning", l_warn_obj); } -#ifdef DAP_TPS_TEST - dap_chain_ledger_set_tps_start_time(a_net->pub.ledger); -#endif - dap_chain_node_mempool_process_all(a_chain, true); + dap_chain_node_mempool_process_all(a_chain, true); char *l_str_result = dap_strdup_printf("The entire mempool has been processed in %s.%s.", a_net->pub.name, a_chain->name); if (!l_str_result) { @@ -3722,7 +3740,7 @@ int _cmd_mempool_dump(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char * } else { dap_chain_t *l_chain = NULL; DL_FOREACH(a_net->pub.chains, l_chain){ - char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); + char *l_group_mempool = dap_chain_net_get_gdb_group_mempool_new(l_chain); if (!_cmd_mempool_dump_from_group(a_net->pub.id, l_group_mempool, a_datum_hash, a_hash_out_type, a_json_reply)){ DAP_DELETE(l_group_mempool); break; @@ -3854,10 +3872,6 @@ int com_mempool(int a_argc, char **a_argv, void **a_str_reply) ret = _cmd_mempool_proc_all(l_net, l_chain, a_str_reply); } break; case SUBCMD_DELETE: { - if (!l_chain) { - dap_json_rpc_error_add(-2, "The chain parameter was not specified or was specified incorrectly."); - ret = -2; - } if (l_datum_hash) { ret = _cmd_mempool_delete(l_net, l_chain, l_datum_hash, a_str_reply); } else { @@ -4234,7 +4248,7 @@ static int s_parse_additional_token_decl_arg(int a_argc, char ** a_argv, void ** size_t l_tsd_offset = 0; a_params->ext.parsed_tsd = DAP_NEW_SIZE(byte_t, l_tsd_total_size); if(l_tsd_total_size && !a_params->ext.parsed_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } for (dap_list_t *l_iter = dap_list_first(l_tsd_list); l_iter; l_iter = l_iter->next) { @@ -4367,7 +4381,7 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) dap_sdk_cli_params* l_params = DAP_NEW_Z(dap_sdk_cli_params); if (!l_params) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } @@ -4484,7 +4498,7 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_tsd_total_size); if (!l_datum_token) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory in com_token_decl"); DAP_DEL_Z(l_params); return -1; @@ -4575,7 +4589,7 @@ int com_token_decl(int a_argc, char ** a_argv, void **a_str_reply) case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: { // 256 l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)); if (!l_datum_token) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory in com_token_decl"); DAP_DEL_Z(l_params); return -1; @@ -4708,7 +4722,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) dap_sdk_cli_params* l_params = DAP_NEW_Z(dap_sdk_cli_params); if (!l_params) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } @@ -4746,7 +4760,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) // Create new datum token l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t) + l_params->ext.tsd_total_size); if (!l_datum_token) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_datum_token->version = 2; @@ -4783,7 +4797,7 @@ int com_token_update(int a_argc, char ** a_argv, void **a_str_reply) case DAP_CHAIN_DATUM_TOKEN_SUBTYPE_SIMPLE: { // 256 l_datum_token = DAP_NEW_Z_SIZE(dap_chain_datum_token_t, sizeof(dap_chain_datum_token_t)); if (!l_datum_token) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_datum_token->version = 2; @@ -4952,13 +4966,16 @@ int com_token_emit(int a_argc, char **a_argv, void **a_str_reply) } dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-chain_emission", &l_chain_emission_str); - if(l_chain_emission_str) { - if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain - dap_cli_server_cmd_set_reply_text(a_str_reply, - "token_emit requires parameter '-chain_emission' to be valid chain name in chain net %s" - " or set default datum type in chain configuration file", l_net->pub.name); - return -45; - } + if(l_chain_emission_str) + l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str); + else + l_chain_emission = dap_chain_net_get_default_chain_by_chain_type(l_net, CHAIN_TYPE_EMISSION); + + if (l_chain_emission == NULL) { // Can't find such chain + dap_cli_server_cmd_set_reply_text(a_str_reply, + "token_emit requires parameter '-chain_emission' to be valid chain name in chain net %s" + " or set default datum type in chain configuration file", l_net->pub.name); + return -45; } } else { if (l_emission_hash_str) { @@ -5895,7 +5912,7 @@ int com_chain_ca_pub( int a_argc, char ** a_argv, void **a_str_reply) l_cert_new->enc_key->pub_key_data_size = l_cert->enc_key->pub_key_data_size ); if(!l_cert_new->enc_key->pub_key_data) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_cert_new->enc_key); DAP_DELETE(l_cert_new); return -11; @@ -6954,14 +6971,18 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) } dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_from_wallet_name, c_wallets_path, NULL); + json_object *l_jobj_result = json_object_new_object(); if(!l_wallet) { dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_WALLET_DOES_NOT_EXIST, "wallet %s does not exist", l_from_wallet_name); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_WALLET_DOES_NOT_EXIST; } else { - json_object *l_jobj_check_wallet = json_object_new_string(dap_chain_wallet_check_sign(l_wallet)); - json_object_array_add(*reply, l_jobj_check_wallet); + const char *l_wallet_check_str = dap_chain_wallet_check_sign(l_wallet); + if (dap_strcmp(l_wallet_check_str, "") != 0) { + json_object *l_obj_wgn_str = json_object_new_string(l_wallet_check_str); + json_object_object_add(l_jobj_result, "warning", l_obj_wgn_str); + } } const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet, l_net->pub.id); @@ -6970,6 +6991,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) dap_chain_wallet_close(l_wallet); dap_enc_key_delete(l_priv_key); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_SOURCE_ADDRESS_INVALID, "source address is invalid"); + json_object_put(l_jobj_result); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_SOURCE_ADDRESS_INVALID; } @@ -6978,6 +7000,7 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) dap_chain_wallet_close(l_wallet); dap_enc_key_delete(l_priv_key); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS, "The transaction cannot be directed to the same address as the source."); + json_object_put(l_jobj_result); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_EQ_SOURCE_DESTINATION_ADDRESS; } @@ -7000,13 +7023,13 @@ int com_tx_create(int a_argc, char **a_argv, void **reply) " Please, change network name or wallet address", l_addr_to->net_id.uint64, l_allowed_list->str); dap_string_free(l_allowed_list, true); + json_object_put(l_jobj_result); return DAP_CHAIN_NODE_CLI_COM_TX_CREATE_DESTINATION_NETWORK_IS_UNREACHEBLE; } } json_object *l_jobj_transfer_status = NULL; json_object *l_jobj_tx_hash = NULL; - json_object *l_jobj_result = json_object_new_object(); l_priv_key = dap_chain_wallet_get_key(l_wallet, 0); if(l_tx_num){ @@ -7520,7 +7543,7 @@ int cmd_gdb_export(int a_argc, char **a_argv, void **a_str_reply) char *l_value_enc_str = DAP_NEW_Z_SIZE(char, l_out_size); char *l_sign_str = DAP_NEW_Z_SIZE(char, l_sign_size); if(!l_value_enc_str || !l_sign_str) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_sign_str); DAP_DEL_Z(l_value_enc_str); return -1; @@ -7612,7 +7635,7 @@ int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply) size_t l_records_count = json_object_array_length(l_json_records); dap_store_obj_t *l_group_store = DAP_NEW_Z_SIZE(dap_store_obj_t, l_records_count * sizeof(dap_store_obj_t)); if(!l_group_store) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } for (size_t j = 0; j < l_records_count; ++j) { @@ -7625,13 +7648,13 @@ int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply) l_ts = json_object_object_get(l_record, "timestamp"); l_group_store[j].key = dap_strdup(json_object_get_string(l_key)); if(!l_group_store[j].key) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_records_count = j; break; } l_group_store[j].group = dap_strdup(l_group_name); if(!l_group_store[j].group) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_records_count = j; break; } @@ -7642,7 +7665,7 @@ int cmd_gdb_import(int a_argc, char **a_argv, void **a_str_reply) const char *l_value_str = json_object_get_string(l_value); char *l_val = DAP_NEW_Z_SIZE(char, l_group_store[j].value_len); if(!l_val) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); l_records_count = j; break; } @@ -7742,7 +7765,7 @@ int cmd_remove(int a_argc, char **a_argv, void **a_str_reply) for (dap_chain_net_t *it = dap_chain_net_iter_start(); it; it = dap_chain_net_iter_next(it)) { _pvt_net_nodes_list_t *l_gdb_groups = DAP_NEW(_pvt_net_nodes_list_t); if (!l_gdb_groups) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free(l_net_returns); return -1; } @@ -8304,7 +8327,7 @@ static byte_t *s_concat_meta (dap_list_t *a_meta, size_t *a_fullsize) int l_power = 1; byte_t *l_buf = DAP_CALLOC(l_part * l_power++, 1); if (!l_buf) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } size_t l_counter = 0; @@ -8320,7 +8343,7 @@ static byte_t *s_concat_meta (dap_list_t *a_meta, size_t *a_fullsize) l_part_power = l_part * l_power++; l_buf = (byte_t *) DAP_REALLOC(l_buf, l_part_power); if (!l_buf) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } } @@ -8343,7 +8366,7 @@ static uint8_t *s_concat_hash_and_mimetypes (dap_chain_hash_fast_t *a_chain_hash *a_fullsize += sizeof (a_chain_hash->raw) + 1; uint8_t *l_fullbuf = DAP_CALLOC(*a_fullsize, 1); if (!l_fullbuf) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_buf); return NULL; } @@ -8362,7 +8385,7 @@ static char *s_strdup_by_index (const char *a_file, const int a_index) { char *l_buf = DAP_CALLOC(a_index + 1, 1); if (!l_buf) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } strncpy (l_buf, a_file, a_index); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 709cfb6dc13dd96478f16fedb9e0b04bbc588b05..30b35d585fa78d48c264c1e1eb7ef4b81a87d96e 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -98,7 +98,6 @@ bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, const char *a_hash_out_type, dap_chain_hash_fast_t *a_tx_hash) { - dap_time_t l_ts_create = (dap_time_t)a_datum->header.ts_created; char l_tx_hash_str[70]={0}; char l_tmp_buf[DAP_TIME_STR_SIZE]; const char *l_ticker = a_ledger @@ -107,7 +106,7 @@ bool s_dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, if (!l_ticker) return false; const char *l_description = dap_ledger_get_description_by_ticker(a_ledger, l_ticker); - dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_ts_create); + dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, a_datum->header.ts_created); dap_chain_hash_fast_to_str(a_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str)); json_object_object_add(json_obj_out, "Datum_tx_hash", json_object_new_string(l_tx_hash_str)); json_object_object_add(json_obj_out, "TS_Created", json_object_new_string(l_tmp_buf)); @@ -212,10 +211,7 @@ json_object * dap_db_tx_history_to_json(dap_chain_hash_fast_t* a_tx_hash, } char l_time_str[DAP_TIME_STR_SIZE]; - if (l_tx->header.ts_created) { - dap_time_to_str_rfc822(l_time_str, DAP_TIME_STR_SIZE, l_tx->header.ts_created);/* Convert ts to "Sat May 17 01:17:08 2014\n" */ - l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ - } + dap_time_to_str_rfc822(l_time_str, DAP_TIME_STR_SIZE, l_tx->header.ts_created); /* Convert ts to "Sat May 17 01:17:08 2014" */ json_object *l_obj_ts_created = json_object_new_string(l_time_str); json_object_object_add(json_obj_datum, "tx_created", l_obj_ts_created); @@ -265,10 +261,8 @@ static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_pro bool l_declined = false; // transaction time char l_time_str[DAP_TIME_STR_SIZE] = "unknown"; /* Prefill string */ - if (a_tx->header.ts_created) { - dap_time_to_str_rfc822(l_time_str, DAP_TIME_STR_SIZE, a_tx->header.ts_created); /* Convert ts to "Sat May 17 01:17:08 2014\n" */ - l_time_str[strlen(l_time_str)-1] = '\0'; /* Remove "\n"*/ - } + if (a_tx->header.ts_created) + dap_time_to_str_rfc822(l_time_str, DAP_TIME_STR_SIZE, a_tx->header.ts_created); /* Convert ts to "Sat May 17 01:17:08 2014" */ dap_chain_tx_hash_processed_ht_t *l_tx_data = NULL; HASH_FIND(hh, *a_tx_data_ht, a_tx_hash, sizeof(*a_tx_hash), l_tx_data); if (l_tx_data) // this tx already present in ledger (double) @@ -276,7 +270,7 @@ static void s_tx_header_print(json_object* json_obj_datum, dap_chain_tx_hash_pro else { l_tx_data = DAP_NEW_Z(dap_chain_tx_hash_processed_ht_t); if (!l_tx_data) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_tx_data->hash = *a_tx_hash; @@ -338,7 +332,7 @@ json_object* dap_db_history_addr(dap_chain_addr_t *a_addr, dap_chain_t *a_chain, { json_object* json_obj_datum = json_object_new_array(); if (!json_obj_datum){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_json_rpc_error_add(-44, "Memory allocation error"); return NULL; } @@ -665,6 +659,9 @@ size_t datums = 0; if (json_object_array_length(j_arr_data) > 0) { json_object_object_add(j_obj_tx, "data", j_arr_data); json_object_array_add(json_obj_datum, j_obj_tx); + } else { + json_object_put(j_arr_data); + json_object_put(j_obj_tx); } dap_list_free(l_list_out_items); if (l_is_need_correction && l_corr_object) { @@ -779,7 +776,7 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, bool accepted_tx; json_object* json_obj_datum = dap_db_tx_history_to_json(&l_ttx_hash, NULL, l_tx, l_chain, l_hash_out_type, l_net, 0, &accepted_tx, out_brief); if (!json_obj_datum) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if (accepted_tx) { @@ -808,6 +805,15 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, return json_arr_out; } +json_object *s_get_ticker(json_object *a_jobj_tickers, const char *a_token_ticker) { + json_object_object_foreach(a_jobj_tickers, key, value){ + if (dap_strcmp(a_token_ticker, key) == 0) { + return value; + } + } + return NULL; +} + /** * @brief show all tokens in chain * @@ -817,49 +823,70 @@ json_object *dap_db_history_tx_all(dap_chain_t *l_chain, dap_chain_net_t *l_net, * @param a_token_num * @return char* */ -static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num) { - if (!a_chain->callback_atom_get_datums) { - log_it(L_WARNING, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); +static json_object* dap_db_chain_history_token_list(dap_chain_t * a_chain, const char *a_token_name, const char *a_hash_out_type, size_t *a_token_num) +{ + json_object *l_jobj_tickers = json_object_new_object(); + if (!a_chain->callback_datum_iter_create) { + log_it(L_WARNING, "Not defined datum iterators for chain \"%s\"", a_chain->name); return NULL; } - *a_token_num = 0; - size_t l_atom_size = 0; - dap_chain_cell_t *l_cell = a_chain->cells; - json_object* json_arr_history_token_out = json_object_new_array(); - do { - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, NULL); - if(!a_chain->callback_atom_get_datums) { - log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); - json_object_put(json_arr_history_token_out); - return NULL ; - } - for (dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_FIRST, &l_atom_size); - l_atom && l_atom_size; l_atom = a_chain->callback_atom_iter_get(l_atom_iter, DAP_CHAIN_ITER_OP_NEXT, &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 l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if (!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) - continue; - if (a_token_name) { - size_t l_token_size = l_datum->header.data_size; - dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size); - int l_cmp = dap_strcmp(l_token->ticker, a_token_name); - DAP_DELETE(l_token); - if (l_cmp) - continue; - } - json_object* json_history_token = json_object_new_object(); - dap_chain_datum_dump_json(json_history_token, l_datum, a_hash_out_type, a_chain->net_id); - json_object_array_add(json_arr_history_token_out, json_history_token); - (*a_token_num)++; + size_t l_token_num = 0; + dap_chain_datum_iter_t *l_datum_iter = a_chain->callback_datum_iter_create(a_chain); + for (dap_chain_datum_t *l_datum = a_chain->callback_datum_iter_get_first(l_datum_iter); + l_datum; l_datum = a_chain->callback_datum_iter_get_next(l_datum_iter)) { + if (l_datum->header.type_id != DAP_CHAIN_DATUM_TOKEN_DECL) + continue; + size_t l_token_size = l_datum->header.data_size; + dap_chain_datum_token_t *l_token = dap_chain_datum_token_read(l_datum->data, &l_token_size); + if (a_token_name) { + if (dap_strcmp(a_token_name, l_token->ticker) != 0) { + DAP_DELETE(l_token); + continue; } - DAP_DELETE(l_datums); } - a_chain->callback_atom_iter_delete(l_atom_iter); - l_cell = l_cell->hh.next; - } while (l_cell); - return json_arr_history_token_out; + json_object *l_jobj_ticker = s_get_ticker(l_jobj_tickers, l_token->ticker); + json_object *l_jobj_decls = NULL; + json_object *l_jobj_updates = NULL; + if (!l_jobj_ticker) { + l_jobj_ticker = json_object_new_object(); + dap_ledger_t *l_ledger = dap_chain_net_by_id(a_chain->net_id)->pub.ledger; + json_object *l_current_state = dap_ledger_token_info_by_name(l_ledger, l_token->ticker); + json_object_object_add(l_jobj_ticker, "current state", l_current_state); + l_jobj_decls = json_object_new_array(); + l_jobj_updates = json_object_new_array(); + json_object_object_add(l_jobj_ticker, "declarations", l_jobj_decls); + json_object_object_add(l_jobj_ticker, "updates", l_jobj_updates); + json_object_object_add(l_jobj_tickers, l_token->ticker, l_jobj_ticker); + } else { + l_jobj_decls = json_object_object_get(l_jobj_ticker, "declarations"); + l_jobj_updates = json_object_object_get(l_jobj_ticker, "updates"); + } + int l_ret_code = l_datum_iter->ret_code; + json_object* json_history_token = json_object_new_object(); + json_object_object_add(json_history_token, "status", json_object_new_string(l_ret_code ? "DECLINED" : "ACCEPTED")); + json_object_object_add(json_history_token, "Ledger return code", json_object_new_int(l_ret_code)); + dap_chain_datum_dump_json(json_history_token, l_datum, a_hash_out_type, a_chain->net_id); + switch (l_token->type) { + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_SIMPLE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PUBLIC: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_DECL: + case DAP_CHAIN_DATUM_TOKEN_TYPE_DECL: + json_object_array_add(l_jobj_decls, json_history_token); + break; + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_PRIVATE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_OLD_NATIVE_UPDATE: + case DAP_CHAIN_DATUM_TOKEN_TYPE_UPDATE: + json_object_array_add(l_jobj_updates, json_history_token); + break; + } + DAP_DELETE(l_token); + l_token_num++; + } + a_chain->callback_datum_iter_delete(l_datum_iter); + if (a_token_num) + *a_token_num = l_token_num; + return l_jobj_tickers; } /** @@ -912,7 +939,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger } dap_string_t *l_str_out = dap_string_new(NULL); if (!l_str_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } // list all transactions @@ -998,7 +1025,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger } l_sht = DAP_NEW_Z(dap_chain_tx_hash_processed_ht_t); if (!l_sht) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_sht->hash = l_tx_hash; @@ -1619,7 +1646,7 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(dap_chain_addr_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return -1; } @@ -1633,7 +1660,7 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(uint256_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return -1; } @@ -1690,7 +1717,7 @@ int cmd_decree(int a_argc, char **a_argv, void **a_str_reply) l_total_tsd_size = sizeof(dap_tsd_t) + sizeof(uint256_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return -1; } diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 2c6de201ba1db22f7d21ab7843a16bb373a3a4a7..548e6fd9850255fdcb6f6c598460c28089d84788 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -260,7 +260,7 @@ dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net, } dap_chain_node_client_t *l_node_client = DAP_NEW_Z(dap_chain_node_client_t); if (!l_node_client) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } @@ -297,8 +297,9 @@ bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const dap_client_set_is_always_reconnect(a_node_client->client, false); a_node_client->client->_inheritor = a_node_client; dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels); - const char *l_cert_node_name = dap_config_get_item_str(a_node_client->net->pub.config, "general", "auth_cert"); - dap_client_set_auth_cert(a_node_client->client, l_cert_node_name); + const char *l_auth_cert_name = dap_config_get_item_str(a_node_client->net->pub.config, "general", "auth_cert"); + if (l_auth_cert_name) + dap_client_set_auth_cert(a_node_client->client, l_auth_cert_name); char *l_host_addr = a_node_client->info->ext_host; if ( !*l_host_addr || !strcmp(l_host_addr, "::") || !a_node_client->info->ext_port ) { @@ -320,7 +321,7 @@ bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const */ void dap_chain_node_client_close_unsafe(dap_chain_node_client_t *a_node_client) { - log_it(L_INFO, "Closing node client to uplink"NODE_ADDR_FP_STR" [ %s : %u ]", + log_it(L_INFO, "Closing node client to uplink "NODE_ADDR_FP_STR" [ %s : %u ]", NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr), a_node_client->info->ext_host, a_node_client->info->ext_port); @@ -396,8 +397,8 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s // prepare for signal waiting struct timespec l_cond_timeout; - clock_gettime( CLOCK_MONOTONIC, &l_cond_timeout); - l_cond_timeout.tv_sec += a_timeout_ms/1000; + clock_gettime(CLOCK_REALTIME, &l_cond_timeout); + l_cond_timeout.tv_sec += a_timeout_ms;//1000; // signal waiting dap_chain_node_client_state_t l_clinet_state = a_client->state; while (a_client->state == l_clinet_state) { @@ -410,14 +411,11 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s break; } else if(l_ret_wait == ETIMEDOUT) { // 110 260 - //log_it(L_NOTICE,"Wait for status is stopped by timeout"); + log_it(L_NOTICE, "Wait for status is stopped by timeout"); ret = -1; break; }else if (l_ret_wait != 0 ){ - char l_errbuf[128]; - l_errbuf[0] = '\0'; - strerror_r(l_ret_wait,l_errbuf,sizeof (l_errbuf)); - log_it(L_ERROR, "Pthread condition timed wait returned \"%s\"(code %d)", l_errbuf, l_ret_wait); + log_it(L_CRITICAL, "pthread_cond_timedwait() error %d:\"%s\"", l_ret_wait, dap_strerror(l_ret_wait)); } } pthread_mutex_unlock(&a_client->wait_mutex); diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c index fdf0d57a4fb35f2b7b28c344764b4f047da1a303..3d82dd6152e6a06b82d2eff4aa09e87aedfe8692 100644 --- a/modules/net/dap_chain_node_dns_client.c +++ b/modules/net/dap_chain_node_dns_client.c @@ -178,7 +178,7 @@ static void s_dns_client_esocket_worker_assign_callback(dap_events_socket_t * a_ dap_events_socket_uuid_t * l_es_uuid_ptr = DAP_NEW_Z(dap_events_socket_uuid_t); if (!l_es_uuid_ptr) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } *l_es_uuid_ptr = a_esocket->uuid; diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index f633750b5564c9088197d932a794e2d9b9210115..3a14319538f31be19b0d7eea411959d994184b9e 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -256,15 +256,14 @@ cleanup: return; } -void dap_dns_server_start(char *a_port) +void dap_dns_server_start(const char *a_cfg_section) { -// memory alloc DAP_NEW_Z_RET(s_dns_server, dap_dns_server_t, NULL); - dap_events_socket_callbacks_t l_cb = {}; - l_cb.read_callback = dap_dns_client_read; - s_dns_server->instance = dap_server_new(&a_port, 1, DAP_SERVER_UDP, &l_cb); + dap_events_socket_callbacks_t l_cb = { .read_callback = dap_dns_client_read }; + s_dns_server->instance = dap_server_new(a_cfg_section, NULL, &l_cb); if (!s_dns_server->instance) { log_it(L_ERROR, "Can't start DNS server"); + DAP_DELETE(s_dns_server); return; } dap_dns_zone_register(&s_root_alias[0], dap_chain_net_balancer_dns_issue_link); // root resolver diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c index f4b19e85dd7404c790cd0db2b3f1d6ba98ad3c2f..fdcf333b5a1aa934f62f8161d653a85832e8c337 100644 --- a/modules/net/dap_chain_node_ping.c +++ b/modules/net/dap_chain_node_ping.c @@ -93,7 +93,7 @@ static void* node_ping_proc(void *a_arg) /*char *host4 = DAP_NEW_SIZE(char, INET_ADDRSTRLEN); if (!host4) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = l_addr }; @@ -166,7 +166,7 @@ int start_node_ping(pthread_t *a_thread, struct in_addr a_addr, int a_port, int { uint8_t *l_data = DAP_NEW_Z_SIZE(uint8_t, sizeof(struct in_addr) + 2 * sizeof(int)); if (!l_data) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } memcpy(l_data, &a_count, sizeof(int)); @@ -280,7 +280,7 @@ static void* node_ping_background_proc(void *a_arg) dap_chain_node_addr_t *l_node_addr_tmp; l_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); if (!l_node_addr_tmp) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_node_list0, NULL); DAP_DEL_Z(s_node_addr_ping); DAP_DELETE(a_arg); @@ -293,7 +293,7 @@ static void* node_ping_background_proc(void *a_arg) l_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); if (!l_node_addr_tmp) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_node_list0, NULL); DAP_DEL_Z(s_node_addr_ping); DAP_DELETE(a_arg); @@ -323,7 +323,7 @@ int dap_chain_node_ping_background_start(dap_chain_net_t *a_net, dap_list_t *a_n while(l_node_list_tmp) { dap_chain_node_addr_t *l_addr = DAP_NEW(dap_chain_node_addr_t); if (!l_addr) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_node_list, NULL); return -1; } @@ -336,7 +336,7 @@ int dap_chain_node_ping_background_start(dap_chain_net_t *a_net, dap_list_t *a_n // uint8_t *l_arg = DAP_NEW_SIZE(uint8_t, sizeof(dap_chain_net_t*) + sizeof(dap_list_t*)); if (!l_arg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_node_list, NULL); return -1; } diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 777e259835417b9ddd7e0c28b401d82452309431..57a457f65c424d6b64f86821ea42a3de5043083a 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -177,11 +177,13 @@ typedef bool (*dap_ledger_tag_check_callback_t)(dap_ledger_t *a_ledger, dap_chai #define DAP_LEDGER_CACHE_ENABLED 0x0200 // Error code for no previous transaction (for stay in mempool) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS DAP_LEDGER_TX_CHECK_PREV_TX_NOT_FOUND -// Error code for no emission for a transaction (for stay in mempoold) -#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION DAP_LEDGER_TX_CHECK_EMISSION_NOT_FOUND +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS DAP_LEDGER_TX_CHECK_PREV_TX_NOT_FOUND +// Error code for no emission for a transaction (for stay in mempool) +#define DAP_CHAIN_CS_VERIFY_CODE_TX_NO_EMISSION DAP_LEDGER_TX_CHECK_EMISSION_NOT_FOUND +// Error code for not enough valid emission signs (for stay in mempool) +#define DAP_CHAIN_CS_VERIFY_CODE_NOT_ENOUGH_SIGNS DAP_LEDGER_EMISSION_ADD_CHECK_NOT_ENOUGH_VALID_SIGNS // Error code for no decree for anchor (for stay in mempool) -#define DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE -1113 +#define DAP_CHAIN_CS_VERIFY_CODE_NO_DECREE -1113 #define DAP_LEDGER_TOKENS_STR "tokens" #define DAP_LEDGER_EMISSIONS_STR "emissions" @@ -262,6 +264,7 @@ int dap_ledger_token_load(dap_ledger_t *a_ledger, byte_t *a_token, size_t a_toke int dap_ledger_token_decl_add_check(dap_ledger_t *a_ledger, dap_chain_datum_token_t *a_token, size_t a_token_size); char *dap_ledger_token_decl_add_err_code_to_str(int a_code); json_object *dap_ledger_token_info(dap_ledger_t *a_ledger, size_t a_limit, size_t a_offset); +json_object *dap_ledger_token_info_by_name(dap_ledger_t *a_ledger, const char *a_token_ticker); // Get all token-declarations dap_list_t* dap_ledger_token_decl_all(dap_ledger_t *a_ledger); @@ -336,9 +339,7 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db); * Return number transactions from the cache */ unsigned dap_ledger_count(dap_ledger_t *a_ledger); -uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_time_t a_ts_from, dap_time_t a_ts_to); -size_t dap_ledger_count_tps(dap_ledger_t *a_ledger, struct timespec *a_ts_from, struct timespec *a_ts_to); -void dap_ledger_set_tps_start_time(dap_ledger_t *a_ledger); +uint64_t dap_ledger_count_from_to(dap_ledger_t * a_ledger, dap_nanotime_t a_ts_from, dap_nanotime_t a_ts_to); /** * Check whether used 'out' items @@ -365,8 +366,8 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a * * return transaction, or NULL if transaction not found in the cache */ -dap_chain_datum_tx_t* dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); -dap_chain_datum_tx_t* dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); +dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash); +dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash); dap_hash_fast_t *dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_cond_type, dap_chain_hash_fast_t *a_tx_hash); dap_hash_fast_t *dap_ledger_get_first_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * a_tx, dap_chain_tx_out_cond_t *a_cond_out); diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 6e9f139a5223f361a849eda5c49a5c7c1f25c485..6e62d461f70fb3948bcfad59038a16bd2368dedb 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -44,6 +44,7 @@ typedef struct dap_chain_node_client dap_chain_node_client_t; typedef struct dap_ledger dap_ledger_t; typedef struct dap_chain_net_decree dap_chain_net_decree_t; typedef struct decree_table decree_table_t; +typedef struct anchor_table anchor_table_t; typedef enum dap_chain_net_state { NET_STATE_OFFLINE = 0, NET_STATE_LINKS_PREPARE, @@ -233,4 +234,5 @@ enum dap_chain_net_json_rpc_error_list{ }; dap_chain_net_decree_t *dap_chain_net_get_net_decree(dap_chain_net_t *a_net); void dap_chain_net_set_net_decree(dap_chain_net_t *a_net, dap_chain_net_decree_t *a_decree); -decree_table_t **dap_chain_net_get_decrees(dap_chain_net_t *a_net); \ No newline at end of file +decree_table_t **dap_chain_net_get_decrees(dap_chain_net_t *a_net); +anchor_table_t **dap_chain_net_get_anchors(dap_chain_net_t *a_net); \ No newline at end of file diff --git a/modules/net/include/dap_chain_net_anchor.h b/modules/net/include/dap_chain_net_anchor.h index 1a44cab2a1f10439cd03d4c91b355c78d3380355..7275e2c2b3ca0e4143c30f692de3f471b72a9dc4 100644 --- a/modules/net/include/dap_chain_net_anchor.h +++ b/modules/net/include/dap_chain_net_anchor.h @@ -24,6 +24,8 @@ #include "dap_chain_datum_anchor.h" #include "dap_chain_net.h" +int dap_chain_net_anchor_init(dap_chain_net_t *a_net); + int dap_chain_net_anchor_verify(dap_chain_net_t *a_net, dap_chain_datum_anchor_t * a_anchor, size_t a_data_size); -int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain); -int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain); \ No newline at end of file +int dap_chain_net_anchor_load(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain, dap_hash_fast_t *a_anchor_hash); +int dap_chain_net_anchor_unload(dap_chain_datum_anchor_t * a_anchor, dap_chain_t *a_chain, dap_hash_fast_t *a_anchor_hash); \ No newline at end of file diff --git a/modules/net/include/dap_chain_node_dns_server.h b/modules/net/include/dap_chain_node_dns_server.h index 4b8d02b3e596b8823dfea50022844e9f7355778f..aa22b05bd3ec02ae7e1469d9780321d9b923f9bf 100644 --- a/modules/net/include/dap_chain_node_dns_server.h +++ b/modules/net/include/dap_chain_node_dns_server.h @@ -117,7 +117,7 @@ typedef struct _dap_dns_server_t { -void dap_dns_server_start(char *a_port); +void dap_dns_server_start(const char* a_cfg_section); void dap_dns_server_stop(); int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback); int dap_dns_zone_unregister(char *zone); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 62941a875fc371ecaa9e6b151c5c1caaed234cef..a99b12f0c1091883f3985b8ec8e79a9020536774 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -94,18 +94,18 @@ int dap_chain_net_srv_init() dap_ledger_verificator_add(DAP_CHAIN_TX_OUT_COND_SUBTYPE_FEE, s_fee_verificator_callback, NULL, NULL); dap_cli_server_cmd_add ("net_srv", s_cli_net_srv, "Network services managment", - "net_srv -net <net_name> order find [-direction {sell | buy}] [-srv_uid <service_UID>] [-price_unit <price_unit>]" + "net_srv -net <net_name> order find [-direction {sell|buy}] [-srv_uid <service_UID>] [-price_unit <price_unit>]" " [-price_token <token_ticker>] [-price_min <price_minimum>] [-price_max <price_maximum>]\n" "\tOrders list, all or by UID and/or class\n" "net_srv -net <net_name> order delete -hash <ip_addr>\n" "\tOrder delete\n" "net_srv -net <net_name> order dump -hash <ip_addr>\n" "\tOrder dump info\n" - "net_srv -net <net_name> order create -direction {sell | buy} -srv_uid <Service UID> -price <Price>\n" - " -price_unit <Price Unit> -price_token <token_ticker> -units <units> [-node_addr <Node Address>] [-tx_cond <TX Cond Hash>]\n" - " [-expires <Unix time when expires>] [-cert <cert name to sign order>]\n" - " [{-ext <Extension with params> | -region <Region name> -continent <Continent name>}]\n" - "net_srv get_limits -net <net_name> -srv_uid <Service_UID> -provider_pkey_hash <Service_provider_public_key_hash> -client_pkey_hash <Client_public_key_hash>\n" + "net_srv -net <net_name> order create -direction {sell|buy} -srv_uid <service_UID> -price <price>\n" + " -price_unit <price_unit> -price_token <token_ticker> -units <units> [-node_addr <node_address>] [-tx_cond <TX_cond_hash>]\n" + " [-expires <unix_time_when_expires>] [-cert <cert_name_to_sign_order>]\n" + " [{-ext <extension_with_params>|-region <region_name> -continent <continent_name>}]\n" + "net_srv get_limits -net <net_name> -srv_uid <service_UID> -provider_pkey_hash <service_provider_public_key_hash> -client_pkey_hash <client_public_key_hash>\n" "net_srv report\n" "\tGet report about srv usage" ); @@ -206,13 +206,13 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply) int l_ret = dap_chain_node_cli_cmd_values_parse_net_chain( &arg_index, argc, argv, a_str_reply, NULL, &l_net, CHAIN_TYPE_INVALID); if ( l_net ) { - //char * l_orders_group = dap_chain_net_srv_order_get_gdb_group( l_net ); - dap_string_t *l_string_ret = dap_string_new(""); + const char *l_order_str = NULL; - int l_order_arg_pos = dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "order", &l_order_str); + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "order", &l_order_str); + const char *l_get_limits_str = NULL; - int l_get_limits_arg_pos = dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "get_limits", &l_get_limits_str); + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "get_limits", &l_get_limits_str); // Order direction const char *l_direction_str = NULL; @@ -857,7 +857,7 @@ dap_chain_net_srv_price_t * dap_chain_net_srv_get_price_from_order(dap_chain_net dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t); if (!l_price) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_order); return NULL; } @@ -977,7 +977,7 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, if(!l_sdata) { l_srv = DAP_NEW_Z(dap_chain_net_srv_t); if (!l_srv) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_mutex_unlock(&s_srv_list_mutex); return NULL; } @@ -987,7 +987,7 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid, pthread_mutex_init(&l_srv->banlist_mutex, NULL); l_sdata = DAP_NEW_Z(service_list_t); if (!l_sdata) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_srv); pthread_mutex_unlock(&s_srv_list_mutex); return NULL; diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c index de1bc0e0f5123cddf66a756dc384d2b892bb1942..f636c5e610eb0c9a0efa71895252b6bf8f97b8d7 100644 --- a/modules/net/srv/dap_chain_net_srv_client.c +++ b/modules/net/srv/dap_chain_net_srv_client.c @@ -42,7 +42,7 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_ { dap_chain_net_srv_client_t *l_ret = DAP_NEW_Z(dap_chain_net_srv_client_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if (a_callbacks) diff --git a/modules/net/srv/dap_chain_net_srv_geoip.c b/modules/net/srv/dap_chain_net_srv_geoip.c index a2117620ea28db87c697ad85651df85b6a7dba61..96a861c09f4042e2ffbd143d86c763584a0a3e0b 100644 --- a/modules/net/srv/dap_chain_net_srv_geoip.c +++ b/modules/net/srv/dap_chain_net_srv_geoip.c @@ -188,7 +188,7 @@ geoip_info_t *chain_net_geoip_get_ip_info_by_local_db(const char *a_ip_str, cons geoip_info_t *l_ret = DAP_NEW_Z(geoip_info_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 5a41dfa02cad40a2465fac6ca2ef0cc47beb220a..d020aefde084f571a8d1dff271a961440e62196b 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -81,28 +81,30 @@ void dap_chain_net_srv_order_deinit() } -size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order) +size_t dap_chain_net_srv_order_get_size(const dap_chain_net_srv_order_t *a_order) { - if (!a_order) + if (!a_order || a_order->version != 3) return 0; - size_t l_sign_size = 0; - if (a_order->version == 3) { - dap_sign_t *l_sign = (dap_sign_t *)(a_order->ext_n_sign + a_order->ext_size); - if (l_sign->header.type.type == SIG_TYPE_NULL) - l_sign_size = sizeof(dap_sign_type_t); - else - l_sign_size = dap_sign_get_size(l_sign); - return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size; - } - dap_chain_net_srv_order_old_t *l_order = (dap_chain_net_srv_order_old_t *)a_order; - if(l_order->version == 2) { - dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size]; - if (l_sign->header.type.type == SIG_TYPE_NULL) - l_sign_size = sizeof(dap_sign_type_t); - else - l_sign_size = dap_sign_get_size(l_sign); - } - return sizeof(dap_chain_net_srv_order_old_t) + l_order->ext_size + l_sign_size; + dap_sign_t *l_sign = (dap_sign_t *)(a_order->ext_n_sign + a_order->ext_size); + size_t l_sign_size = l_sign->header.type.type == SIG_TYPE_NULL ? sizeof(dap_sign_type_t) : dap_sign_get_size(l_sign); + return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size; +} + +const dap_chain_net_srv_order_t *dap_chain_net_srv_order_check(const char *a_order_hash_str, const byte_t *a_order, size_t a_order_size) +{ + const dap_chain_net_srv_order_t *l_order = (const dap_chain_net_srv_order_t *)a_order; + dap_return_val_if_fail(l_order && a_order_size >= sizeof(dap_chain_net_srv_order_t) + sizeof(dap_sign_t) && + l_order->version == 3 && l_order->direction <= SERV_DIR_SELL, NULL); + size_t l_order_size = dap_chain_net_srv_order_get_size(l_order); + if (l_order_size != a_order_size) + return NULL; + dap_hash_fast_t l_hash, l_hash_real; + dap_hash_fast(a_order, a_order_size, &l_hash_real); + if (dap_chain_hash_fast_from_str(a_order_hash_str, &l_hash)) + return NULL; + if (memcmp(&l_hash, &l_hash_real, sizeof(dap_hash_fast_t))) + return NULL; + return l_order; } /** @@ -146,7 +148,7 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_ * @param a_continent_num [out] * @param a_region [out] */ -bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region) +bool dap_chain_net_srv_order_get_continent_region(const dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region) { if(!a_order_static || !a_order_static->ext_size || a_order_static->ext_n_sign[0]!=0x52) return false; @@ -161,7 +163,7 @@ bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_o if(l_size > 0) { *a_region = DAP_NEW_SIZE(char, l_size); if (!a_region) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } memcpy(*a_region, a_order_static->ext_n_sign + 1 + sizeof(uint8_t), l_size); @@ -296,7 +298,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne if (a_ext_size) { l_order = (dap_chain_net_srv_order_t *)DAP_NEW_Z_SIZE(void, sizeof(dap_chain_net_srv_order_t) + a_ext_size); if (!l_order) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } memcpy(l_order->ext_n_sign, a_ext, a_ext_size); @@ -305,7 +307,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose(dap_chain_net_t *a_ne else { l_order = DAP_NEW_Z(dap_chain_net_srv_order_t); if (!l_order) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } dap_chain_net_srv_order_set_continent_region(&l_order, a_continent_num, a_region); @@ -363,50 +365,6 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord return NULL; } -dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t a_order_size) -{ - if (NULL == a_order) { - log_it(L_ERROR, "Argumets are NULL for dap_chain_net_srv_order_read"); - return NULL; - } - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_order; - size_t l_order_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)a_order); - if (l_order->version > 3 || l_order->direction > SERV_DIR_SELL || l_order_size != a_order_size) - return NULL; - if (l_order->version == 3) - return DAP_DUP_SIZE(a_order, l_order_size); - dap_chain_net_srv_order_old_t *l_old = (dap_chain_net_srv_order_old_t *)a_order; - size_t l_ret_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_old) + - sizeof(dap_chain_net_srv_order_t) - sizeof(dap_chain_net_srv_order_old_t); - if (l_old->version == 1) - l_ret_size += sizeof(dap_sign_type_t); - dap_chain_net_srv_order_t *l_ret = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_ret_size); - l_ret->version = 3; -#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 - l_ret->srv_uid.uint64 = l_old->srv_uid.uint64; -#else - l_ret->srv_uid.uint128 = dap_chain_uint128_from(l_old->srv_uid.uint64); -#endif - l_ret->direction = l_old->direction; - l_ret->node_addr.uint64 = l_old->node_addr.uint64; - l_ret->tx_cond_hash = l_old->tx_cond_hash; - l_ret->price_unit.uint32 = l_old->price_unit.uint32; - l_ret->ts_created = l_old->ts_created; - l_ret->ts_expires = l_old->ts_expires; - l_ret->price = dap_chain_uint256_from(l_old->price); - strncpy(l_ret->price_ticker, l_old->price_ticker, DAP_CHAIN_TICKER_SIZE_MAX); - l_ret->ext_size = l_old->ext_size; - memcpy(l_ret->ext_n_sign, l_old->ext, l_old->ext_size); - dap_sign_t *l_sign = (dap_sign_t *)&l_old->ext[l_old->ext_size]; - size_t l_sign_size = l_old->version == 1 ? 0 : dap_sign_get_size(l_sign); - if (l_sign_size) - memcpy(l_ret->ext_n_sign + l_ret->ext_size, l_sign, l_sign_size); - else - ((dap_sign_type_t *)(l_ret->ext_n_sign + l_ret->ext_size))->type = SIG_TYPE_NULL; - return l_ret; -} - - /** * @brief dap_chain_net_srv_order_find_by_hash_str * @param a_net @@ -415,7 +373,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t */ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_net_t *a_net, const char *a_hash_str) { - dap_chain_net_srv_order_t *l_order = NULL; + const dap_chain_net_srv_order_t *l_order = NULL; for (int i = 0; a_net && a_hash_str && i < 2; i++) { char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(a_net) : dap_chain_net_srv_order_get_common_group(a_net); @@ -425,21 +383,13 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne if (!l_gdb_order) continue; // check order size - size_t l_expected_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_gdb_order); - if (l_order_size != l_expected_size) { - log_it(L_ERROR, "Found wrong size order %zu, expected %zu", l_order_size, l_expected_size); - DAP_DELETE(l_gdb_order); - return NULL; - } - l_order = dap_chain_net_srv_order_read(l_gdb_order, l_order_size); + l_order = dap_chain_net_srv_order_check(a_hash_str, l_gdb_order, l_order_size); if (!l_order || (l_order->ts_expires && l_order->ts_expires < dap_time_now())){ - DAP_DEL_Z(l_order); DAP_DELETE(l_gdb_order); - continue; + break; } - DAP_DELETE(l_gdb_order); } - return l_order; + return (dap_chain_net_srv_order_t *)l_order; } /** @@ -454,15 +404,15 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne * @param a_output_orders_count * @return */ -int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_net_srv_order_direction_t a_direction, +int dap_chain_net_srv_order_find_all_by(dap_chain_net_t *a_net, const dap_chain_net_srv_order_direction_t a_direction, const dap_chain_net_srv_uid_t a_srv_uid, - const dap_chain_net_srv_price_unit_uid_t a_price_unit,const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + const dap_chain_net_srv_price_unit_uid_t a_price_unit, const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], const uint256_t a_price_min, const uint256_t a_price_max, - dap_list_t** a_output_orders, size_t * a_output_orders_count) + dap_list_t **a_output_orders, size_t *a_output_orders_count) { if (!a_net || !a_output_orders || !a_output_orders_count) return -1; - size_t l_orders_size = 0, l_output_orders_count = 0; + size_t l_output_orders_count = 0; *a_output_orders = NULL; dap_list_t* l_out_list = NULL; @@ -472,65 +422,54 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ : dap_chain_net_srv_order_get_common_group(a_net); size_t l_orders_count = 0; dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); - log_it( L_DEBUG, "Loaded %zu orders", l_orders_count); - dap_chain_net_srv_order_t *l_order = NULL; + log_it(L_DEBUG, "Loaded %zu orders", l_orders_count); + const dap_chain_net_srv_order_t *l_order = NULL; for (size_t i = 0; i < l_orders_count; i++) { - l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len); + l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); if (!l_order) { dap_global_db_del_sync(l_gdb_group_str, l_orders[i].key); continue; // order is corrupted } - if (l_order->ts_expires && l_order->ts_expires < dap_time_now()){ - DAP_DEL_Z(l_order); + + if (l_order->ts_expires && l_order->ts_expires < dap_time_now()) continue; - } - dap_chain_hash_fast_t l_hash, l_hash_gdb; - dap_hash_fast(l_orders[i].value, l_orders[i].value_len, &l_hash); - dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb); - if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) { - dap_global_db_del_sync(l_gdb_group_str, l_orders[i].key); - DAP_DEL_Z(l_order); - continue; // order is corrupted - } // Check direction - if (a_direction != SERV_DIR_UNDEFINED && l_order->direction != a_direction){ - DAP_DEL_Z(l_order); + if (a_direction != SERV_DIR_UNDEFINED && l_order->direction != a_direction) continue; - } + // Check srv uid - if (a_srv_uid.uint64 && l_order->srv_uid.uint64 != a_srv_uid.uint64){ - DAP_DEL_Z(l_order); + if (a_srv_uid.uint64 && l_order->srv_uid.uint64 != a_srv_uid.uint64) continue; - } + // check price unit - if (a_price_unit.uint32 && a_price_unit.uint32 != l_order->price_unit.uint32){ - DAP_DEL_Z(l_order); + if (a_price_unit.uint32 && a_price_unit.uint32 != l_order->price_unit.uint32) continue; - } + // Check price minimum - if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1){ - DAP_DEL_Z(l_order); + if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1) continue; - } + // Check price maximum - if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1){ - DAP_DEL_Z(l_order); + if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1) continue; - } + // Check ticker - if (a_price_ticker && strcmp( l_order->price_ticker, a_price_ticker)){ - DAP_DEL_Z(l_order); + if (a_price_ticker && strcmp( l_order->price_ticker, a_price_ticker)) continue; - } + size_t l_order_mem_size = dap_chain_net_srv_order_get_size(l_order); dap_chain_net_srv_order_t *l_output_order = DAP_DUP_SIZE(l_order, l_order_mem_size); - DAP_DEL_Z(l_order); + if (!l_output_order) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); + dap_global_db_objs_delete(l_orders, l_orders_count); + return -1; + } l_out_list = dap_list_append(l_out_list, l_output_order); l_output_orders_count++; } - dap_global_db_objs_delete(l_orders, l_orders_count); DAP_DELETE(l_gdb_group_str); + dap_global_db_objs_delete(l_orders, l_orders_count); } *a_output_orders_count = l_output_orders_count; *a_output_orders = l_out_list; @@ -563,7 +502,8 @@ int dap_chain_net_srv_order_delete_by_hash_str_sync(dap_chain_net_t *a_net, cons * @param a_orders * @param a_str_out */ -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out, const char *a_hash_out_type, const char *a_native_ticker) +void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, + const char *a_hash_out_type, const char *a_native_ticker) { if (a_order && a_str_out ){ dap_chain_hash_fast_t l_hash; diff --git a/modules/net/srv/dap_chain_net_srv_stream_session.c b/modules/net/srv/dap_chain_net_srv_stream_session.c index f471895fb588d4258e00b34ec78164a58b12b0c0..fd218ff8f24d27588c509eee4389c0b3c7fd40c6 100644 --- a/modules/net/srv/dap_chain_net_srv_stream_session.c +++ b/modules/net/srv/dap_chain_net_srv_stream_session.c @@ -42,7 +42,7 @@ dap_chain_net_srv_stream_session_t * dap_chain_net_srv_stream_session_create( da } dap_chain_net_srv_stream_session_t * l_session_srv= DAP_NEW_Z(dap_chain_net_srv_stream_session_t); if (!l_session_srv) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } a_session->_inheritor = l_session_srv; @@ -80,7 +80,7 @@ dap_chain_net_srv_usage_t* dap_chain_net_srv_usage_add (dap_chain_net_srv_stream if ( a_srv_session && a_net && a_srv ){ dap_chain_net_srv_usage_t * l_ret = DAP_NEW_Z(dap_chain_net_srv_usage_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } randombytes(&l_ret->id, sizeof(l_ret->id)); diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index c524cb3a91872d44780ed1e4f799d845fe01f0a1..1aa967f4ebc51c74ad0e3dfa26028241aa1970d7 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -31,14 +31,15 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_common.h" #include "dap_stream_ch.h" #include "dap_time.h" +#include "dap_stream_ch_chain_net_srv_pkt.h" #define DAP_CHAIN_NET_SRV_GRACE_PERIOD_DEFAULT 60 //Service direction -enum dap_chain_net_srv_order_direction{ +enum dap_chain_net_srv_order_direction { + SERV_DIR_UNDEFINED = 0, SERV_DIR_BUY = 1, - SERV_DIR_SELL = 2, - SERV_DIR_UNDEFINED = 0 + SERV_DIR_SELL = 2 }; typedef byte_t dap_chain_net_srv_order_direction_t; @@ -87,113 +88,6 @@ typedef struct dap_chain_net_srv_price struct dap_chain_net_srv_price *prev; } dap_chain_net_srv_price_t; -// Ch pkt types -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_REQUEST 0x01 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST 0x10 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE 0x11 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NOTIFY_STOPPED 0x20 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_DATA 0x30 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_DATA 0x31 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_REQUEST 0x40 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NEW_TX_COND_RESPONSE 0x41 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS 0xf0 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR 0xff -// for connection testing -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST 0x50 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE 0x51 - -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED 0x00000000 - -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND 0x00000100 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND 0x00000101 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_IN_CLIENT_MODE 0x00000102 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND 0x00000200 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER 0x00000201 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_IS_OFFLINE 0x00000202 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_CANT_ADD_USAGE 0x00000300 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND 0x00000400 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_COND_OUT 0x00000401 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_ENOUGH 0x00000402 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_ACCEPT_TOKEN 0x00000403 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SRV_UID 0x00000404 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_NEW_COND 0x00000405 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_SIZE 0x00000406 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_BIG_SIZE 0x00000407 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NEW_TX_COND_NOT_ENOUGH 0x00000408 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND 0x00000500 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN 0x00000501 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH 0x00000502 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_BANNED_PKEY_HASH 0x00000503 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_IS_NOT_PRESENT 0x00000504 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND 0x00000600 -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_WRONG_HASH 0x00000BAD -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_ALLOC_MEMORY_ERROR 0x00BADA55 - - -#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNKNOWN 0xffffffff -// TYPE_REQUEST -typedef struct dap_stream_ch_chain_net_srv_pkt_request_hdr{ - dap_chain_net_id_t net_id;// Network id wheither to request - dap_chain_hash_fast_t tx_cond; // Conditioned transaction with paymemt for - dap_chain_net_srv_uid_t srv_uid; - char token[DAP_CHAIN_TICKER_SIZE_MAX]; - dap_chain_hash_fast_t client_pkey_hash; - dap_chain_hash_fast_t order_hash; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_hdr_t; - -typedef struct dap_stream_ch_chain_net_srv_pkt_request{ - dap_stream_ch_chain_net_srv_pkt_request_hdr_t hdr; - uint8_t data[]; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_t; - -// Custom service data packet -typedef struct dap_stream_ch_chain_net_srv_pkt_data_hdr{ - uint8_t version; - uint16_t data_size; - uint8_t padding; - uint32_t usage_id; - dap_chain_net_srv_uid_t srv_uid; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_hdr_t; - -typedef struct dap_stream_ch_chain_net_srv_pkt_data{ - dap_stream_ch_chain_net_srv_pkt_data_hdr_t hdr; - uint8_t data[]; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_t; - - -typedef struct dap_stream_ch_chain_net_srv_pkt_success_hdr{ - uint32_t usage_id; - dap_chain_net_id_t net_id; - dap_chain_net_srv_uid_t srv_uid; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_success_hdr_t; - -typedef struct dap_stream_ch_chain_net_srv_pkt_success{ - dap_stream_ch_chain_net_srv_pkt_success_hdr_t hdr; - uint8_t custom_data[]; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_success_t; - -// TYPE_RESPONSE_ERROR -typedef struct dap_stream_ch_chain_net_srv_pkt_error{ - dap_chain_net_id_t net_id; - dap_chain_net_srv_uid_t srv_uid; - uint32_t usage_id; - uint32_t code; // error code -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_error_t; - -// data packet for connectiont test -typedef struct dap_stream_ch_chain_net_srv_pkt_test { - uint32_t usage_id; - dap_chain_net_id_t net_id; - dap_chain_net_srv_uid_t srv_uid; - int32_t time_connect_ms; - dap_nanotime_t recv_time1, recv_time2, send_time1, send_time2; - char host_send[DAP_HOSTADDR_STRLEN], host_recv[DAP_HOSTADDR_STRLEN]; - int32_t err_code; - uint64_t data_size_send, data_size_recv, data_size; - dap_chain_hash_fast_t data_hash; - uint8_t data[]; -} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t; - typedef struct dap_chain_net_srv dap_chain_net_srv_t; typedef struct dap_chain_net_srv_usage dap_chain_net_srv_usage_t; diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index 68c0194f11c1332cbd54d49418856f8147f02d72..ccdce7024a7f1b7b06e8ded12b64bd64dc158403 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -28,24 +28,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_string.h" #include "dap_chain_common.h" #include "dap_chain_net_srv.h" -typedef struct dap_chain_net_srv_order_old -{ - uint16_t version; - dap_chain_net_srv_uid_t srv_uid; // Service UID - byte_t padding; // some padding - dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE - dap_chain_node_addr_t node_addr; // Node address that servs the order (if present) - dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order - dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT - dap_time_t ts_created; - dap_time_t ts_expires; - uint64_t price; // service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. - char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service - //uint8_t continent; - //char region[32]; - uint32_t ext_size; - uint8_t ext[]; -} DAP_ALIGN_PACKED dap_chain_net_srv_order_old_t; typedef struct dap_chain_net_srv_order { @@ -73,11 +55,11 @@ typedef struct dap_chain_net_srv_order int dap_chain_net_srv_order_init(); void dap_chain_net_srv_order_deinit(void); -size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order); -dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t a_order_size); +size_t dap_chain_net_srv_order_get_size(const dap_chain_net_srv_order_t *a_order); +const dap_chain_net_srv_order_t *dap_chain_net_srv_order_check(const char *a_order_hash_str, const byte_t *a_order, size_t a_order_size); bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region); -bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); +bool dap_chain_net_srv_order_get_continent_region(const dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); const char* dap_chain_net_srv_order_get_country_code(dap_chain_net_srv_order_t *a_order); size_t dap_chain_net_srv_order_continents_count(void); @@ -158,7 +140,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_order_t *a_order, bool a_common); -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, +void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, const char *a_hash_out_type, const char *a_native_ticker); void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); diff --git a/modules/net/srv/include/dap_chain_net_srv_stream_session.h b/modules/net/srv/include/dap_chain_net_srv_stream_session.h index 3ec4c2c7973f58d588742e80f3f8259f7cdd34ea..4209f0a89991317ebd2ef08106c5194fea3800e2 100644 --- a/modules/net/srv/include/dap_chain_net_srv_stream_session.h +++ b/modules/net/srv/include/dap_chain_net_srv_stream_session.h @@ -31,11 +31,11 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_sign.h" #include "dap_chain_datum_tx.h" #include "dap_chain_datum_tx_receipt.h" -#include "dap_chain_net_srv.h" #include "dap_chain_wallet.h" typedef struct dap_chain_net_srv dap_chain_net_srv_t; typedef struct dap_chain_net_srv_client_remote dap_chain_net_srv_client_remote_t; +typedef struct dap_chain_net_srv_price dap_chain_net_srv_price_t; typedef struct dap_chain_net_srv_usage{ uint32_t id; // Usage id diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 75fcfa1e55ce9541fdb8beeafd3fddbdb8236bac..25e4862174418d897f28102f5242d24cb79eed64 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -53,7 +53,7 @@ int dap_chain_net_srv_datum_init() "\tLoad datum custum from file to mempool.\n\n"); s_srv_datum = DAP_NEW_Z(dap_chain_net_srv_t); if (!s_srv_datum) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } s_srv_datum->uid.uint64 = DAP_CHAIN_NET_SRV_DATUM_ID; @@ -161,7 +161,8 @@ static int s_srv_datum_cli(int argc, char ** argv, void **a_str_reply) return -4; } }else{ - log_it(L_ERROR, "Can't open file '%s' for write: %s", l_path, strerror(errno)); + log_it(L_ERROR, "Can't open file '%s' for write, error %d: \"%s\"", + l_path, errno, dap_strerror(errno)); return -2; } } @@ -207,7 +208,7 @@ void s_order_notficator(dap_store_obj_t *a_obj, void *a_arg) const char * a_obj_key_str = a_obj->key ? a_obj->key : "unknow"; dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; - dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read((byte_t *)a_obj->value, a_obj->value_len); // Old format comliance + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(a_obj->key, a_obj->value, a_obj->value_len); // Old format comliance if (!l_order) { log_it(L_NOTICE, "Order %s is corrupted", a_obj_key_str); if (dap_global_db_driver_delete(a_obj, 1) != 0) diff --git a/modules/service/stake/dap_chain_net_srv_stake_lock.c b/modules/service/stake/dap_chain_net_srv_stake_lock.c index 1f497a38fe10d53650e91fe61f6ec3ff252df9c5..a4eaa6675376fc3c32503a85fb57f25d8e4eb60c 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_lock.c +++ b/modules/service/stake/dap_chain_net_srv_stake_lock.c @@ -1393,7 +1393,11 @@ dap_chain_datum_t *s_stake_unlock_datum_create(dap_chain_net_t *a_net, dap_enc_k // coin back //SUBTRACT_256_256(l_fee_transfer, l_value_pack, &l_value_back); if(l_main_native){ - SUBTRACT_256_256(a_value, l_value_pack, &l_value_back); + if (SUBTRACT_256_256(a_value, l_value_pack, &l_value_back)) { + dap_chain_datum_tx_delete(l_tx); + *result = -13; + return NULL; + } if(!IS_ZERO_256(l_value_back)) { if (dap_chain_datum_tx_add_out_ext_item(&l_tx, &l_addr, l_value_back, a_main_ticker)!=1) { dap_chain_datum_tx_delete(l_tx); diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index e7c6ef181634c2e4b8b2090d662c340d611ca169..bf15114299f40463be651107d60a5b19b553e62e 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -128,7 +128,7 @@ int dap_chain_net_srv_stake_pos_delegate_init() "\tSets the minimum stake value\n" "srv_stake max_weight -net <net_name> [-chain <chain_name>] -poa_cert <poa_cert_name> -percent <value>\n" "\tSets maximum validator related weight (in percent)\n" - "srv_stake check -net <net_name> -tx <tx_hash>" + "srv_stake check -net <net_name> -tx <tx_hash>\n" "\tCheck remote validator" ); @@ -514,7 +514,7 @@ dap_list_t *dap_chain_net_srv_stake_get_validators(dap_chain_net_id_t a_net_id, } return l_ret; fail_ret: - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_ret, NULL); if (a_excluded_list) DAP_DELETE(*a_excluded_list); @@ -612,7 +612,7 @@ int dap_chain_net_srv_stake_load_cache(dap_chain_net_t *a_net) (dap_chain_net_srv_stake_cache_data_t *)l_objs[i].value; dap_chain_net_srv_stake_cache_item_t *l_cache = DAP_NEW_Z(dap_chain_net_srv_stake_cache_item_t); if (!l_cache) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -3; } l_cache->signing_addr = l_cache_data->signing_addr; @@ -835,7 +835,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(dap_hash_fast_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_tsd->type = DAP_CHAIN_DATUM_DECREE_TSD_TYPE_HASH; @@ -846,7 +846,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(uint256_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return NULL; } @@ -858,7 +858,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(dap_chain_addr_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return NULL; } @@ -870,7 +870,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(dap_chain_node_addr_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return NULL; } @@ -881,7 +881,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t l_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, sizeof(dap_chain_datum_decree_t) + l_total_tsd_size); if (!l_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return NULL; } @@ -922,7 +922,7 @@ dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t size_t l_sign_size = dap_sign_get_size(l_sign); l_decree = DAP_REALLOC(l_decree, sizeof(dap_chain_datum_decree_t) + l_cur_sign_offset + l_sign_size); if (!l_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_sign); return NULL; } @@ -1098,7 +1098,7 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne l_total_tsd_size += sizeof(dap_tsd_t) + sizeof(dap_chain_addr_t); l_tsd = DAP_NEW_Z_SIZE(dap_tsd_t, l_total_tsd_size); if (!l_tsd) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_tsd->type = DAP_CHAIN_DATUM_DECREE_TSD_TYPE_STAKE_SIGNING_ADDR; @@ -1108,7 +1108,7 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne l_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, sizeof(dap_chain_datum_decree_t) + l_total_tsd_size); if (!l_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_list_free_full(l_tsd_list, NULL); return NULL; } @@ -1150,7 +1150,7 @@ static dap_chain_datum_decree_t *s_stake_decree_invalidate(dap_chain_net_t *a_ne size_t l_sign_size = dap_sign_get_size(l_sign); l_decree = DAP_REALLOC(l_decree, sizeof(dap_chain_datum_decree_t) + l_cur_sign_offset + l_sign_size); if (!l_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_sign); return NULL; } @@ -1326,6 +1326,10 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); return -8; } + if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); + return -20; + } // Create the order & put it in GDB char *l_order_hash_str = s_fee_order_create(l_net, &l_value, l_cert->enc_key, a_hash_out_type); if (l_order_hash_str) { @@ -1383,6 +1387,10 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't load cert %s", l_cert_str); return -8; } + if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); + return -20; + } dap_chain_addr_t l_signing_addr; dap_chain_addr_fill_from_key(&l_signing_addr, l_cert->enc_key, l_net->pub.id); dap_chain_node_addr_t l_node_addr = g_node_addr; @@ -1498,6 +1506,10 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi DAP_DELETE(l_tx_hash_str); return -8; } + if (!l_cert->enc_key || !l_cert->enc_key->priv_key_data || !l_cert->enc_key->priv_key_data_size) { + dap_cli_server_cmd_set_reply_text(a_str_reply, "Certificate \"%s\" has no private key", l_cert_str); + return -20; + } DAP_DEL_Z(l_default_cert_str); char *l_order_hash_str = s_staker_order_create(l_net, l_value, &l_tx_hash, l_cert->enc_key, a_hash_out_type); if (!l_order_hash_str) { @@ -1597,7 +1609,11 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi size_t l_orders_count = 0; dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); for (size_t i = 0; i < l_orders_count; i++) { - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); + continue; + } if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID && l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS) continue; @@ -2216,9 +2232,8 @@ static int s_callback_compare_tx_list(dap_list_t *a_datum1, dap_list_t *a_datum2 int dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, dap_hash_fast_t *a_tx_hash, dap_chain_ch_validator_test_t * out_data, int a_time_connect, int a_time_respone) { - char *l_key = NULL; size_t l_node_info_size = 0; - uint8_t l_test_data[1024] = {0}; + uint8_t l_test_data[DAP_CHAIN_NET_CH_VALIDATOR_READY_REQUEST_SIZE] = {0}; dap_chain_node_client_t *l_node_client = NULL; dap_chain_node_info_t *l_remote_node_info = NULL; dap_ledger_t *l_ledger = dap_ledger_by_net_name(a_net->pub.name); @@ -2290,7 +2305,8 @@ int dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, dap_hash_fa if (l_sign_correct) l_sign_correct = !dap_sign_verify_all(l_sign, validators_data->header.sign_size, l_test_data, sizeof(l_test_data)); } - l_overall_correct = l_sign_correct && validators_data->header.flags == 0xCF; + l_overall_correct = l_sign_correct && (validators_data->header.flags & A_PROC) && (validators_data->header.flags & F_ORDR) && + (validators_data->header.flags & D_SIGN) && (validators_data->header.flags & F_CERT); *out_data = *validators_data; out_data->header.sign_correct = l_sign_correct ? 1 : 0; out_data->header.overall_correct = l_overall_correct ? 1 : 0; @@ -2397,7 +2413,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) int res = dap_chain_net_srv_stake_check_validator(l_net, &l_tx, &l_out, 10000, 15000); switch (res) { case -4: - dap_cli_server_cmd_set_reply_text(a_str_reply,"Requested conditional transaction has no requires conditional output"); + dap_cli_server_cmd_set_reply_text(a_str_reply,"Requested conditional transaction has no required conditional output"); return -30; break; case -5: @@ -2610,7 +2626,7 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) } struct get_tx_cond_pos_del_from_tx * l_args = DAP_NEW_Z(struct get_tx_cond_pos_del_from_tx); if(!l_args) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_cli_server_cmd_set_reply_text(a_str_reply, "Out of memory"); return -1; } @@ -2798,17 +2814,20 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, uint256_t *a_max_fee, uint256_t *a_average_fee, uint256_t *a_min_fee, uint256_t *a_median_fee) { - if (!a_net) - return false; - char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net); + dap_return_val_if_fail(a_net, false); + char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net); size_t l_orders_count = 0; - dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); - DAP_DELETE( l_gdb_group_str); + dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); + DAP_DELETE(l_gdb_group_str); uint256_t l_min = uint256_0, l_max = uint256_0, l_average = uint256_0, l_median = uint256_0; uint64_t l_order_fee_count = 0; uint256_t l_all_fees[l_orders_count * sizeof(uint256_t)]; for (size_t i = 0; i < l_orders_count; i++) { - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); + continue; + } if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID) continue; if (l_order_fee_count == 0) { @@ -2831,15 +2850,16 @@ bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, l_max = l_order->price; } } + dap_global_db_objs_delete(l_orders, l_orders_count); uint256_t t = uint256_0; - if (!IS_ZERO_256(l_average)) DIV_256(l_average, dap_chain_uint256_from(l_order_fee_count), &t); + if (!IS_ZERO_256(l_average)) + DIV_256(l_average, dap_chain_uint256_from(l_order_fee_count), &t); l_average = t; if (l_order_fee_count) { l_median = l_all_fees[(size_t)(l_order_fee_count * 2 / 3)]; } - dap_global_db_objs_delete(l_orders, l_orders_count); if (a_min_fee) *a_min_fee = l_min; if (a_average_fee) diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 0469a280fca7fad2314fcaa23b313c07616db1f0..19ca297c30461b77eaabcba70e1fca5096f64dfe 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -45,7 +45,6 @@ typedef struct dap_chain_net_srv_stake_item { UT_hash_handle hh, ht; } dap_chain_net_srv_stake_item_t; - typedef struct dap_chain_net_srv_stake_cache_data { dap_chain_hash_fast_t tx_hash; dap_chain_addr_t signing_addr; diff --git a/modules/service/voting/dap_chain_net_srv_voting.c b/modules/service/voting/dap_chain_net_srv_voting.c index 2f9597ab7cb20a6ecdedc87b8ea5265c5d6c5218..4f294dbc59edcd32546202bd33929f273d26157b 100644 --- a/modules/service/voting/dap_chain_net_srv_voting.c +++ b/modules/service/voting/dap_chain_net_srv_voting.c @@ -158,7 +158,7 @@ uint64_t* dap_chain_net_voting_get_result(dap_ledger_t* a_ledger, dap_chain_hash l_voting_results = DAP_NEW_Z_SIZE(uint64_t, sizeof(uint64_t)*dap_list_length(l_voting->voting_params.option_offsets_list)); if (!l_voting_results){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index bc70d6a6b4daa34db798af19c8d1137392b0b213..be273aff004cde2f5ccbbdde96354eaf390cdd1a 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -294,7 +294,7 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in assert(a_data_size > sizeof (dap_os_iphdr_t)); ch_vpn_pkt_t *l_pkt_out = DAP_NEW_Z_SIZE(ch_vpn_pkt_t, sizeof(l_pkt_out->header) + a_data_size); if (!l_pkt_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return false; } l_pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_RECV; @@ -335,7 +335,7 @@ static bool s_tun_client_send_data(dap_chain_net_srv_ch_vpn_info_t * l_ch_vpn_in /* Shift it to other worker context */ tun_socket_msg_t* l_msg = DAP_NEW_Z(tun_socket_msg_t); if (!l_msg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_pkt_out); return false; } @@ -417,7 +417,7 @@ static void s_tun_recv_msg_callback(dap_events_socket_t * a_esocket_queue, void }else{ l_new_info = DAP_NEW_Z(dap_chain_net_srv_ch_vpn_info_t); if (!l_new_info) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_msg); return; } @@ -495,7 +495,7 @@ static void s_tun_send_msg_ip_assigned(uint32_t a_worker_own_id, uint32_t a_work { struct tun_socket_msg * l_msg = DAP_NEW_Z(struct tun_socket_msg); if (!l_msg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_msg->type = TUN_SOCKET_MSG_IP_ASSIGNED; @@ -536,7 +536,7 @@ static void s_tun_send_msg_ip_unassigned(uint32_t a_worker_own_id, uint32_t a_wo { struct tun_socket_msg * l_msg = DAP_NEW_Z(struct tun_socket_msg); if (!l_msg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_msg->type = TUN_SOCKET_MSG_IP_UNASSIGNED; @@ -585,7 +585,7 @@ static void s_tun_send_msg_esocket_reassigned_inter(uint32_t a_worker_own_id, da { struct tun_socket_msg * l_msg = DAP_NEW_Z(struct tun_socket_msg); if (!l_msg) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_msg->type = TUN_SOCKET_MSG_ESOCKET_REASSIGNED ; @@ -701,10 +701,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) // Create utun socket int l_tun_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL); if( l_tun_fd < 0){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Opening utun device control (SYSPROTO_CONTROL) error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -101; goto lb_err; } @@ -713,10 +711,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) // Pass control structure to the utun socket if( ioctl(l_tun_fd, CTLIOCGINFO, &l_ctl_info ) < 0 ){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO): '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't execute ioctl(CTLIOCGINFO), error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -102; goto lb_err; @@ -739,10 +735,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) break; } if (l_ret < 0){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't create utun device: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't create utun device, error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -103; goto lb_err; @@ -753,10 +747,8 @@ static int s_vpn_tun_create(dap_config_t * g_config) char l_utunname[20]; socklen_t l_utunname_len = sizeof(l_utunname); if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ){ - int l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't get utun device name: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR, "Can't get utun device name, error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -104; goto lb_err; } @@ -771,13 +763,14 @@ static int s_vpn_tun_create(dap_config_t * g_config) #if !defined(DAP_OS_DARWIN) &&( defined (DAP_OS_LINUX) || defined (DAP_OS_BSD)) int l_tun_fd; if( (l_tun_fd = open("/dev/net/tun", O_RDWR | O_NONBLOCK)) < 0 ) { - log_it(L_ERROR,"Opening /dev/net/tun error: '%s'", strerror(errno)); + log_it(L_ERROR, "Opening /dev/net/tun error %d: \"%s\"", + errno, dap_strerror(errno)); l_err = -100; break; } log_it(L_DEBUG,"Opening /dev/net/tun:%u", i); if( (l_err = ioctl(l_tun_fd, TUNSETIFF, (void *)& s_raw_server->ifr)) < 0 ) { - log_it(L_CRITICAL, "ioctl(TUNSETIFF) error: '%s' ",strerror(errno)); + log_it(L_CRITICAL, "ioctl(TUNSETIFF) error %d: \"%s\"", errno, dap_strerror(errno)); close(l_tun_fd); break; } @@ -843,7 +836,7 @@ static int s_vpn_tun_init() { s_raw_server=DAP_NEW_Z(vpn_local_network_t); if (!s_raw_server) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } pthread_rwlock_init(&s_raw_server->rwlock, NULL); @@ -879,7 +872,7 @@ static int s_vpn_service_create(dap_config_t * g_config) dap_chain_net_srv_vpn_t* l_srv_vpn = DAP_NEW_Z( dap_chain_net_srv_vpn_t); if(!l_srv_vpn) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_srv->_internal = l_srv_vpn; @@ -1247,7 +1240,7 @@ void s_ch_vpn_new(dap_stream_ch_t* a_ch, void* a_arg) a_ch->internal = DAP_NEW_Z(dap_chain_net_srv_ch_vpn_t); if (!a_ch->internal) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } dap_chain_net_srv_ch_vpn_t * l_srv_vpn = CH_VPN(a_ch); @@ -1310,7 +1303,7 @@ static void s_ch_vpn_delete(dap_stream_ch_t* a_ch, void* arg) log_it(L_DEBUG, "Unlease address %s and store in treshold", inet_ntoa(l_ch_vpn->addr_ipv4)); dap_chain_net_srv_vpn_item_ipv4_t * l_item_unleased = DAP_NEW_Z(dap_chain_net_srv_vpn_item_ipv4_t); if (!l_item_unleased) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_rwlock_unlock(&s_clients_rwlock); return; } @@ -1475,7 +1468,7 @@ static void send_pong_pkt(dap_stream_ch_t* a_ch) // log_it(L_DEBUG,"---------------------------------- PONG!"); ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); if (!pkt_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } pkt_out->header.op_code = VPN_PACKET_OP_CODE_PONG; @@ -1491,7 +1484,8 @@ static void send_pong_pkt(dap_stream_ch_t* a_ch) * @param a_ch * @param a_usage */ -static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_net_srv_usage_t * a_usage){ +static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t *a_ch, dap_chain_net_srv_usage_t *a_usage) +{ dap_chain_net_srv_ch_vpn_t *l_ch_vpn = CH_VPN(a_ch); dap_chain_net_srv_vpn_t *l_srv_vpn = (dap_chain_net_srv_vpn_t*)a_usage->service->_internal; dap_chain_net_srv_stream_session_t *l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION(l_ch_vpn->ch->stream->session); @@ -1503,7 +1497,7 @@ static void s_ch_packet_in_vpn_address_request(dap_stream_ch_t* a_ch, dap_chain_ log_it(L_WARNING, "IP address is already leased"); ch_vpn_pkt_t* pkt_out = DAP_NEW_STACK_SIZE(ch_vpn_pkt_t, sizeof(pkt_out->header)); if (!pkt_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM; @@ -1691,10 +1685,12 @@ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) { dap_stream_ch_pkt_t * l_pkt = (dap_stream_ch_pkt_t *) a_arg; ch_vpn_pkt_t *l_vpn_pkt = (ch_vpn_pkt_t*)l_pkt->data; - size_t l_vpn_pkt_size = l_pkt->hdr.data_size; - if (l_vpn_pkt_size < sizeof(l_vpn_pkt->header)) + if (l_pkt->hdr.data_size < sizeof(l_vpn_pkt->header)) { + log_it(L_WARNING, "Data size of stream channel packet %u is lesser than size of VPN packet header %zu", + l_pkt->hdr.data_size, sizeof(l_vpn_pkt->header)); return false; - + } + size_t l_vpn_pkt_data_size = l_pkt->hdr.data_size - sizeof(l_vpn_pkt->header); dap_chain_net_srv_stream_session_t * l_srv_session = DAP_CHAIN_NET_SRV_STREAM_SESSION (a_ch->stream->session ); // dap_chain_net_srv_ch_vpn_t *l_ch_vpn = CH_VPN(a_ch); dap_chain_net_srv_usage_t * l_usage = l_srv_session->usage_active;// dap_chain_net_srv_usage_find_unsafe(l_srv_session, l_ch_vpn->usage_id); @@ -1729,29 +1725,28 @@ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } // TODO move address leasing to this structure - //dap_chain_net_srv_vpn_t * l_srv_vpn =(dap_chain_net_srv_vpn_t *) l_usage->service->_internal; - l_vpn_pkt_size -= sizeof (l_vpn_pkt->header); debug_if(s_debug_more, L_INFO, "Got srv_vpn packet with op_code=0x%02x", l_vpn_pkt->header.op_code); if(l_vpn_pkt->header.op_code >= 0xb0) { // Raw packets switch (l_vpn_pkt->header.op_code) { case VPN_PACKET_OP_CODE_PING: a_ch->stream->esocket->last_ping_request = time(NULL); - l_srv_session->stats.bytes_recv += l_vpn_pkt_size; + l_srv_session->stats.bytes_recv += l_vpn_pkt_data_size; l_srv_session->stats.packets_recv++; send_pong_pkt(a_ch); break; case VPN_PACKET_OP_CODE_PONG: a_ch->stream->esocket->last_ping_request = time(NULL); - l_srv_session->stats.bytes_recv += l_vpn_pkt_size; + l_srv_session->stats.bytes_recv += l_vpn_pkt_data_size; l_srv_session->stats.packets_recv++; break; // for client case VPN_PACKET_OP_CODE_VPN_ADDR_REPLY: { // Assigned address for peer - if(ch_sf_tun_addr_leased(CH_VPN(a_ch), l_vpn_pkt, l_vpn_pkt_size) < 0) { + if(ch_sf_tun_addr_leased(CH_VPN(a_ch), l_vpn_pkt, l_pkt->hdr.data_size) < 0) { log_it(L_ERROR, "Can't create tun"); - }else - s_tun_send_msg_ip_assigned_all(a_ch->stream_worker->worker->id, CH_VPN(a_ch), CH_VPN(a_ch)->addr_ipv4); - l_srv_session->stats.bytes_recv += l_vpn_pkt_size; + break; + } + s_tun_send_msg_ip_assigned_all(a_ch->stream_worker->worker->id, CH_VPN(a_ch), CH_VPN(a_ch)->addr_ipv4); + l_srv_session->stats.bytes_recv += l_pkt->hdr.data_size; l_srv_session->stats.packets_recv++; } break; // for server @@ -1765,11 +1760,16 @@ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_stream_ch_pkt_write_unsafe( l_usage->client->ch , DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR, &l_err, sizeof (l_err)); } - l_srv_session->stats.bytes_recv += l_vpn_pkt_size; + l_srv_session->stats.bytes_recv += l_pkt->hdr.data_size; l_srv_session->stats.packets_recv++; } break; // for client only case VPN_PACKET_OP_CODE_VPN_RECV:{ + if (l_vpn_pkt_data_size != l_vpn_pkt->header.op_data.data_size) { + log_it(L_WARNING, "Size of VPN packet data %zu is not equal to estimated size %u", + l_vpn_pkt_data_size, l_vpn_pkt->header.op_data.data_size); + return false; + } a_ch->stream->esocket->last_ping_request = time(NULL); // not ping, but better ;-) dap_events_socket_t *l_es = dap_chain_net_vpn_client_tun_get_esock(); // Find tun socket for current worker @@ -1786,9 +1786,13 @@ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_srv_session->stats.packets_sent_lost++; } } break; - // for server only case VPN_PACKET_OP_CODE_VPN_SEND: { + if (l_vpn_pkt_data_size != l_vpn_pkt->header.op_data.data_size) { + log_it(L_WARNING, "Size of VPN packet data %zu is not equal to estimated size %u", + l_vpn_pkt_data_size, l_vpn_pkt->header.op_data.data_size); + return false; + } dap_chain_net_srv_vpn_tun_socket_t *l_tun = s_tun_sockets[a_ch->stream_worker->worker->id]; assert(l_tun); size_t l_ret = dap_events_socket_write_unsafe(l_tun->es, l_vpn_pkt, @@ -1807,6 +1811,7 @@ static bool s_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } break; default: log_it(L_WARNING, "Can't process SF type 0x%02x", l_vpn_pkt->header.op_code); + return false; } } return true; @@ -1904,12 +1909,11 @@ static bool s_es_tun_write(dap_events_socket_t *a_es, void *arg) l_tun->es->buf_out_size -= l_pkt_size; l_shift += l_pkt_size; break; - default: { - char l_errbuf[128]; - strerror_r(l_errno, l_errbuf, sizeof(l_errbuf)); - log_it(L_ERROR, "Error on writing to tun: \"%s\" code %d", l_errbuf, errno); + default: + log_it(L_ERROR, "Write to tun error %d: \"%s\"", + errno, dap_strerror(errno)); break; - }} + } break; // Finish the buffer processing immediately } } diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index df23f1f0e6e724586b4817d77171e1e2eda2d3c2..03ea305bfad2f114c215134cbacebf109461d008 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -183,7 +183,7 @@ static int s_callback_client_success(dap_chain_net_srv_t * a_srv, uint32_t a_usa size_t l_ipv4_str_len = 0; //dap_strlen(a_ipv4_str); ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len); if (!pkt_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_stream_session_unlock(); return -1; } @@ -494,11 +494,11 @@ char *dap_chain_net_vpn_client_check_result(dap_chain_net_t *a_net, const char* int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_host, uint16_t a_port, size_t a_data_size_to_send, size_t a_data_size_to_recv, int a_timeout_test_ms) { dap_return_val_if_fail(a_net && a_host && (*a_host) && a_port, -1); - // default 10k + // default 1k if(a_data_size_to_send== (size_t) -1) - a_data_size_to_send = 10240; + a_data_size_to_send = 1024; if(a_data_size_to_recv== (size_t) -1) - a_data_size_to_recv = 10240; + a_data_size_to_recv = 1024; // default 10 sec = 10000 ms if(a_timeout_test_ms==-1) a_timeout_test_ms = 10000; @@ -752,12 +752,12 @@ int dap_chain_net_vpn_client_init(dap_config_t * g_config) // vpn client command dap_cli_server_cmd_add ("vpn_client", com_vpn_client, "VPN client control", - "vpn_client [start -addr <server address> -port <server port>| stop | status] -net <net name>\n" - "vpn_client init -w <wallet name> -token <token name> -value <value> -net <net name>\n" - "vpn_client stop -net <net name>\n" - "vpn_client status -net <net name>\n" - "vpn_client check -addr <ip addr> -port <port> -net <net name>\n" - "vpn_client check result -net <net name> [-H hex|base58(default)]\n" + "vpn_client [start -addr <server_address> -port <server_port>|stop|status] -net <net_name>\n" + "vpn_client init -w <wallet_name> -token <token_name> -value <value> -net <net_name>\n" + "vpn_client stop -net <net_name>\n" + "vpn_client status -net <net_name>\n" + "vpn_client check -addr <ip_addr> -port <port> -net <net_name>\n" + "vpn_client check result -net <net_name> [-H hex|base58(default)]\n" ); dap_chain_net_srv_uid_t l_uid = { .uint64 = DAP_CHAIN_NET_SRV_VPN_ID }; diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index 028eec5d05bf83f410f83eec93a666bc08a45472..f5de32b36fd1feed2f823239d4ade8858b8b51a0 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -147,20 +147,14 @@ int tun_device_create(char *dev) // Create utun socket int l_tun_fd = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL); if( l_tun_fd < 0){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error: '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR,"Opening utun device control (SYSPROTO_CONTROL) error %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } log_it(L_INFO, "Utun SYSPROTO_CONTROL descriptor obtained"); // Pass control structure to the utun socket if( ioctl(l_tun_fd, CTLIOCGINFO, &l_ctl_info ) < 0 ){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO): '%s' (code %d)", l_errbuf, l_errno); + log_it(L_ERROR,"Can't execute ioctl(CTLIOCGINFO) %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } @@ -181,11 +175,8 @@ int tun_device_create(char *dev) if(l_ret == 0) break; } - if (l_ret < 0){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't create utun device: '%s' (code %d)", l_errbuf, l_errno); + if (l_ret < 0) { + log_it(L_ERROR,"Can't create utun device %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } @@ -194,11 +185,8 @@ int tun_device_create(char *dev) log_it(L_NOTICE, "Utun device created"); char l_utunname[20]; socklen_t l_utunname_len = sizeof(l_utunname); - if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ){ - l_errno = errno; - char l_errbuf[256]; - strerror_r(l_errno, l_errbuf,sizeof(l_errbuf)); - log_it(L_ERROR,"Can't get utun device name: '%s' (code %d)", l_errbuf, l_errno); + if (getsockopt(l_tun_fd, SYSPROTO_CONTROL, UTUN_OPT_IFNAME, l_utunname, &l_utunname_len) ) { + log_it(L_ERROR,"Can't get utun device name %d: \"%s\"", errno, dap_strerror(errno)); goto lb_err; } log_it(L_NOTICE, "Utun device name \"%s\"", l_utunname); @@ -679,11 +667,11 @@ void ch_sf_tun_client_send(dap_chain_net_srv_ch_vpn_t * ch_sf, void * pkt_data, if((ret = /*sendto(ch_sf->raw_l3_sock, pkt_data, pkt_data_size, 0, (struct sockaddr *) &sin, sizeof(sin))*/-1 ) < 0) { // if((ret = write(raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size))<0){ - log_it(L_ERROR, "write() returned error %d : '%s'", ret, strerror(errno)); + log_it(L_ERROR, "write() error %d : \"%s\"", errno, dap_strerror(errno)); //log_it(ERROR,"raw socket ring buffer overflowed"); ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header)); if (!pkt_out) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); if(in_daddr_str) DAP_DELETE(in_daddr_str); if(in_saddr_str) diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h index 877082a4c85923154bb852d64157006a9397a359..dbcbaa095b276cb86c6a9f8b7384bf6d7aa5e00c 100644 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h +++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h @@ -92,19 +92,6 @@ typedef struct ch_vpn_pkt { typedef struct dap_chain_net_srv_vpn_tun_socket dap_chain_net_srv_vpn_tun_socket_t; typedef struct dap_chain_net_srv_ch_vpn dap_chain_net_srv_ch_vpn_t; - - -// Copy is present on each tun socket -typedef struct usage_client { - dap_chain_net_srv_ch_vpn_t * ch_vpn; - dap_chain_datum_tx_receipt_t * receipt; - size_t receipt_size; - uint32_t usage_id; - dap_chain_net_srv_t * srv; - dap_chain_net_srv_vpn_tun_socket_t * tun_socket; - UT_hash_handle hh; -} usage_client_t; - typedef struct dap_chain_net_srv_ch_vpn_info dap_chain_net_srv_ch_vpn_info_t; typedef struct dap_chain_net_srv_vpn_tun_socket { diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index e0cd881759eca86387e9f19fccbdcc42c57d51c6..9c18f5e41d7c9a66d352ab8697ecfa6a678698cc 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -151,9 +151,9 @@ int dap_chain_net_srv_xchange_init() "\tCreate a new order and tx with specified amount of datoshi to exchange with specified rate (buy / sell)\n" "srv_xchange order remove -net <net_name> -order <order_hash> -w <wallet_name> -fee <value_datoshi>\n" "\tRemove order with specified order hash in specified net name\n" - "srv_xchange order history -net <net_name> {-order <order_hash> | -addr <wallet_addr>}" + "srv_xchange order history -net <net_name> {-order <order_hash> | -addr <wallet_addr>}\n" "\tShows transaction history for the selected order\n" - "srv_xchange order status -net <net_name> -order <order_hash>" + "srv_xchange order status -net <net_name> -order <order_hash>\n" "\tShows current amount of unselled coins from the selected order and percentage of its completion\n" "srv_xchange orders -net <net_name> [-status {opened|closed|all}] [-token_from <token_ticker>] [-token_to <token_ticker>] [-limit <limit>] [-offset <offset>]\n" "\tGet the exchange orders list within specified net name\n" @@ -161,7 +161,7 @@ int dap_chain_net_srv_xchange_init() "srv_xchange purchase -order <order hash> -net <net_name> -w <wallet_name> -value <value> -fee <value>\n" "\tExchange tokens with specified order within specified net name. Specify how many datoshies to sell with rate specified by order\n" - "srv_xchange tx_list -net <net_name> [-time_from <From time>] [-time_to <To time>]" + "srv_xchange tx_list -net <net_name> [-time_from <From_time>] [-time_to <To_time>]" "[[-addr <wallet_addr> [-status {inactive|active|all}] ]\n" /* @RRL: #6294 */ "\tList of exchange transactions\n" "\tAll times are in RFC822. For example: \"Thu, 7 Dec 2023 21:18:04\"\n" @@ -194,7 +194,7 @@ int dap_chain_net_srv_xchange_init() dap_chain_net_srv_t* l_srv = dap_chain_net_srv_add(l_uid, "srv_xchange", &l_srv_callbacks); s_srv_xchange = DAP_NEW_Z(dap_chain_net_srv_xchange_t); if (!s_srv_xchange || !l_srv) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_srv->_internal = s_srv_xchange; @@ -208,7 +208,7 @@ int dap_chain_net_srv_xchange_init() uint256_t l_fee_value = dap_chain_coins_to_balance(dap_config_get_item_str_default(g_config, "srv_xchange", "fee_value", "0.02")); const char *l_wallet_addr = dap_config_get_item_str_default(g_config, "srv_xchange", "wallet_addr", NULL); if(!l_wallet_addr){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } const char *l_net_str = dap_config_get_item_str_default(g_config, "srv_xchange", "net", NULL); @@ -414,7 +414,7 @@ static dap_chain_datum_tx_receipt_t *s_xchange_receipt_create(dap_chain_net_srv_ uint32_t l_ext_size = sizeof(uint256_t) + DAP_CHAIN_TICKER_SIZE_MAX; uint8_t *l_ext = DAP_NEW_STACK_SIZE(uint8_t, l_ext_size); if (!l_ext) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } memcpy(l_ext, &a_datoshi_buy, sizeof(uint256_t)); @@ -1122,7 +1122,7 @@ dap_chain_net_srv_xchange_price_t *s_xchange_price_from_order(dap_chain_net_t *a return NULL; dap_chain_net_srv_xchange_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t); if (!l_price) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_price->creation_date = a_order->header.ts_created; @@ -1568,17 +1568,14 @@ static int s_cli_srv_xchange_order(int a_argc, char **a_argv, int a_arg_index, v l_cp_rate = dap_chain_balance_to_coins(l_price->rate); // must be free'd - char l_tmp_buf[DAP_TIME_STR_SIZE] = {}; - dap_time_t l_ts_create = (dap_time_t)l_tx->header.ts_created; - dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_ts_create); - l_tmp_buf[strlen(l_tmp_buf) - 1] = '\0'; - + char l_tmp_buf[DAP_TIME_STR_SIZE]; + dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_tx->header.ts_created); if (l_out_cond_last_tx) l_amount_datoshi_str = dap_uint256_to_char(l_out_cond_last_tx->header.value, &l_amount_coins_str); - dap_cli_server_cmd_set_reply_text(a_str_reply, "orderHash: %s\n ts_created: %s (%"DAP_UINT64_FORMAT_U")\n Status: %s, amount: %s (%s) %s, filled: %lu%%, rate (%s/%s): %s, net: %s\n\n", + dap_cli_server_cmd_set_reply_text(a_str_reply, "orderHash: %s\n ts_created: %s\n Status: %s, amount: %s (%s) %s, filled: %lu%%, rate (%s/%s): %s, net: %s\n\n", dap_chain_hash_fast_to_str_static(&l_tx_hash), - l_tmp_buf, l_ts_create, l_status_order, + l_tmp_buf, l_status_order, l_amount_coins_str ? l_amount_coins_str : "0.0", l_amount_datoshi_str ? l_amount_datoshi_str : "0", l_price->token_sell, l_percent_completed, @@ -1913,7 +1910,7 @@ dap_string_t *l_reply_str; size_t l_tx_total; if ( !(l_reply_str = dap_string_new("")) ) /* Prepare output string discriptor*/ - return log_it(L_CRITICAL, "%s", g_error_memory_alloc), -ENOMEM; + return log_it(L_CRITICAL, "%s", c_error_memory_alloc), -ENOMEM; memset(&l_tx_first_hash, 0, sizeof(dap_chain_hash_fast_t)); /* Initial hash == zero */ @@ -2118,16 +2115,13 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) uint64_t l_percent_completed = dap_chain_net_srv_xchange_get_order_completion_rate(l_net, l_tx_hash); char l_tmp_buf[DAP_TIME_STR_SIZE]; - dap_time_t l_ts_create = l_tx->header.ts_created; - dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_ts_create); - l_tmp_buf[strlen(l_tmp_buf) - 1] = '\0'; - + dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_tx->header.ts_created); l_cp_rate = dap_chain_balance_to_coins(l_price->rate); const char *l_amount_coins_str = NULL, *l_amount_datoshi_str = l_out_cond_last_tx ? dap_uint256_to_char(l_out_cond_last_tx->header.value, &l_amount_coins_str) : NULL; - dap_string_append_printf(l_reply_str, "orderHash: %s\n ts_created: %s (%"DAP_UINT64_FORMAT_U")\n Status: %s, amount: %s (%s) %s, filled: %lu%%, rate (%s/%s): %s, net: %s\n\n", l_tx_hash_str, - l_tmp_buf, l_ts_create, l_status_order, + dap_string_append_printf(l_reply_str, "orderHash: %s\n ts_created: %s\n Status: %s, amount: %s (%s) %s, filled: %lu%%, rate (%s/%s): %s, net: %s\n\n", l_tx_hash_str, + l_tmp_buf, l_status_order, l_amount_coins_str ? l_amount_coins_str : "0.0", l_amount_datoshi_str ? l_amount_datoshi_str : "0", l_price->token_sell, l_percent_completed, @@ -2428,12 +2422,11 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) char l_tmp_buf[DAP_TIME_STR_SIZE]; dap_time_to_str_rfc822(l_tmp_buf, DAP_TIME_STR_SIZE, l_last_rate_time); - l_tmp_buf[strlen(l_tmp_buf) - 1] = '\0'; const char *l_rate_average_str; dap_uint256_to_char(l_rate_average, &l_rate_average_str); - dap_string_append_printf(l_reply_str,"Average rate: %s \r\n", l_rate_average_str); + dap_string_append_printf(l_reply_str,"Average rate: %s\n", l_rate_average_str); const char *l_last_rate_str; dap_uint256_to_char(l_rate, &l_last_rate_str); - dap_string_append_printf(l_reply_str, "Last rate: %s Last rate time: %s (%"DAP_UINT64_FORMAT_U")", - l_last_rate_str, l_tmp_buf, l_last_rate_time); + dap_string_append_printf(l_reply_str, "Last rate: %s Last rate time: %s", + l_last_rate_str, l_tmp_buf); *a_str_reply = dap_string_free(l_reply_str, false); break; }else if (strcmp(l_price_subcommand,"history") == 0){ @@ -2453,7 +2446,7 @@ static int s_cli_srv_xchange(int a_argc, char **a_argv, void **a_str_reply) size_t l_datum_num = dap_list_length(l_datum_list0); if (l_datum_num == 0){ - dap_cli_server_cmd_set_reply_text(a_str_reply,"Can't find transactions"); + dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't find transactions"); return -6; } size_t l_arr_start = 0; @@ -2712,7 +2705,7 @@ dap_chain_net_srv_xchange_create_error_t dap_chain_net_srv_xchange_create(dap_ch // Create the price dap_chain_net_srv_xchange_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t); if (!l_price) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return XCHANGE_CREATE_ERROR_MEMORY_ALLOCATED; } dap_stpcpy(l_price->token_sell, a_token_sell); diff --git a/modules/type/blocks/dap_chain_block.c b/modules/type/blocks/dap_chain_block.c index 304c1f11289109cba43d1a97b67bf70cb6533683..760f1b45fc045830008a5a843da9b391b122155b 100644 --- a/modules/type/blocks/dap_chain_block.c +++ b/modules/type/blocks/dap_chain_block.c @@ -401,7 +401,7 @@ dap_chain_datum_t** dap_chain_block_get_datums(const dap_chain_block_t *a_block, dap_chain_datum_t * l_datum =(dap_chain_datum_t *) (a_block->meta_n_datum_n_sign + l_offset); dap_chain_datum_t **l_ret = DAP_NEW_Z_SIZE(dap_chain_datum_t *, sizeof(dap_chain_datum_t *) * a_block->hdr.datum_count); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } for(size_t n=0; n<a_block->hdr.datum_count && l_offset<(a_block_size-sizeof (a_block->hdr)) ; n++){ diff --git a/modules/type/blocks/dap_chain_block_cache.c b/modules/type/blocks/dap_chain_block_cache.c index ce599f2b09abb86e26129e6e6bafbbc6e351c6c9..b3e9a031664af71565adcd7246bd017fe101cf05 100644 --- a/modules/type/blocks/dap_chain_block_cache.c +++ b/modules/type/blocks/dap_chain_block_cache.c @@ -61,12 +61,12 @@ dap_chain_block_cache_t *dap_chain_block_cache_new(dap_hash_fast_t *a_block_hash dap_chain_block_cache_t * l_block_cache = DAP_NEW_Z(dap_chain_block_cache_t); if (!l_block_cache) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_block_cache->block = a_copy_block ? DAP_DUP_SIZE(a_block, a_block_size) : a_block; if (!l_block_cache->block) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_block_cache); return NULL; } @@ -93,7 +93,7 @@ dap_chain_block_cache_t * dap_chain_block_cache_dup(dap_chain_block_cache_t * a_ { dap_chain_block_cache_t *l_ret = DAP_DUP(a_block); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->hh = (UT_hash_handle){ }; // Drop hash handle to prevent its usage @@ -181,7 +181,7 @@ dap_list_t * dap_chain_block_get_list_tx_cond_outs_with_val(dap_ledger_t *a_ledg if (!dap_ledger_tx_hash_is_used_out_item (a_ledger, l_tx_hash, l_out_idx_tmp, NULL)) { dap_chain_tx_used_out_item_t *l_item = DAP_NEW_Z(dap_chain_tx_used_out_item_t); if (!l_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); if (l_list_used_out) dap_list_free_full(l_list_used_out, NULL); return NULL; diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c index c29d1ec425ed3e0c7debed32245bbdb8ec15b7ed..697a99523b062e6a7c61a392aa4799da611426c7 100644 --- a/modules/type/blocks/dap_chain_block_chunk.c +++ b/modules/type/blocks/dap_chain_block_chunk.c @@ -38,7 +38,7 @@ dap_chain_block_chunks_t * dap_chain_block_chunks_create(dap_chain_cs_blocks_t * assert(a_blocks->chain); dap_chain_block_chunks_t * l_ret = DAP_NEW_Z(dap_chain_block_chunks_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->blocks = a_blocks; @@ -110,7 +110,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl // Init cache-hash object l_chunk_cache_hash = DAP_NEW_Z(dap_chain_block_cache_hash_t); if (!l_chunk_cache_hash) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_chunk_cache_hash->block_cache=a_block_cache; @@ -136,7 +136,7 @@ void dap_chain_block_chunks_add(dap_chain_block_chunks_t * a_chunks,dap_chain_bl // Init cache-hash object l_chunk_cache_hash = DAP_NEW_Z(dap_chain_block_cache_hash_t); if (!l_chunk_cache_hash) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_chunk_cache_hash->block_cache=a_block_cache; @@ -168,7 +168,7 @@ dap_chain_block_chunk_t * dap_chain_block_chunk_create(dap_chain_block_chunks_t { dap_chain_block_chunk_t * l_chunk = DAP_NEW_Z(dap_chain_block_chunk_t); if (!l_chunk) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } // Add in tail diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 86bf719e88b7da036ff270137406456d04a7e010..ec33832dbd6980605d48c290448c67951ae931d5 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -62,10 +62,12 @@ typedef struct dap_chain_cs_blocks_pvt size_t forked_br_cnt; dap_chain_block_forked_branch_t **forked_branches; // list of lists with atoms in side branches + pthread_rwlock_t forked_branches_rwlock; // Chunks treshold dap_chain_block_chunks_t * chunks; dap_chain_block_datum_index_t *datum_index; // To find datum in blocks + pthread_rwlock_t datums_rwlock; dap_chain_hash_fast_t genesis_block_hash; dap_chain_hash_fast_t static_genesis_block_hash; @@ -78,12 +80,24 @@ typedef struct dap_chain_cs_blocks_pvt dap_timerfd_t *fill_timer; uint64_t fill_timeout; - pthread_rwlock_t rwlock, datums_rwlock; + pthread_rwlock_t rwlock; struct cs_blocks_hal_item *hal; } dap_chain_cs_blocks_pvt_t; #define PVT(a) ((dap_chain_cs_blocks_pvt_t *)(a)->_pvt ) +#define print_rdlock(blocks) log_it(L_DEBUG, "Try to rdlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid());\ + pthread_rwlock_rdlock(& PVT(blocks)->rwlock);\ + log_it(L_DEBUG, "Locked rdlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid()); + +#define print_wrlock(blocks) log_it(L_DEBUG, "Try to wrlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid());\ + pthread_rwlock_wrlock(& PVT(blocks)->rwlock);\ + log_it(L_DEBUG, "Locked wrlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid()); + +#define print_unlock(blocks) log_it(L_DEBUG, "Try to unlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid());\ + pthread_rwlock_unlock(& PVT(blocks)->rwlock);\ + log_it(L_DEBUG, "Unlocked rwqlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid()); + static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, void **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash); static void s_cli_meta_hash_print( json_object* json_obj_a, const char * a_meta_title, dap_chain_block_meta_t * a_meta); static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply); @@ -155,64 +169,71 @@ int dap_chain_cs_blocks_init() { dap_chain_cs_type_add("blocks", s_chain_cs_blocks_new); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); - s_debug_more = true; //dap_config_get_item_bool_default(g_config, "blocks", "debug_more", false); + s_debug_more = dap_config_get_item_bool_default(g_config, "blocks", "debug_more", false); dap_cli_server_cmd_add ("block", s_cli_blocks, "Create and explore blockchains", "New block create, fill and complete commands:\n" - "block -net <net_name> -chain <chain_name> new\n" + "block -net <net_name> [-chain <chain_name>] new\n" "\t\tCreate new block and flush memory if was smth formed before\n\n" - "block -net <net_name> -chain <chain_name> new_datum_add <datum_hash>\n" + "block -net <net_name> [-chain <chain_name>] new_datum_add <datum_hash>\n" "\t\tAdd block section from datum <datum hash> taken from the mempool\n\n" - "block -net <net_name> -chain <chain_name> new_datum_del <datum_hash>\n" + "block -net <net_name> [-chain <chain_name>] new_datum_del <datum_hash>\n" "\t\tDel block section with datum <datum hash>\n\n" - "block -net <net_name> -chain <chain_name> new_datum_list\n" + "block -net <net_name> [-chain <chain_name>] new_datum_list\n" "\t\tList block sections and show their datums hashes\n\n" - "block -net <net_name> -chain <chain_name> new_datum\n\n" + "block -net <net_name> [-chain <chain_name>] new_datum\n\n" "\t\tComplete the current new round, verify it and if everything is ok - publish new blocks in chain\n\n" "Blockchain explorer:\n" - "block -net <net_name> -chain <chain_name> dump <block_hash>\n" + "block -net <net_name> [-chain <chain_name>] dump <block_hash>\n" "\t\tDump block info\n\n" - "block -net <net_name> -chain <chain_name> list [{signed | first_signed}] [-limit] [-offset]" + "block -net <net_name> [-chain <chain_name>] list [{signed | first_signed}] [-limit] [-offset]" " [-from_hash <block_hash>] [-to_hash <block_hash>] [-from_date <YYMMDD>] [-to_date <YYMMDD>]" " [{-cert <signing_cert_name> | -pkey_hash <signing_cert_pkey_hash>} [-unspent]]\n" "\t\t List blocks\n\n" - "block -net <net_name> -chain <chain_name> count\n" + "block -net <net_name> [-chain <chain_name>] count\n" "\t\t Show count block\n\n" + "block -net <net_name> -chain <chain_name> last\n\n" + "\t\tShow last block in chain\n\n" + + "block -net <net_name> -chain <chain_name> find -datum <datum_hash>\n\n" + "\t\tSearches and shows blocks that contains specify datum\n\n" + "Commission collect:\n" - "block -net <net_name> -chain <chain_name> fee collect" + "block -net <net_name> [-chain <chain_name>] fee collect" " -cert <priv_cert_name> -addr <addr> -hashes <hashes_list> -fee <value>\n" "\t\t Take delegated part of commission\n\n" "Reward for block signs:\n" - "block -net <net_name> -chain <chain_name> reward set" + "block -net <net_name> [-chain <chain_name>] reward set" " -cert <poa_cert_name> -value <value>\n" "\t\t Set base reward for sign for one block at one minute\n\n" - "block -net <net_name> -chain <chain_name> reward show" + "block -net <net_name> [-chain <chain_name>] reward show" " -cert <poa_cert_name> -value <value>\n" "\t\t Show base reward for sign for one block at one minute\n\n" - "block -net <net_name> -chain <chain_name> reward collect" + "block -net <net_name> [-chain <chain_name>] reward collect" " -cert <priv_cert_name> -addr <addr> -hashes <hashes_list> -fee <value>\n" "\t\t Take delegated part of reward\n\n" "Rewards and fees autocollect status:\n" - "block -net <net_name> -chain <chain_name> autocollect status\n" + "block -net <net_name> [-chain <chain_name>] autocollect status\n" "\t\t Show rewards and fees automatic collecting status (enabled or not)." " Show prepared blocks for collecting rewards and fees if status is enabled\n\n" "Rewards and fees autocollect renew:\n" - "block -net <net_name> -chain <chain_name> autocollect renew\n" + "block -net <net_name> [-chain <chain_name>] autocollect renew\n" " -cert <priv_cert_name> -addr <addr>\n" "\t\t Update reward and fees block table." " Automatic collection of commission in case of triggering of the setting\n\n" + ); if( dap_chain_block_cache_init() ) { log_it(L_WARNING, "Can't init blocks cache"); @@ -235,7 +256,7 @@ static int s_chain_cs_blocks_new(dap_chain_t *a_chain, dap_config_t *a_chain_con { dap_chain_cs_blocks_t * l_cs_blocks = DAP_NEW_Z(dap_chain_cs_blocks_t); if (!l_cs_blocks) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } a_chain->_inheritor = l_cs_blocks; @@ -280,12 +301,13 @@ static int s_chain_cs_blocks_new(dap_chain_t *a_chain, dap_config_t *a_chain_con dap_chain_cs_blocks_pvt_t *l_cs_blocks_pvt = DAP_NEW_Z(dap_chain_cs_blocks_pvt_t); if (!l_cs_blocks_pvt) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_cs_blocks->_pvt = l_cs_blocks_pvt; pthread_rwlock_init(&l_cs_blocks_pvt->rwlock,NULL); pthread_rwlock_init(&l_cs_blocks_pvt->datums_rwlock, NULL); + pthread_rwlock_init(&l_cs_blocks_pvt->forked_branches_rwlock, NULL); const char * l_genesis_blocks_hash_str = dap_config_get_item_str_default(a_chain_config,"blocks","genesis_block",NULL); if ( l_genesis_blocks_hash_str ){ @@ -313,7 +335,7 @@ static int s_chain_cs_blocks_new(dap_chain_t *a_chain, dap_config_t *a_chain_con for (uint16_t i = 0; i < l_list_len; i++) { struct cs_blocks_hal_item *l_hal_item = DAP_NEW_Z(struct cs_blocks_hal_item); if (!l_hal_item){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_cs_blocks_pvt); DAP_DELETE(l_cs_blocks); return -10; @@ -359,7 +381,7 @@ static char *s_blocks_decree_set_reward(dap_chain_net_t *a_net, dap_chain_t *a_c size_t l_decree_size = sizeof(dap_chain_datum_decree_t) + l_tsd_total_size; dap_chain_datum_decree_t *l_decree = DAP_NEW_Z_SIZE(dap_chain_datum_decree_t, l_decree_size); if (!l_decree) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } // Fill the header @@ -527,8 +549,7 @@ static void s_print_autocollect_table(dap_chain_net_t *a_net, json_object* json_ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) { json_object **json_arr_reply = (json_object **)a_str_reply; - //char ** a_str_reply = (char **) reply; - const char *l_hash_out_type = NULL; + //char ** a_str_reply = (char **) reply; enum { SUBCMD_UNDEFINED =0, SUBCMD_NEW_FLUSH, @@ -543,6 +564,8 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) SUBCMD_REWARD, SUBCMD_AUTOCOLLECT, SUBCMD_COUNT, + SUBCMD_LAST, + SUBCMD_FIND } l_subcmd={0}; const char* l_subcmd_strs[]={ @@ -558,6 +581,8 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) [SUBCMD_REWARD] = "reward", [SUBCMD_AUTOCOLLECT] = "autocollect", [SUBCMD_COUNT] = "count", + [SUBCMD_LAST] = "last", + [SUBCMD_FIND] = "find", [SUBCMD_UNDEFINED]=NULL }; const size_t l_subcmd_str_count=sizeof(l_subcmd_strs)/sizeof(*l_subcmd_strs); @@ -634,7 +659,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*)*l_datums_count); if (!l_datums) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_MEMORY_ERR, "Out of memory in s_cli_blocks"); return DAP_CHAIN_NODE_CLI_COM_BLOCK_MEMORY_ERR; } @@ -987,7 +1012,50 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) json_object_object_add(json_obj_out, l_tmp_buff, json_object_new_uint64(i_tmp)); json_object_array_add(*json_arr_reply,json_obj_out); } break; - + case SUBCMD_LAST: { + char l_tmp_buff[70]={0}; + json_object* json_obj_out = json_object_new_object(); + dap_chain_block_cache_t *l_last_block = HASH_LAST(PVT(l_blocks)->blocks); + char l_buf[DAP_TIME_STR_SIZE]; + if (l_last_block) + dap_time_to_str_rfc822(l_buf, DAP_TIME_STR_SIZE, l_last_block->ts_created); + json_object_object_add(json_obj_out, "Last block num", json_object_new_uint64(l_last_block ? l_last_block->block_number : 0)); + json_object_object_add(json_obj_out, "Last block hash", json_object_new_string(l_last_block ? l_last_block->block_hash_str : "empty")); + json_object_object_add(json_obj_out, "ts_created", json_object_new_string(l_last_block ? l_buf : "never")); + + sprintf(l_tmp_buff,"%s.%s has blocks", l_net->pub.name, l_chain->name); + json_object_object_add(json_obj_out, l_tmp_buff, json_object_new_uint64(PVT(l_blocks)->blocks_count)); + json_object_array_add(*json_arr_reply, json_obj_out); + } break; + case SUBCMD_FIND: { + const char* l_datum_hash_str = NULL; + json_object* json_obj_out = json_object_new_object(); + dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-datum", &l_datum_hash_str); + if (!l_datum_hash_str) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); + return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; + } + dap_hash_fast_t l_datum_hash = {}; + int ret_code = 0; + int l_atoms_cnt = 0; + dap_chain_hash_fast_from_str(l_datum_hash_str, &l_datum_hash); + pthread_rwlock_rdlock(&PVT(l_blocks)->datums_rwlock); + dap_chain_block_cache_t *l_curr_block = PVT(l_blocks)->blocks; + json_object* json_arr_bl_cache_out = json_object_new_array(); + for (;l_curr_block;l_curr_block = l_curr_block->hh.next){ + for (size_t i = 0; i < l_curr_block->datum_count; i++){ + if (dap_hash_fast_compare(&l_datum_hash, &l_curr_block->datum_hash[i])){ + json_object_array_add(json_arr_bl_cache_out, json_object_new_string(dap_hash_fast_to_str_static(&l_curr_block->block_hash))); + l_atoms_cnt++; + continue; + } + } + } + pthread_rwlock_unlock(&PVT(l_blocks)->datums_rwlock); + json_object_object_add(json_obj_out, "Blocks", json_arr_bl_cache_out); + json_object_object_add(json_obj_out, "Total",json_object_new_int(l_atoms_cnt)); + json_object_array_add(*json_arr_reply, json_obj_out); + } break; case SUBCMD_COUNT: { char l_tmp_buff[70]={0}; json_object* json_obj_out = json_object_new_object(); @@ -1125,7 +1193,7 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) l_hash_tx = dap_chain_mempool_tx_reward_create(l_blocks, l_cert->enc_key, l_addr, l_block_list, l_fee_value, l_hash_out_type); if (l_hash_tx) { json_object* json_obj_out = json_object_new_object(); - sprintf(l_tmp_buff, "TX for %s collection created succefully, hash = %s\n", l_subcmd_str, l_hash_tx); + sprintf(l_tmp_buff, "TX for %s collection created successfully, hash = %s\n", l_subcmd_str, l_hash_tx); json_object_object_add(json_obj_out, "status", json_object_new_string(l_tmp_buff)); json_object_array_add(*json_arr_reply, json_obj_out); DAP_DELETE(l_hash_tx); @@ -1339,6 +1407,7 @@ static void s_callback_delete(dap_chain_t * a_chain) pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); pthread_rwlock_destroy(&PVT(l_blocks)->rwlock); pthread_rwlock_destroy(&PVT(l_blocks)->datums_rwlock); + pthread_rwlock_destroy(&PVT(l_blocks)->forked_branches_rwlock); dap_chain_block_chunks_delete(PVT(l_blocks)->chunks); DAP_DEL_Z(l_blocks->_inheritor); DAP_DEL_Z(l_blocks->_pvt); @@ -1348,6 +1417,19 @@ static void s_callback_delete(dap_chain_t * a_chain) static void s_callback_cs_blocks_purge(dap_chain_t *a_chain) { dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); + + pthread_rwlock_wrlock(&PVT(l_blocks)->forked_branches_rwlock); + for (size_t i = 0; i < PVT(l_blocks)->forked_br_cnt; i++){ + dap_chain_block_forked_branch_atoms_table_t *l_atom_tmp, *l_atom; + HASH_ITER(hh, PVT(l_blocks)->forked_branches[i]->forked_branch_atoms, l_atom, l_atom_tmp) { + HASH_DEL(PVT(l_blocks)->forked_branches[i]->forked_branch_atoms, l_atom); + l_atom = NULL; + } + DAP_DEL_Z(PVT(l_blocks)->forked_branches[i]); + } + DAP_DEL_Z(PVT(l_blocks)->forked_branches); + pthread_rwlock_unlock(&PVT(l_blocks)->forked_branches_rwlock); + pthread_rwlock_wrlock(&PVT(l_blocks)->rwlock); dap_chain_block_cache_t *l_block = NULL, *l_block_tmp = NULL; HASH_ITER(hh, PVT(l_blocks)->blocks, l_block, l_block_tmp) { @@ -1405,7 +1487,7 @@ static int s_add_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_ca // Save datum hash -> block_hash link in hash table dap_chain_block_datum_index_t *l_datum_index = DAP_NEW_Z(dap_chain_block_datum_index_t); if (!l_datum_index) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return 1; } l_datum_index->ts_added = time(NULL); @@ -1438,7 +1520,6 @@ static int s_delete_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block i++, l_block_offset += l_datum_size){ dap_hash_fast_t *l_datum_hash = a_block_cache->datum_hash + i; dap_chain_datum_t *l_datum = a_block_cache->datum[i]; - pthread_rwlock_wrlock(&PVT(a_blocks)->datums_rwlock); dap_chain_block_datum_index_t *l_datum_index = NULL; size_t l_datum_data_size = l_datum->header.data_size; l_datum_size = l_datum_data_size + sizeof(l_datum->header); @@ -1449,7 +1530,6 @@ static int s_delete_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block l_ret++; HASH_DEL(PVT(a_blocks)->datum_index, l_datum_index); } - pthread_rwlock_unlock(&PVT(a_blocks)->datums_rwlock); } debug_if(s_debug_more, L_DEBUG, "Block %s checked, %s", a_block_cache->block_hash_str, l_ret == (int)a_block_cache->datum_count ? "all correct" : "there are rejected datums"); @@ -1469,73 +1549,6 @@ static void s_add_atom_to_blocks(dap_chain_cs_blocks_t *a_blocks, dap_chain_bloc } -/** - * @brief s_bft_consensus_setup - * @param a_blocks - */ -static void s_bft_consensus_setup(dap_chain_cs_blocks_t * a_blocks) -{ - bool l_was_chunks_changed = false; - // Compare all chunks with chain's tail - for (dap_chain_block_chunk_t *l_chunk = PVT(a_blocks)->chunks->chunks_last ; l_chunk; l_chunk=l_chunk->prev ){ - size_t l_chunk_length = HASH_COUNT(l_chunk->block_cache_hash); - dap_chain_block_cache_t * l_block_cache_chunk_top_prev = dap_chain_block_cache_get_by_hash(a_blocks,&l_chunk->block_cache_top->prev_hash); - dap_chain_block_cache_t * l_block_cache= l_block_cache_chunk_top_prev; - if ( l_block_cache ){ // we found prev block in main chain - size_t l_tail_length = 0; - // Now lets calc tail length - for( ;l_block_cache; l_block_cache=l_block_cache->prev){ - l_tail_length++; - if(l_tail_length>l_chunk_length) - break; - } - if(l_tail_length<l_chunk_length ){ // This generals consensus is bigger than the current one - // Cutoff current chank from the list - if( l_chunk->next) - l_chunk->next->prev = l_chunk->prev; - if( l_chunk->prev) - l_chunk->prev->next = l_chunk->next; - - // Pass through all the tail and move it to chunks - for(l_block_cache= l_block_cache_chunk_top_prev ;l_block_cache; l_block_cache=l_block_cache->prev){ - pthread_rwlock_wrlock(& PVT(a_blocks)->rwlock); - if(l_block_cache->prev) - l_block_cache->prev->next = l_block_cache->next; - if(l_block_cache->next) - l_block_cache->next->prev = l_block_cache->prev; - HASH_DEL(PVT(a_blocks)->blocks,l_block_cache); - --PVT(a_blocks)->blocks_count; - pthread_rwlock_unlock(& PVT(a_blocks)->rwlock); - dap_chain_block_chunks_add(PVT(a_blocks)->chunks,l_block_cache); - } - // Pass through all the chunk and add it to main chain - for(l_block_cache= l_chunk->block_cache_top ;l_block_cache; l_block_cache=l_block_cache->prev){ - int l_check_res = 0; - if (a_blocks->callback_block_verify) - l_check_res = a_blocks->callback_block_verify(a_blocks, l_block_cache->block, l_block_cache->block_size); - if (!l_check_res) { - log_it(L_WARNING,"Can't move block %s from chunk to main chain - data inside wasn't verified: code %d", - l_block_cache->block_hash_str, l_check_res); - dap_chain_block_chunks_add(PVT(a_blocks)->chunks,l_block_cache); - } - // TODO Rework blocks rwlock usage for this code - HASH_ADD(hh, PVT(a_blocks)->blocks, block_hash, sizeof(l_block_cache->block_hash), l_block_cache); - ++PVT(a_blocks)->blocks_count; - s_add_atom_datums(a_blocks, l_block_cache); - } - dap_chain_block_chunk_delete(l_chunk ); - l_was_chunks_changed = true; - } - } - - } - if(l_was_chunks_changed){ - dap_chain_block_chunks_sort( PVT(a_blocks)->chunks); - log_it(L_INFO,"Recursive BFT stage additional check..."); - s_bft_consensus_setup(a_blocks); - } -} - static void s_select_longest_branch(dap_chain_cs_blocks_t * a_blocks, dap_chain_block_cache_t * a_bcache, uint64_t a_main_branch_length, dap_chain_cell_t *a_cell) { dap_chain_cs_blocks_t * l_blocks = a_blocks; @@ -2031,7 +2044,7 @@ static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); if (!l_atom_iter) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_atom_iter->chain = a_chain; @@ -2141,7 +2154,7 @@ static dap_chain_datum_iter_t *s_chain_callback_datum_iter_create(dap_chain_t *a { dap_chain_datum_iter_t *l_ret = DAP_NEW_Z(dap_chain_datum_iter_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->chain = a_chain; @@ -2228,6 +2241,9 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_ size_t l_datum_processed = 0; pthread_rwlock_wrlock(&l_blocks_pvt->rwlock); +#ifdef DAP_TPS_TEST + log_it(L_TPS, "Start tps %zu datums add", a_datums_count); +#endif for (size_t i = 0; i < a_datums_count; ++i) { dap_chain_datum_t *l_datum = a_datums[i]; size_t l_datum_size = dap_chain_datum_size(l_datum); @@ -2246,10 +2262,12 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_ l_blocks->block_new->hdr.cell_id.uint64 = a_chain->cells->id.uint64; l_blocks->block_new->hdr.chain_id.uint64 = l_blocks->chain->id.uint64; } - l_blocks->block_new_size = dap_chain_block_datum_add(&l_blocks->block_new, l_blocks->block_new_size, l_datum, l_datum_size); l_datum_processed++; } +#ifdef DAP_TPS_TEST + log_it(L_TPS, "Finish tps %zu datums add", a_datums_count); +#endif pthread_rwlock_unlock(&l_blocks_pvt->rwlock); return l_datum_processed; } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index e7dca3dd963e765278675e9c9c3b75c31b72fbe5..0ce700904af8229199d96890c481b74bc9d344d8 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -151,23 +151,23 @@ int dap_chain_cs_dag_init() s_threshold_enabled = dap_config_get_item_bool_default(g_config, "dag", "threshold_enabled",false); debug_if(s_debug_more, L_DEBUG, "Thresholding %s", s_threshold_enabled ? "enabled" : "disabled"); dap_cli_server_cmd_add ("dag", s_cli_dag, "DAG commands", - "dag event create -net <net_name> -chain <chain_name> -datum <datum_hash> [-H {hex | base58(default)}]\n" - "\tCreate event from datum mempool element\n\n" - "dag event cancel -net <net_name> -chain <chain_name> -event <event_hash>\n" - "\tRemove event from forming new round and put back its datum to mempool\n\n" - "dag event sign -net <net_name> -chain <chain_name> -event <event_hash>\n" + "dag event sign -net <net_name> [-chain <chain_name>] -event <event_hash>\n" "\tAdd sign to event <event hash> in round.new. Hash doesn't include other signs so event hash\n" "\tdoesn't changes after sign add to event. \n\n" - "dag event dump -net <net_name> -chain <chain_name> -event <event_hash> -from {events | events_lasts | threshold | round.new | round.<Round id in hex>} [-H {hex | base58(default)}]\n" + "dag event dump -net <net_name> [-chain <chain_name>] -event <event_hash> -from {events | events_lasts | threshold | round.new | round.<Round_id_in_hex>} [-H {hex | base58(default)}]\n" "\tDump event info\n\n" - "dag event list -net <net_name> -chain <chain_name> -from {events | events_lasts | threshold | round.new | round.<Round id in hex>} [-limit] [-offset]\n\n" + "dag event list -net <net_name> [-chain <chain_name>] -from {events | events_lasts | threshold | round.new | round.<Round_id_in_hex>} [-limit] [-offset]\n\n" "\tShow event list \n\n" - "dag event count -net <net_name> -chain <chain_name>\n" + "dag event count -net <net_name> [-chain <chain_name>]\n" "\tShow count event \n\n" - "dag round complete -net <net_name> -chain <chain_name> \n" - "\tComplete the current new round, verify it and if everything is ok - publish new events in chain\n" - "dag round find -net <net_name> -chain <chain_name> -datum <datum_hash> \n" + "dag round complete -net <net_name> [-chain <chain_name>] \n" + "\tComplete the current new round, verify it and if everything is ok - publish new events in chain\n" + "dag round find -net <net_name> [-chain <chain_name>] -datum <datum_hash> \n" "\tSearches for rounds that have events that contain the specified datum.\n\n" + "dag event last -net <net_name> [-chain <chain_name>] \n" + "\tShow last event in chain\n\n" + "dag event find -net <net_name> [-chain <chain_name>] -datum <datum_hash>\n" + "\tSearches for events that contain the specified datum.\n\n" ); log_it(L_NOTICE,"Initialized DAG chain items organization class"); return 0; @@ -190,12 +190,12 @@ static int s_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) { dap_chain_cs_dag_t * l_dag = DAP_NEW_Z(dap_chain_cs_dag_t); if (!l_dag){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } l_dag->_pvt = DAP_NEW_Z(dap_chain_cs_dag_pvt_t); if (!l_dag->_pvt){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_dag); return -1; } @@ -262,7 +262,7 @@ static int s_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) for (uint16_t i = 0; i < l_list_len; i++) { dap_chain_cs_dag_hal_item_t *l_hal_item = DAP_NEW_Z(dap_chain_cs_dag_hal_item_t); if (!l_hal_item){ - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_dag->_pvt); DAP_DELETE(l_dag); return -1; @@ -302,7 +302,7 @@ static void s_dap_chain_cs_dag_threshold_free(dap_chain_cs_dag_t *a_dag) { if (l_current->ts_added < l_time_cut_off) { dap_chain_cs_dag_blocked_t *l_el = DAP_NEW(dap_chain_cs_dag_blocked_t); if (!l_el) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_mutex_unlock(&l_pvt->events_mutex); return; } @@ -456,19 +456,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; - dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t); - if (!l_event_item) { - log_it(L_CRITICAL, "Memory allocation error"); - return ATOM_REJECT; - } - pthread_mutex_t *l_events_mutex = &PVT(l_dag)->events_mutex; - l_event_item->event = l_event; - l_event_item->event_size = a_atom_size; - l_event_item->ts_added = dap_time_now(); - dap_chain_hash_fast_t l_event_hash = *a_atom_hash; - l_event_item->hash = l_event_hash; - if(s_debug_more) { char l_event_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; dap_chain_hash_fast_to_str(&l_event_hash, l_event_hash_str, sizeof(l_event_hash_str)); @@ -496,9 +484,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha default: break; } - - if ( !(l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t)) ) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + dap_chain_cs_dag_event_item_t *l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t); + if ( !l_event_item ) { + log_it(L_CRITICAL, "%s", c_error_memory_alloc); pthread_mutex_unlock(&PVT(l_dag)->events_mutex); return ATOM_REJECT; } @@ -751,48 +739,28 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t return l_event; } -static bool s_event_verify_size(dap_chain_cs_dag_event_t *a_event, size_t a_event_size) -{ - if (sizeof(a_event->header) >= a_event_size) { - log_it(L_WARNING, "Size of atom is %zd that is equal or less then header %zd", a_event_size, sizeof(a_event->header)); - return false; - } - size_t l_sign_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_event_size); - if (l_sign_offset >= a_event_size) - return false; - if (a_event->header.signs_count > UINT8_MAX) - return false; - uint8_t i; - for (i = 0; i < a_event->header.signs_count && l_sign_offset < a_event_size; ++i) { - dap_sign_t *l_sign = (dap_sign_t*)((uint8_t*)a_event + l_sign_offset); - l_sign_offset += dap_sign_get_size(l_sign); - } - if (i != a_event->header.signs_count) { - log_it(L_WARNING, "Malformed event! Only %d of claimed %d signs fit data size%s", - i, a_event->header.signs_count, l_sign_offset == a_event_size ? "" : ", incomplete sequence"); - - } - return l_sign_offset == a_event_size; -} - /** * @brief s_chain_callback_atom_verify Verify atomic element * @param a_chain * @param a_atom * @return */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom,size_t a_atom_size, dap_chain_hash_fast_t *a_atom_hash) +static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t *a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size, dap_chain_hash_fast_t *a_atom_hash) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; dap_chain_atom_verify_res_t res = ATOM_ACCEPT; pthread_mutex_t *l_events_mutex = &PVT(l_dag)->events_mutex; + if (a_atom_size < sizeof(dap_chain_cs_dag_event_t)) { + log_it(L_WARNING, "Too small event size %zu, less than event header", a_atom_size); + return ATOM_REJECT; + } if (l_event->header.version) { - debug_if(s_debug_more, L_WARNING, "Unsupported event version, possible corrupted event"); + log_it(L_WARNING, "Unsupported event version, possible corrupted event"); return ATOM_REJECT; } if (l_event->header.chain_id.uint64 != a_chain->id.uint64) { - debug_if(s_debug_more, L_WARNING, "Event from another chain, possible corrupted event"); + log_it(L_WARNING, "Event from another chain, possible corrupted event"); return ATOM_REJECT; } dap_chain_hash_fast_t l_event_hash = *a_atom_hash; @@ -806,8 +774,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ return ATOM_ACCEPT; } } - if (!s_event_verify_size(l_event, a_atom_size)) { - debug_if(s_debug_more, L_WARNING,"Event size not equal to expected"); + if (dap_chain_cs_dag_event_calc_size(l_event, a_atom_size) != a_atom_size) { + debug_if(s_debug_more, L_WARNING, "Event size not equal to expected"); return ATOM_REJECT; } @@ -860,9 +828,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ } //consensus - if(res == ATOM_ACCEPT) - if(l_dag->callback_cs_verify ( l_dag, l_event,a_atom_size )) - res = ATOM_REJECT; + if (res == ATOM_ACCEPT && l_dag->callback_cs_verify(l_dag, l_event, a_atom_hash)) + res = ATOM_REJECT; return res; } @@ -904,7 +871,7 @@ void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_c //add self dap_chain_cs_dag_event_item_t * l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); if (!l_event_last) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return; } l_event_last->ts_added = a_event_item->ts_added; @@ -1040,7 +1007,7 @@ static dap_chain_datum_t **s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t dap_chain_datum_t **l_datums = DAP_NEW_Z(dap_chain_datum_t*); if (!l_datums) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if (a_datums_count) @@ -1070,14 +1037,14 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t, sizeof (dap_chain_atom_ptr_t) * l_event->header.hash_count ); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if( a_links_size) *a_links_size = l_event->header.hash_count; *a_links_size_array = DAP_NEW_Z_SIZE(size_t, l_event->header.hash_count*sizeof (size_t)); if (!*a_links_size_array) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_ret); return NULL; } @@ -1120,7 +1087,7 @@ static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_c { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); if (!l_atom_iter) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_atom_iter->chain = a_chain; @@ -1238,7 +1205,7 @@ static dap_chain_datum_iter_t *s_chain_callback_datum_iter_create(dap_chain_t *a { dap_chain_datum_iter_t *l_ret = DAP_NEW_Z(dap_chain_datum_iter_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->chain = a_chain; @@ -1329,13 +1296,14 @@ static dap_chain_datum_t *s_chain_callback_datum_iter_get_next(dap_chain_datum_i */ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) { + json_object **json_arr_reply = (json_object **)a_str_reply; enum { - SUBCMD_EVENT_CREATE, - SUBCMD_EVENT_CANCEL, SUBCMD_EVENT_LIST, SUBCMD_EVENT_DUMP, SUBCMD_EVENT_SIGN, SUBCMD_EVENT_COUNT, + SUBCMD_EVENT_LAST, + SUBCMD_EVENT_FIND, SUBCMD_UNDEFINED } l_event_subcmd={0}; @@ -1364,31 +1332,30 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if(!l_hash_out_type) l_hash_out_type = "hex"; if(dap_strcmp(l_hash_out_type,"hex") && dap_strcmp(l_hash_out_type,"base58")) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "invalid parameter -H, valid values: -H <hex | base58>"); - return -1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"invalid parameter -H, valid values: -H <hex | base58>"); + return -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; } - dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net, - CHAIN_TYPE_INVALID); + if(dap_chain_node_cli_cmd_values_parse_net_chain_for_json(&arg_index, argc, argv, &l_chain, &l_net,CHAIN_TYPE_TX) < 0) + return -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; + if ((l_net == NULL) || (l_chain == NULL)){ return -1; - } else if (a_str_reply && *a_str_reply) { - DAP_DELETE(*a_str_reply); - *a_str_reply = NULL; } l_dag = DAP_CHAIN_CS_DAG(l_chain); const char *l_chain_type = dap_chain_get_cs_type(l_chain); if (!strstr(l_chain_type, "dag_")){ - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Type of chain %s is not dag. This chain with type %s is not supported by this command", + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR,"Type of chain %s is not dag. This chain with type %s is not supported by this command", l_chain->name, l_chain_type); - return -42; + return -DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR; } int ret = 0; if ( l_round_cmd_str ) { + json_object * json_obj_round = json_object_new_object(); + char l_buf[150] = {}; if ( strcmp(l_round_cmd_str,"complete") == 0 ){ const char * l_cmd_mode_str = NULL; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-mode", &l_cmd_mode_str); @@ -1398,11 +1365,12 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) } log_it(L_NOTICE,"Round complete command accepted, forming new events"); - size_t l_objs_size=0; + size_t l_objs_size = 0; dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_dag->gdb_group_events_round_new,&l_objs_size); - - dap_string_t *l_str_ret_tmp= l_objs_size>0 ? dap_string_new("Completing round:\n") : dap_string_new("Completing round: no data"); - + if (l_objs_size) + json_object_object_add(json_obj_round,"round status", json_object_new_string("Completing round")); + else + json_object_object_add(json_obj_round,"round status", json_object_new_string("Completing round: no data")); // list for verifed and added events dap_list_t *l_list_to_del = NULL; @@ -1416,25 +1384,26 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) size_t l_event_size = l_round_item->event_size; dap_hash_fast(l_event, l_event_size, &l_event_hash); int l_ret_event_verify; - if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event,l_event_size) ) !=0 ){// if consensus accept the event - dap_string_append_printf( l_str_ret_tmp, - "Error! Event %s is not passing consensus verification, ret code %d\n", + if ( ( l_ret_event_verify = l_dag->callback_cs_verify(l_dag, l_event, &l_event_hash) ) !=0 ) {// if consensus accept the event + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR,"Error! Event %s is not passing consensus verification, ret code %d\n", l_objs[i].key, l_ret_event_verify ); - ret = -30; + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR; break; }else { - dap_string_append_printf( l_str_ret_tmp, "Event %s verification passed\n", l_objs[i].key); + snprintf(l_buf, 150, "Event %s verification passed", l_objs[i].key); + json_object_object_add(json_obj_round,"verification status", json_object_new_string(l_buf)); // If not verify only mode we add if ( ! l_verify_only ){ - if (s_chain_callback_atom_add(l_chain, l_event, l_event_size, &l_event_hash) != ATOM_ACCEPT) { // Add new atom in chain - dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key); + if (s_chain_callback_atom_add(l_chain, l_event, l_event_size, &l_event_hash)!= ATOM_ACCEPT) { // Add new atom in chain + snprintf(l_buf, 150, "Event %s not added in chain\n", l_objs[i].key); + json_object_object_add(json_obj_round,"status add", json_object_new_string(l_buf)); } else { // add event to delete l_list_to_del = dap_list_prepend(l_list_to_del, (void *)l_objs[i].key); - dap_string_append_printf(l_str_ret_tmp, "Event %s added in chain successfully\n", + snprintf(l_buf, 150, "Event %s added in chain successfully\n", l_objs[i].key); + json_object_object_add(json_obj_round,"status add", json_object_new_string(l_buf)); } - } } } @@ -1453,8 +1422,7 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) // Cleaning up dap_global_db_objs_delete(l_objs, l_objs_size); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_ret_tmp->str); - dap_string_free(l_str_ret_tmp, true); + json_object_array_add(*json_arr_reply, json_obj_round); // Spread new mempool changes and dag events in network - going to SYNC_ALL // dap_chain_net_sync_all(l_net); @@ -1469,20 +1437,20 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_datum_in_hash = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The -datum option was not specified, so " - "no datum is known to look for in rounds.\n"); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum option was not specified, so " + "no datum is known to look for in rounds.\n"); return 0; } dap_hash_fast_t l_datum_hash = {0}; dap_chain_hash_fast_from_str(l_datum_in_hash, &l_datum_hash); if (dap_hash_fast_is_blank(&l_datum_hash)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The -datum parameter is not a valid hash.\n"); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR,"The -datum parameter is not a valid hash.\n"); return 0; } size_t l_objs_size = 0; dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_dag->gdb_group_events_round_new, &l_objs_size); size_t l_search_events = 0; - dap_string_t *l_events_str = dap_string_new("Events: \n"); + json_object_object_add(json_obj_round,"Events", json_object_new_string("empty")); for (size_t i = 0; i < l_objs_size;i++) { if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key)) continue; @@ -1494,46 +1462,24 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) dap_hash_fast(l_event, l_event_size, &ll_event_hash); char *ll_event_hash_str = dap_hash_fast_to_str_new(&ll_event_hash); l_search_events++; - dap_string_append_printf(l_events_str, - "\t%zu) hash:%s cell_id:%zu\n", l_search_events, ll_event_hash_str, - l_event->header.cell_id.uint64); + json_object_object_add(json_obj_round,"events count", json_object_new_uint64(l_search_events)); + json_object_object_add(json_obj_round,"event hash", json_object_new_string(ll_event_hash_str)); + json_object_object_add(json_obj_round,"cell_id", json_object_new_uint64(l_event->header.cell_id.uint64)); DAP_DELETE(ll_event_hash_str); } } dap_global_db_objs_delete(l_objs, l_objs_size); DAP_DELETE(l_datum_in_hash); - if (l_search_events > 0) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Datum with hash %s found in %zu events:\n%s\n", l_datum_hash_str, - l_search_events, l_events_str->str); - } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Datum hash %s not found in round event.\n", l_datum_hash_str); + if (!l_search_events) { + snprintf(l_buf, 150, "Datum hash %s not found in round event.\n", l_datum_hash_str); + json_object_object_add(json_obj_round,"find result", json_object_new_string(l_buf)); } - dap_string_free(l_events_str, true); return 0; } }else if ( l_event_cmd_str ) { char *l_datum_hash_hex_str = NULL; char *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); - - // datum hash may be in hex or base58 format - if(l_datum_hash_str) { - if(!dap_strncmp(l_datum_hash_str, "0x", 2) || !dap_strncmp(l_datum_hash_str, "0X", 2)) { - l_datum_hash_hex_str = dap_strdup(l_datum_hash_str); - l_datum_hash_base58_str = dap_enc_base58_from_hex_str_to_str(l_datum_hash_str); - } - else { - l_datum_hash_hex_str = dap_enc_base58_to_hex_str_from_str(l_datum_hash_str); - l_datum_hash_base58_str = dap_strdup(l_datum_hash_str); - } - } - l_event_subcmd = SUBCMD_EVENT_CREATE; - } else if ( strcmp( l_event_cmd_str, "cancel" ) == 0 ) { - dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-event", &l_event_hash_str); - l_event_subcmd = SUBCMD_EVENT_CANCEL; - } else if ( strcmp( l_event_cmd_str, "list" ) == 0 ) { + if ( strcmp( l_event_cmd_str, "list" ) == 0 ) { l_event_subcmd = SUBCMD_EVENT_LIST; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-from", &l_from_events_str); } else if ( strcmp( l_event_cmd_str,"dump") == 0 ) { @@ -1546,6 +1492,10 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_event_subcmd = SUBCMD_EVENT_SIGN; } else if (strcmp(l_event_cmd_str, "count") == 0) { l_event_subcmd = SUBCMD_EVENT_COUNT; + } else if (strcmp(l_event_cmd_str, "last") == 0) { + l_event_subcmd = SUBCMD_EVENT_LAST; + } else if (strcmp(l_event_cmd_str, "find") == 0) { + l_event_subcmd = SUBCMD_EVENT_FIND; } else { l_event_subcmd = SUBCMD_UNDEFINED; } @@ -1568,93 +1518,9 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) 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_gdb_group_mempool, l_datum_hash_hex_str, &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_gdb_group_mempool, l_datum_hash_str)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "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 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); - } - ret = 0; - } else { - dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_mutex_lock(&PVT(l_dag)->events_mutex); - HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); - pthread_mutex_unlock(&PVT(l_dag)->events_mutex); - if (l_event_item) { - pthread_mutex_lock(&PVT(l_dag)->events_mutex); - HASH_DELETE(hh, PVT(l_dag)->events, l_event_item); - pthread_mutex_unlock(&PVT(l_dag)->events_mutex); - 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_net_sync_gdb(l_net); - } break; /* SUBCMD_EVENT_CANCEL */ - case SUBCMD_EVENT_DUMP: { + json_object * json_obj_event = json_object_new_object(); + char l_buf[150] = {}; 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; @@ -1675,9 +1541,8 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if ( l_event_item ) l_event = l_event_item->event; else { - ret = -23; - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't find event %s in events_last table\n", l_event_hash_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events_last table\n", l_event_hash_str); break; } } else if (!l_from_events_str || strcmp(l_from_events_str,"events") == 0) { @@ -1689,9 +1554,8 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) l_event = l_event_item->event; l_event_size = l_event_item->event_size; } else { - ret = -24; - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't find event %s in events table\n", l_event_hash_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in events table\n", l_event_hash_str); break; } } else if (l_from_events_str && strcmp(l_from_events_str,"threshold") == 0) { @@ -1702,50 +1566,49 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if (l_event_item) l_event = l_event_item->event; else { - ret = -23; - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't find event %s in threshold table\n", l_event_hash_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event %s in threshold table\n", l_event_hash_str); break; } } else { - ret = -22; - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, threshold", l_from_events_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, + "Wrong events_from option \"%s\", need one of variant: events, round.new, events_lasts, threshold", l_from_events_str); break; } - if ( l_event ){ - dap_string_t * l_str_tmp = dap_string_new(NULL); + if ( l_event ) { char buf[DAP_TIME_STR_SIZE]; - - dap_string_append_printf(l_str_tmp,"\nEvent %s:\n", l_event_hash_str); + json_object_object_add(json_obj_event,"Event hash", json_object_new_string(l_event_hash_str)); // Round info if ((l_from_events_str && strcmp(l_from_events_str,"round.new") == 0) && l_round_item) { - dap_string_append_printf(l_str_tmp, - "\tRound info:\n\t\tsigns reject: %d\n", - l_round_item->round_info.reject_count); + json_object_object_add(json_obj_event,"Round info", json_object_new_string(" ")); + json_object_object_add(json_obj_event,"tsigns reject", json_object_new_uint64(l_round_item->round_info.reject_count)); + json_object_object_add(json_obj_event,"ts_update", json_object_new_string(buf)); dap_nanotime_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_round_item->round_info.ts_update); - dap_string_append_printf(l_str_tmp, "\t\tdatum_hash: %s\n\t\tts_update: %s\n", - dap_chain_hash_fast_to_str_static(&l_round_item->round_info.datum_hash), buf); + json_object_object_add(json_obj_event,"datum_hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_round_item->round_info.datum_hash))); + json_object_object_add(json_obj_event,"ts_update", json_object_new_string(buf)); } - // Header - dap_string_append_printf(l_str_tmp,"\t\tHeader:\n"); - dap_string_append_printf(l_str_tmp,"\t\t\tversion: %hu\n",l_event->header.version); - dap_string_append_printf(l_str_tmp,"\t\t\tround ID: %"DAP_UINT64_FORMAT_U"\n",l_event->header.round_id); - dap_string_append_printf(l_str_tmp,"\t\t\tcell_id: 0x%016"DAP_UINT64_FORMAT_x"\n",l_event->header.cell_id.uint64); - dap_string_append_printf(l_str_tmp,"\t\t\tchain_id: 0x%016"DAP_UINT64_FORMAT_X"\n",l_event->header.chain_id.uint64); + // Header + json_object_object_add(json_obj_event,"Header", json_object_new_string("empty")); + sprintf(l_buf,"%hu",l_event->header.version); + json_object_object_add(json_obj_event,"version", json_object_new_string(l_buf)); + json_object_object_add(json_obj_event,"round ID", json_object_new_uint64(l_event->header.round_id)); + sprintf(l_buf,"0x%016"DAP_UINT64_FORMAT_x"",l_event->header.cell_id.uint64); + json_object_object_add(json_obj_event,"cell_id", json_object_new_string(l_buf)); + sprintf(l_buf,"0x%016"DAP_UINT64_FORMAT_x"",l_event->header.chain_id.uint64); + json_object_object_add(json_obj_event,"chain_id", json_object_new_string(l_buf)); dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_event->header.ts_created); - dap_string_append_printf(l_str_tmp,"\t\t\tts_created: %s\n", buf ); + json_object_object_add(json_obj_event,"ts_created", json_object_new_string(l_buf)); // Hash links - dap_string_append_printf(l_str_tmp,"\t\t\thashes:\tcount: %u\n",l_event->header.hash_count); + json_object_object_add(json_obj_event,"hashes count", json_object_new_uint64(l_event->header.hash_count)); for (uint16_t i=0; i < l_event->header.hash_count; i++){ dap_chain_hash_fast_t * l_hash = (dap_chain_hash_fast_t *) (l_event->hashes_n_datum_n_signs + i*sizeof (dap_chain_hash_fast_t)); - dap_string_append_printf(l_str_tmp,"\t\t\t\thash: %s\n", - dap_chain_hash_fast_to_str_static(l_hash)); + json_object_object_add(json_obj_event,"hash", json_object_new_string(dap_chain_hash_fast_to_str_static(l_hash))); } size_t l_offset = l_event->header.hash_count*sizeof (dap_chain_hash_fast_t); dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (l_event->hashes_n_datum_n_signs + l_offset); @@ -1754,21 +1617,23 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) // Nested datum const char *l_datum_type = NULL; DAP_DATUM_TYPE_STR(l_datum->header.type_id, l_datum_type) - dap_string_append_printf(l_str_tmp,"\t\tdatum:\tdatum_size: %zu\n",l_datum_size); - dap_string_append_printf(l_str_tmp,"\t\t\tversion:=0x%02hhX\n", l_datum->header.version_id); - dap_string_append_printf(l_str_tmp,"\t\t\ttype_id:=%s\n", l_datum_type); + json_object_object_add(json_obj_event,"Datum", json_object_new_string("empty")); + json_object_object_add(json_obj_event,"datum_size", json_object_new_uint64(l_datum_size)); + sprintf(l_buf,"0x%02hhX",l_datum->header.version_id); + json_object_object_add(json_obj_event,"version", json_object_new_string(l_buf)); + json_object_object_add(json_obj_event,"type_id", json_object_new_string(l_datum_type)); dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_datum->header.ts_create); - dap_string_append_printf(l_str_tmp,"\t\t\tts_create=%s\n", buf); - dap_string_append_printf(l_str_tmp,"\t\t\tdata_size=%u\n", l_datum->header.data_size); + json_object_object_add(json_obj_event,"ts_create", json_object_new_string(buf)); + json_object_object_add(json_obj_event,"data_size", json_object_new_uint64(l_datum->header.data_size)); // Signatures - dap_string_append_printf(l_str_tmp,"\t\t\t\tsigns:\tcount: %u\n",l_event->header.signs_count); + json_object_object_add(json_obj_event,"signs count", json_object_new_uint64(l_event->header.signs_count)); l_offset += l_datum_size; while (l_offset + sizeof (l_event->header) < l_event_size ){ dap_sign_t * l_sign =(dap_sign_t *) (l_event->hashes_n_datum_n_signs +l_offset); size_t l_sign_size = dap_sign_get_size(l_sign); if (l_sign_size == 0 ){ - dap_string_append_printf(l_str_tmp,"\t\t\t\tERROR: wrong sign size 0, stop parsing headers\n"); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR," wrong sign size 0, stop parsing headers"); break; } dap_chain_hash_fast_t l_pkey_hash; @@ -1777,19 +1642,17 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) ? dap_enc_base58_encode_hash_to_str_static(&l_pkey_hash) : dap_chain_hash_fast_to_str_static(&l_pkey_hash); - dap_string_append_printf(l_str_tmp,"\t\t\t\t\t\ttype: %s\tpkey_hash: %s" - "\n", dap_sign_type_to_str( l_sign->header.type ), - l_hash_str ); + json_object_object_add(json_obj_event,"type", json_object_new_string(dap_sign_type_to_str( l_sign->header.type ))); + json_object_object_add(json_obj_event,"pkey_hash", json_object_new_string(l_hash_str)); + l_offset += l_sign_size; } - dap_chain_datum_dump(l_str_tmp, l_datum, l_hash_out_type, l_net->pub.id); + dap_chain_datum_dump_json(json_obj_event, l_datum, l_hash_out_type, l_net->pub.id); + json_object_array_add(*json_arr_reply, json_obj_event); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); ret=0; }else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't find event 0x%s in the new forming round ", + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR,"Can't find event 0x%s in the new forming round ", l_event_hash_str); ret=-10; } @@ -1797,69 +1660,73 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) } break; case SUBCMD_EVENT_LIST: { + json_object * json_obj_event_list = json_object_new_object(); + json_object * json_arr_obj_event = json_object_new_array(); const char *l_limit_str = NULL, *l_offset_str = NULL; dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-limit", &l_limit_str); dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-offset", &l_offset_str); + char *ptr; + size_t l_limit = l_limit_str ? strtoull(l_limit_str, &ptr, 10) : 1000; + size_t l_offset = l_offset_str ? strtoull(l_offset_str, &ptr, 10) : 0; + if (l_offset) + json_object_object_add(json_obj_event_list,"offset", json_object_new_uint64(l_offset)); + if (l_limit) + json_object_object_add(json_obj_event_list,"limit", json_object_new_uint64(l_limit)); + 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(""); if ( l_gdb_group_events ){ dap_global_db_obj_t * l_objs; size_t l_objs_count = 0; l_objs = dap_global_db_get_all_sync(l_gdb_group_events,&l_objs_count); - char *ptr; - size_t l_limit = l_limit_str ? strtoull(l_limit_str, &ptr, 10) : 1000; - size_t l_offset = l_offset_str ? strtoull(l_offset_str, &ptr, 10) : 0; size_t l_arr_start = 0; if (l_offset) { l_arr_start = l_offset; - dap_string_append_printf(l_str_tmp, "offset: %lu\n", l_arr_start); } size_t l_arr_end = l_objs_count; if (l_limit) { - dap_string_append_printf(l_str_tmp, "limit: %lu\n", l_limit); l_arr_end = l_arr_start + l_limit; if (l_arr_end > l_objs_count) l_arr_end = l_objs_count; } - dap_string_append_printf(l_str_tmp,"%s.%s: Found %zu records :\n",l_net->pub.name,l_chain->name,l_objs_count); + json_object_object_add(json_obj_event_list,"net name", json_object_new_string(l_net->pub.name)); + json_object_object_add(json_obj_event_list,"chain", json_object_new_string(l_chain->name)); + json_object_object_add(json_obj_event_list,"obj count", json_object_new_uint64(l_objs_count)); for (size_t i = l_arr_start; i < l_arr_end; i++) { + json_object * json_obj_event_i = json_object_new_object(); if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key)) { - dap_string_append_printf(l_str_tmp, "\t%s: %" DAP_UINT64_FORMAT_U "\n", - l_objs[i].key, *(uint64_t *)l_objs[i].value); + json_object_object_add(json_obj_event_i, l_objs[i].key, json_object_new_uint64(*(uint64_t *)l_objs[i].value)); + json_object_array_add(json_arr_obj_event, json_obj_event_i); continue; } dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event_n_signs; char buf[DAP_TIME_STR_SIZE]; dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_event->header.ts_created); - dap_string_append_printf(l_str_tmp, "\t%zu\t - %s: ts_create=%s\n", i - 1, l_objs[i].key, buf); - + json_object_object_add(json_obj_event_i, "#", json_object_new_string(dap_itoa(i-1))); + json_object_object_add(json_obj_event_i, "obj key", json_object_new_string(l_objs[i].key)); + json_object_object_add(json_obj_event_i, "ts_create", json_object_new_string(buf)); + json_object_array_add(json_arr_obj_event, json_obj_event_i); } + json_object_object_add(json_obj_event_list, "OBJ", json_arr_obj_event); if (l_objs && l_objs_count ) dap_global_db_objs_delete(l_objs, l_objs_count); ret = 0; } else { - dap_string_append_printf(l_str_tmp, "%s.%s: Error! No GlobalDB group!\n", l_net->pub.name, l_chain->name); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_GLOBALDB_ERR, "%s.%s: Error! No GlobalDB group!\n", l_net->pub.name, l_chain->name); ret = -2; } - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); + json_object_array_add(*json_arr_reply, json_obj_event_list); } else if (!l_from_events_str || (strcmp(l_from_events_str,"events") == 0)) { - dap_string_t * l_str_tmp = dap_string_new(NULL); pthread_mutex_lock(&PVT(l_dag)->events_mutex); - size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 1000; - size_t l_offset = l_offset_str ? strtoul(l_offset_str, NULL, 10) : 0; size_t l_arr_start = 0; if (l_offset > 0) { l_arr_start = l_offset; - dap_string_append_printf(l_str_tmp, "offset: %lu\n", l_arr_start); } size_t l_arr_end = HASH_COUNT(PVT(l_dag)->events); if (l_limit) { - dap_string_append_printf(l_str_tmp, "limit: %lu\n", l_limit); l_arr_end = l_arr_start + l_limit; if (l_arr_end > HASH_COUNT(PVT(l_dag)->events)) l_arr_end = HASH_COUNT(PVT(l_dag)->events); @@ -1870,83 +1737,134 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if (i_tmp < l_arr_start || i_tmp >= l_arr_end) { i_tmp++; } else { + json_object * json_obj_event_i = json_object_new_object(); i_tmp++; char buf[DAP_TIME_STR_SIZE]; dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_event_item->event->header.ts_created); - dap_string_append_printf(l_str_tmp, "\t%zu\t- %s: ts_create=%s\n", i_tmp, - dap_chain_hash_fast_to_str_static(&l_event_item->hash), - buf); + json_object_object_add(json_obj_event_i, "#", json_object_new_string(dap_itoa(i_tmp))); + json_object_object_add(json_obj_event_i, "hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_event_item->hash))); + json_object_object_add(json_obj_event_i, "ts_create", json_object_new_string(buf)); + json_object_array_add(json_arr_obj_event, json_obj_event_i); } } + json_object_object_add(json_obj_event_list, "EVENTS", json_arr_obj_event); size_t l_events_count = HASH_COUNT(PVT(l_dag)->events); pthread_mutex_unlock(&PVT(l_dag)->events_mutex); - dap_string_append_printf(l_str_tmp,"%s.%s have total %zu events :\n", - l_net->pub.name, l_chain->name, l_events_count); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); - }else if (l_from_events_str && (strcmp(l_from_events_str,"threshold") == 0) ){ - dap_string_t * l_str_tmp = dap_string_new(NULL); + + json_object_object_add(json_obj_event_list,"net name", json_object_new_string(l_net->pub.name)); + json_object_object_add(json_obj_event_list,"chain", json_object_new_string(l_chain->name)); + json_object_object_add(json_obj_event_list,"total events", json_object_new_uint64(l_events_count)); + + json_object_array_add(*json_arr_reply, json_obj_event_list); + }else if (l_from_events_str && (strcmp(l_from_events_str,"threshold") == 0) ){ pthread_mutex_lock(&PVT(l_dag)->events_mutex); dap_chain_cs_dag_event_item_t * l_event_item = NULL,*l_event_item_tmp = NULL; - size_t l_limit = l_limit_str ? strtoul(l_limit_str, NULL, 10) : 0; - size_t l_offset = l_offset_str ? strtoul(l_offset_str, NULL, 10) : 0; size_t l_arr_start = 0; if (l_offset) { l_arr_start = l_offset; - dap_string_append_printf(l_str_tmp, "offset: %lu\n", l_arr_start); } size_t l_arr_end = HASH_COUNT(PVT(l_dag)->events_treshold); if (l_limit) { - dap_string_append_printf(l_str_tmp, "limit: %lu\n", l_limit); l_arr_end = l_arr_start + l_limit; if (l_arr_end > HASH_COUNT(PVT(l_dag)->events_treshold)) l_arr_end = HASH_COUNT(PVT(l_dag)->events_treshold); } size_t i_tmp = 0; - dap_string_append_printf(l_str_tmp,"\nDAG threshold events:\n"); HASH_ITER(hh,PVT(l_dag)->events_treshold,l_event_item, l_event_item_tmp ) { if (i_tmp < l_arr_start || i_tmp > l_arr_end) { i_tmp++; continue; } i_tmp++; + json_object * json_obj_event_i = json_object_new_object(); char buf[DAP_TIME_STR_SIZE]; dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_event_item->event->header.ts_created); - dap_string_append_printf(l_str_tmp, "\t%zu\t- %s: ts_create=%s\n", i_tmp, - dap_chain_hash_fast_to_str_static( &l_event_item->hash), - buf); + json_object_object_add(json_obj_event_i, "#", json_object_new_string(dap_itoa(i_tmp))); + json_object_object_add(json_obj_event_i, "hash", json_object_new_string(dap_chain_hash_fast_to_str_static(&l_event_item->hash))); + json_object_object_add(json_obj_event_i, "ts_create", json_object_new_string(buf)); + json_object_array_add(json_arr_obj_event, json_obj_event_i); } + json_object_object_add(json_obj_event_list, "TRESHOLD", json_arr_obj_event); size_t l_events_count = HASH_COUNT(PVT(l_dag)->events_treshold); pthread_mutex_unlock(&PVT(l_dag)->events_mutex); - dap_string_append_printf(l_str_tmp,"%s.%s have total %zu events in threshold :\n", - l_net->pub.name, l_chain->name, l_events_count); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str_tmp->str); - dap_string_free(l_str_tmp, true); + json_object_object_add(json_obj_event_list,"net name", json_object_new_string(l_net->pub.name)); + json_object_object_add(json_obj_event_list,"chain", json_object_new_string(l_chain->name)); + json_object_object_add(json_obj_event_list,"total events", json_object_new_uint64(l_events_count)); + + json_object_array_add(*json_arr_reply, json_obj_event_list); }else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "Undefined events source for listing "); + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_ERR, "Undefined events source for listing "); ret=-14; } } break; case SUBCMD_EVENT_COUNT: { - dap_string_t *l_ret_str = dap_string_new(NULL); - dap_string_append_printf(l_ret_str, "%s.%s:\n", l_net->pub.name, l_chain->name); + json_object * json_obj_event_count = json_object_new_object(); + json_object_object_add(json_obj_event_count,"net name", json_object_new_string(l_net->pub.name)); + json_object_object_add(json_obj_event_count,"chain", json_object_new_string(l_chain->name)); const char * l_gdb_group_events = DAP_CHAIN_CS_DAG(l_chain)->gdb_group_events_round_new; if (l_gdb_group_events) { - size_t l_objs_count = 0; - dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(l_gdb_group_events,&l_objs_count); - dap_string_append_printf(l_ret_str,"%zu in round.new\n", l_objs_count); + size_t l_objs_count = dap_global_db_driver_count(l_gdb_group_events, c_dap_global_db_driver_hash_blank, false); + json_object_object_add(json_obj_event_count, "event count in round new", json_object_new_int(l_objs_count)); } size_t l_event_count = HASH_COUNT(PVT(l_dag)->events); size_t l_event_treshold_count = HASH_COUNT(PVT(l_dag)->events_treshold); - dap_string_append_printf(l_ret_str, "%zu atom(s) in events\n%zu atom(s) in threshold", l_event_count, l_event_treshold_count); - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_ret_str->str); - dap_string_free(l_ret_str, true); + json_object_object_add(json_obj_event_count,"atom in events", json_object_new_uint64(l_event_count)); + json_object_object_add(json_obj_event_count,"atom in threshold", json_object_new_uint64(l_event_treshold_count)); + json_object_array_add(*json_arr_reply, json_obj_event_count); } break; + case SUBCMD_EVENT_LAST:{ + json_object * json_obj_out = json_object_new_object(); + char l_tmp_buff[70] = {0}; + pthread_mutex_lock(&PVT(l_dag)->events_mutex); + dap_chain_cs_dag_event_item_t *l_last_item = HASH_LAST(PVT(l_dag)->events); + pthread_mutex_unlock(&PVT(l_dag)->events_mutex); + char l_buf[DAP_TIME_STR_SIZE]; + if (l_last_item) + dap_time_to_str_rfc822(l_buf, DAP_TIME_STR_SIZE, l_last_item->event->header.ts_created); + json_object_object_add(json_obj_out, "Last event num", json_object_new_uint64(l_last_item ? l_last_item->event_number : 0)); + json_object_object_add(json_obj_out, "Last event hash", json_object_new_string(l_last_item ? + dap_hash_fast_to_str_static(&l_last_item->hash) : "empty")); + json_object_object_add(json_obj_out, "ts_created", json_object_new_string(l_last_item ? l_buf : "never")); + size_t l_event_count = HASH_COUNT(PVT(l_dag)->events); + sprintf(l_tmp_buff,"%s.%s has events", l_net->pub.name, l_chain->name); + json_object_object_add(json_obj_out, l_tmp_buff, json_object_new_uint64(l_event_count)); + json_object_array_add(*json_arr_reply, json_obj_out); + } break; + case SUBCMD_EVENT_FIND:{ + const char* l_datum_hash_str = NULL; + json_object* json_obj_out = json_object_new_object(); + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str); + if (!l_datum_hash_str) { + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, "Command 'event find' requires parameter '-datum'"); + ret = DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR; + } + dap_hash_fast_t l_datum_hash = {}; + int ret_code = 0; + int l_atoms_cnt = 0; + dap_chain_hash_fast_from_str(l_datum_hash_str, &l_datum_hash); + pthread_mutex_lock(&PVT(l_dag)->events_mutex); + // dap_chain_cs_dag_event_item_t *l_curr_event = PVT(l_dag)->events; + dap_chain_cs_dag_event_item_t *l_curr_event = NULL, *l_temp; + json_object* json_arr_bl_cache_out = json_object_new_array(); + // for (;l_curr_event;l_curr_event = l_curr_event->hh.next) + HASH_ITER(hh, PVT(l_dag)->events, l_curr_event, l_temp){ + if (l_curr_event && dap_hash_fast_compare(&l_datum_hash, &l_curr_event->datum_hash)){ + json_object_array_add(json_arr_bl_cache_out, json_object_new_string(dap_hash_fast_to_str_static(&l_curr_event->hash))); + l_atoms_cnt++; + } + } + pthread_mutex_unlock(&PVT(l_dag)->events_mutex); + json_object_object_add(json_obj_out, "Events", json_arr_bl_cache_out); + json_object_object_add(json_obj_out, "Total",json_object_new_int(l_atoms_cnt)); + json_object_array_add(*json_arr_reply, json_obj_out); + } break; case SUBCMD_EVENT_SIGN: { // Sign event command + json_object * json_obj_event_count = json_object_new_object(); + json_object * json_arr_obj_event = json_object_new_array(); char * l_gdb_group_events = l_dag->gdb_group_events_round_new; size_t l_round_item_size = 0; dap_chain_cs_dag_event_round_item_t *l_round_item = @@ -1968,42 +1886,44 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) if (dap_chain_cs_dag_event_gdb_set(l_dag, l_event_new_hash_hex_str, l_event, l_event_size_new, l_round_item)) { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Added new sign with cert \"%s\", event %s placed back in round.new\n", - l_cert_str, l_event_new_hash_base58_str ? - l_event_new_hash_base58_str : l_event_new_hash_hex_str); + json_object * json_obj_sign = json_object_new_object(); + + json_object_object_add(json_obj_sign,"cert", json_object_new_string(l_cert_str)); + json_object_object_add(json_obj_sign,"event", l_event_new_hash_base58_str ? + json_object_new_string(l_event_new_hash_base58_str) : + json_object_new_string(l_event_new_hash_hex_str)); + json_object_array_add(json_arr_obj_event, json_obj_sign); + + json_object_object_add(json_obj_event_count,"Added new sign with cert, event placed back in round.new", json_arr_obj_event); + json_object_array_add(*json_arr_reply, json_obj_event_count); + } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "GDB Error: Can't place event %s with new sign back in round.new\n", - l_event_new_hash_base58_str ? l_event_new_hash_base58_str : l_event_new_hash_hex_str); - ret = -31; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"GDB Error: Can't place event %s with new sign back in round.new\n", + l_event_new_hash_base58_str ? l_event_new_hash_base58_str : l_event_new_hash_hex_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR; } DAP_DELETE(l_event); } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Can't sign event %s in round.new\n", - l_event_hash_str); - ret=-1; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR,"Can't sign event %s in round.new\n", + l_event_hash_str); + ret=-DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR; } } else { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "No valid certificate provided for event %s signing\n", - l_event_hash_str); - ret = -50; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR,"No valid certificate provided for event %s signing\n", + l_event_hash_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR; } DAP_DELETE(l_round_item); } else { - dap_cli_server_cmd_set_reply_text(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; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR,"Can't find event %s in round.new - only place where could be signed the new event\n", + l_event_hash_str); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR; } } break; case SUBCMD_UNDEFINED: { - dap_cli_server_cmd_set_reply_text(a_str_reply, - "Undefined event subcommand \"%s\" ", - l_event_cmd_str); - ret=-11; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN,"Undefined event subcommand \"%s\" ", + l_event_cmd_str); + ret=-DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN; } } DAP_DEL_Z(l_datum_hash_hex_str); @@ -2011,9 +1931,8 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) 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; + dap_json_rpc_error_add(DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR,"Undefined subcommand"); + ret = -DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR; } return ret; } diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 8dd90470ede55e569c2113830e3023581073de8a..4402212cd531c7699be33a6d75aac0e7a1e28adc 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -95,6 +95,49 @@ dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, return l_event_new; } +/** + * @brief dap_chain_cs_dag_event_calc_size_excl_signs + * @param a_event + * @return + */ +size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size) +{ + dap_return_val_if_fail(a_event, 0); + if (a_limit_size && a_limit_size < sizeof(a_event->header)) + return 0; + size_t l_hashes_size = a_event->header.hash_count * sizeof(dap_chain_hash_fast_t); + if (a_limit_size && a_limit_size < l_hashes_size + sizeof(a_event->header) + sizeof(dap_chain_datum_t)) + return 0; + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); + size_t l_ret = dap_chain_datum_size(l_datum) + l_hashes_size + sizeof(a_event->header); + if (a_limit_size && a_limit_size < l_ret) + return 0; + return l_ret; +} + +/** + * @brief dap_chain_cs_dag_event_calc_size + * @param a_event + * @return + */ +size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size) +{ + dap_return_val_if_fail(a_event, 0); + size_t l_signs_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_limit_size); + if (!l_signs_offset) + return 0; + byte_t *l_signs = (byte_t *)a_event + l_signs_offset; + size_t l_signs_size = 0; + for (uint16_t l_signs_passed = 0; l_signs_passed < a_event->header.signs_count; l_signs_passed++) { + dap_sign_t *l_sign = (dap_sign_t *)(l_signs + l_signs_size); + if (a_limit_size && a_limit_size < l_signs_offset + l_signs_size + sizeof(dap_sign_t)) + return 0; + l_signs_size += dap_sign_get_size(l_sign); + } + size_t l_total_size = l_signs_offset + l_signs_size; + return a_limit_size && l_total_size > a_limit_size ? 0 : l_total_size; +} + /** * @brief dap_chain_cs_dag_event_sign_add * @param a_event diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index 68d154e2d79705146d0d902f275b4f292c77e92a..1020634067194f1684b3fb16e7197d3690456880 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -31,9 +31,9 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; -typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *); +typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *a_dag); typedef void (*dap_chain_cs_dag_callback_rc_ptr_t)(dap_chain_cs_dag_t *, int a_rc, void * a_arg); -typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *,size_t); +typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_t *a_event, dap_hash_fast_t *a_event_hash); typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *, dap_chain_datum_t *, @@ -74,6 +74,25 @@ typedef struct dap_chain_cs_dag void * _inheritor; } dap_chain_cs_dag_t; +typedef enum s_com_dag_err{ + DAP_CHAIN_NODE_CLI_COM_DAG_OK = 0, + DAP_CHAIN_NODE_CLI_COM_DAG_PARAM_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_CHAIN_TYPE_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_DATUM_DEL_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_EVENT_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_SIGN_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_FIND_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_GLOBALDB_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_CERT_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_FIND_EVENT_ERR, + DAP_CHAIN_NODE_CLI_COM_DAG_UNDEF_SUB_ERR, + + /* add custom codes here */ + + DAP_CHAIN_NODE_CLI_COM_DAG_UNKNOWN /* MAX */ +} s_com_dag_err_t; + #define DAP_CHAIN_CS_DAG(a) ( (dap_chain_cs_dag_t *) (a)->_inheritor) int dap_chain_cs_dag_init(); 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 0a5513912997e5a97ffa2bcb1512eafc2402df95..5f4d6a1c94255515bb77d0487764860e1457c3cb 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -90,47 +90,9 @@ bool dap_chain_cs_dag_event_sign_exists(dap_chain_cs_dag_event_t *a_event, size_ bool dap_chain_cs_dag_event_round_sign_exists(dap_chain_cs_dag_event_round_item_t *a_round_item, dap_enc_key_t * a_key); dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number); -/** - * @brief dap_chain_cs_dag_event_calc_size_excl_signs - * @param a_event - * @return - */ -static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t *a_event, size_t a_event_size) -{ - if (a_event_size < sizeof(a_event->header)) - return 0; - size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); - if (a_event_size < l_hashes_size + sizeof(a_event->header)) - return 0; - dap_chain_datum_t *l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); - size_t l_ret = dap_chain_datum_size(l_datum) + l_hashes_size + sizeof(a_event->header); - if (a_event_size < l_ret) - return 0; - return l_ret; -} +size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size); +size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size); -/** - * @brief dap_chain_cs_dag_event_calc_size - * @param a_event - * @return - */ -static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *a_event, size_t a_limit_size) -{ - if (!a_event || !a_limit_size) - return 0; - size_t l_signs_offset = dap_chain_cs_dag_event_calc_size_excl_signs(a_event, a_limit_size); - if (!l_signs_offset) - return 0; - byte_t *l_signs = (byte_t *)a_event + l_signs_offset; - size_t l_signs_size = 0; - for (uint16_t l_signs_passed = 0; l_signs_passed < a_event->header.signs_count; l_signs_passed++) { - dap_sign_t *l_sign = (dap_sign_t *)(l_signs + l_signs_size); - l_signs_size += dap_sign_get_size(l_sign); - if (a_limit_size < l_signs_offset + l_signs_size) - return 0; - } - return l_signs_offset + l_signs_size; -} /** * @brief dap_chain_cs_dag_event_calc_hash diff --git a/modules/type/none/dap_chain_cs_none.c b/modules/type/none/dap_chain_cs_none.c index 008e32171733b12a3618d94ba18c11de4c46a3aa..e6d7b4d14c0e1672fa57fa6dab2fd1d6e8dfdb61 100644 --- a/modules/type/none/dap_chain_cs_none.c +++ b/modules/type/none/dap_chain_cs_none.c @@ -149,12 +149,12 @@ static int s_cs_callback_new(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_ch { dap_nonconsensus_t *l_nochain = DAP_NEW_Z(dap_nonconsensus_t); if (!l_nochain) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -1; } dap_nonconsensus_private_t *l_nochain_priv = DAP_NEW_Z(dap_nonconsensus_private_t); if (!l_nochain_priv) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DELETE(l_nochain); return -2; } @@ -322,7 +322,7 @@ static dap_chain_atom_verify_res_t s_nonconsensus_callback_atom_add(dap_chain_t dap_nonconsensus_datum_hash_item_t * l_hash_item = DAP_NEW_Z(dap_nonconsensus_datum_hash_item_t); if (!l_hash_item) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return ATOM_REJECT; } size_t l_datum_size = dap_chain_datum_size(l_datum); @@ -379,7 +379,7 @@ static dap_chain_atom_iter_t* s_nonconsensus_callback_atom_iter_create(dap_chain { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); if (!l_iter) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_iter->chain = a_chain; @@ -508,7 +508,7 @@ static dap_chain_datum_t **s_nonconsensus_callback_atom_get_datum(dap_chain_atom if (l_datum){ dap_chain_datum_t **l_datums = DAP_NEW(dap_chain_datum_t *); if (!l_datums) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } if (a_datums_count) @@ -525,7 +525,7 @@ static dap_chain_datum_iter_t *s_nonconsensus_callback_datum_iter_create(dap_cha { dap_chain_datum_iter_t *l_ret = DAP_NEW_Z(dap_chain_datum_iter_t); if (!l_ret) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return NULL; } l_ret->chain = a_chain; diff --git a/modules/wallet/dap_chain_wallet.c b/modules/wallet/dap_chain_wallet.c index 95e5dcdb2a9ba510f333fb3589dcf8214f1ae4d5..12f8fd9ac1268e227efb7d277fc6a99a5da5dfde 100644 --- a/modules/wallet/dap_chain_wallet.c +++ b/modules/wallet/dap_chain_wallet.c @@ -134,7 +134,7 @@ char *c_wallets_path; { l_prec = DAP_NEW_Z(dap_chain_wallet_n_pass_t); /* Get memory for new record */ if (!l_prec) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); return -EINVAL; } *l_prec = l_rec; /* Fill it by data */ @@ -849,7 +849,7 @@ uint32_t l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT; l_wallet = DAP_NEW_Z(dap_chain_wallet_t); assert(l_wallet); if (!l_wallet) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); dap_fileclose(l_fh); if ( a_out_stat ) *a_out_stat = 9; @@ -859,7 +859,7 @@ uint32_t l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT; DAP_CHAIN_WALLET_INTERNAL_LOCAL_NEW(l_wallet); assert(l_wallet_internal); if (!l_wallet_internal) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_wallet); dap_fileclose(l_fh); if ( a_out_stat ) @@ -884,7 +884,7 @@ uint32_t l_csum = CRC32C_INIT, l_csum2 = CRC32C_INIT; l_wallet_internal->certs = DAP_NEW_Z_SIZE(dap_cert_t *, l_wallet_internal->certs_count * sizeof(dap_cert_t *)); assert(l_wallet_internal->certs); if (!l_wallet_internal->certs) { - log_it(L_CRITICAL, "%s", g_error_memory_alloc); + log_it(L_CRITICAL, "%s", c_error_memory_alloc); DAP_DEL_Z(l_wallet); dap_fileclose(l_fh); if ( a_out_stat )