diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b2dd143072429e86ceda949702b339e632515f6..33f358ff7e41a7b596507d4ffa9d4d1bbdf89809 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,7 @@ file(GLOB IPUTILS_SRCS iputils/*.c iputils/traceroute/*.c) file(GLOB IPUTILS_HEADERS iputils/*.h ${IPUTILS_INCLUDE_DIRS}*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS} ${IPUTILS_SRCS} ${IPUTILS_HEADERS}) - -target_link_libraries(dap_chain_net dap_core dap_crypto dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db -lresolv) +target_link_libraries(dap_chain_net dap_core dap_crypto dap_client dap_core_server dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_crypto dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db -lresolv) target_include_directories(dap_chain_net INTERFACE . PUBLIC ${IPUTILS_INCLUDE_DIRS}) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) diff --git a/dap_chain_net.c b/dap_chain_net.c index bfa260ac75c550ec54c0da32254035b190e63e97..b9672794e87da5756d53fa66a20c383b5adc98cc 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -22,7 +22,7 @@ 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 <time.h> #include <stddef.h> #include <string.h> #include <pthread.h> @@ -52,7 +52,6 @@ #include "dap_module.h" -#define _XOPEN_SOURCE 700 #include <stdio.h> #include <sys/types.h> #include <dirent.h> @@ -171,8 +170,13 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c if (a_arg) { dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; - if (!PVT (l_net)->load_mode ) - dap_chain_net_sync_all(l_net); + if (!PVT (l_net)->load_mode ){ + if( pthread_mutex_trylock( &PVT (l_net)->state_mutex) == 0 ){ + if ( PVT(l_net)->state == NET_STATE_ONLINE || PVT(l_net)->state == NET_STATE_ONLINE ) + dap_chain_net_sync_all(l_net); + pthread_mutex_unlock( &PVT (l_net)->state_mutex); + } + } } } @@ -634,12 +638,28 @@ static int s_cli_net(int argc, const char ** argv, char **a_str_reply) const char * l_links_str = NULL; const char * l_go_str = NULL; const char * l_get_str = NULL; + const char * l_stats_str = NULL; dap_chain_node_cli_find_option_val(argv, arg_index, argc, "sync", &l_sync_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "link", &l_links_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "go", &l_go_str); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "get", &l_get_str); - - if ( l_go_str){ + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "stats", &l_stats_str); + + if ( l_stats_str ){ + if ( strcmp(l_stats_str,"tps") == 0 ) { + const char * l_to_str = NULL; + struct tm l_to_tm = {0}; + const char * l_from_str = NULL; + struct tm l_from_tm = {0}; + + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-from ", &l_from_str); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-to", &l_to_str); + if (l_from_str ){ + //strptime() + } + dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" go from state %s to %s"); + } + }if ( l_go_str){ if ( strcmp(l_go_str,"online") == 0 ) { dap_chain_net_state_go_to(l_net, NET_STATE_ONLINE); dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" go from state %s to %s", @@ -882,6 +902,8 @@ int dap_chain_net_load(const char * a_net_name) if ( l_chains_dir ){ struct dirent * l_dir_entry; while ( (l_dir_entry = readdir(l_chains_dir) )!= NULL ){ + if (l_dir_entry->d_name[0]=='\0') + continue; char * l_entry_name = strdup(l_dir_entry->d_name); l_chains_path_size = strlen(l_net->pub.name)+1+strlen("network")+1+strlen (l_entry_name)-3; l_chains_path = DAP_NEW_Z_SIZE(char, l_chains_path_size); @@ -900,10 +922,10 @@ int dap_chain_net_load(const char * a_net_name) if(l_chain->callback_created) l_chain->callback_created(l_chain,l_cfg); } - free(l_entry_name); } } DAP_DELETE (l_chains_path); + DAP_DELETE (l_entry_name); } } else { log_it(L_ERROR,"Can't any chains for network %s",l_net->pub.name); diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c index a1a9f13dde9d47c591584afacb623418987c06b3..4764281feb0d0bb49672e5dee44f42719488ac27 100644 --- a/dap_chain_node_cli.c +++ b/dap_chain_node_cli.c @@ -508,7 +508,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) ); dap_chain_node_cli_cmd_item_create ("token_emit", com_token_emit, "Token emission", - "token_emit -net <net name> -chain_emission <chain for emission> -chain_base_tx <chain for base tx> -addr <addr> token <token ticker> -certs <cert> -emission_value <val>\n"); + "token_emit -net <net name> -chain_emission <chain for emission> -chain_base_tx <chain for base tx> -addr <addr> -token <token ticker> -certs <cert> -emission_value <val>\n"); dap_chain_node_cli_cmd_item_create ("mempool_list", com_mempool_list, "List mempool entries for selected chain network and chain id", "mempool_list -net <net name> -chain <chain name>\n"); diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index daec8d9922538243fc79f74b93ca53ab8e5dfe4e..cf2e5961b1b86bce048dbf5c43d453acd8c5545e 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -836,7 +836,7 @@ int com_node(int a_argc, const char ** a_argv, char **a_str_reply) DAP_DELETE(l_remote_node_info); dap_client_disconnect(l_node_client->client); l_node_client->client = NULL; - dap_chain_node_client_close(l_node_client); + //dap_chain_node_client_close(l_node_client); dap_chain_node_cli_set_reply_text(a_str_reply, "Node sync completed: Chains and gdb are synced"); return 0; @@ -1243,7 +1243,7 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) l_addr = (dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet); } if(!l_addr && addr_str) - l_addr = dap_chain_str_to_addr(addr_str); + l_addr = dap_chain_addr_from_str(addr_str); dap_ledger_t *l_ledger = dap_chain_ledger_by_net_name((const char *) l_net_name); if(!l_net_name) { @@ -1274,7 +1274,8 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply) if(l_addr_tokens[i]) { uint64_t l_balance = dap_chain_ledger_calc_balance(l_ledger, l_addr, l_addr_tokens[i]); long double l_balance_coins = (long double) l_balance / 1000000000000.0L; - dap_string_append_printf(l_string_ret, " %Lf %s\n", l_balance_coins, l_addr_tokens[i]); + dap_string_append_printf(l_string_ret, " %.3Lf (%llu) %s\n", l_balance_coins, + l_balance, l_addr_tokens[i]); } DAP_DELETE(l_addr_tokens[i]); @@ -1903,7 +1904,7 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) return -5; } - dap_chain_addr_t * l_addr = dap_chain_str_to_addr(l_addr_str); + dap_chain_addr_t * l_addr = dap_chain_addr_from_str(l_addr_str); if(!l_addr) { dap_chain_node_cli_set_reply_text(str_reply, "address \"%s\" is invalid", l_addr_str); @@ -1967,7 +1968,8 @@ int com_token_emit(int argc, const char ** argv, char ** str_reply) l_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_token_emission_size); strncpy(l_token_emission->hdr.ticker, l_ticker, sizeof(l_token_emission->hdr.ticker)); l_token_emission->hdr.value = l_emission_value; - + l_token_emission->hdr.type = DAP_CHAIN_DATUM_TOKEN_EMISSION_TYPE_AUTH; + memcpy(&l_token_emission->hdr.address, l_addr, sizeof (l_token_emission->hdr.address)); // Then add signs size_t l_offset=0; for (size_t i =0; i < l_certs_size; i++ ){ @@ -2128,6 +2130,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) const char * l_token_ticker = NULL; const char * l_net_name = NULL; const char * l_chain_name = NULL; + const char * l_tx_num_str = NULL; + size_t l_tx_num =0; uint64_t value = 0; uint64_t value_fee = 0; @@ -2136,6 +2140,10 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-token", &l_token_ticker); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-net", &l_net_name); dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain", &l_chain_name); + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-tx_num", &l_tx_num_str); + + if ( l_tx_num_str ) + l_tx_num = strtoul(l_tx_num_str,NULL,10); if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-fee", &addr_base58_fee)) { if(dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-value_fee", &str_tmp)) { @@ -2191,8 +2199,8 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) return -1; } const dap_chain_addr_t *addr_from = (const dap_chain_addr_t *) dap_chain_wallet_get_addr(l_wallet); - dap_chain_addr_t *addr_to = dap_chain_str_to_addr(addr_base58_to); - dap_chain_addr_t *addr_fee = dap_chain_str_to_addr(addr_base58_fee); + dap_chain_addr_t *addr_to = dap_chain_addr_from_str(addr_base58_to); + dap_chain_addr_t *addr_fee = dap_chain_addr_from_str(addr_base58_fee); if(!addr_from) { dap_chain_node_cli_set_reply_text(str_reply, "source address is invalid"); @@ -2211,7 +2219,9 @@ int com_tx_create(int argc, const char ** argv, char **str_reply) //g_string_printf(string_ret, "from=%s\nto=%s\nval=%lld\nfee=%s\nval_fee=%lld\n\n", // addr_base58_from, addr_base58_to, value, addr_base58_fee, value_fee); - int res = dap_chain_mempool_tx_create( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee, + int res = l_tx_num? dap_chain_mempool_tx_create_massive( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee, + l_token_ticker, value, value_fee, l_tx_num) + :dap_chain_mempool_tx_create( l_chain, dap_chain_wallet_get_key(l_wallet, 0), addr_from, addr_to, addr_fee, l_token_ticker, value, value_fee); dap_string_append_printf(string_ret, "transfer=%s\n", (res == 0) ? "Ok" : (res == -2) ? "False, not enough funds for transfer" : "False");