diff --git a/dap-sdk b/dap-sdk index 8b19997fc272166ab0ed5f4a68d960cb20dbb5fc..6433d931b917ceb7b71967817acc03c454dabb30 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 8b19997fc272166ab0ed5f4a68d960cb20dbb5fc +Subproject commit 6433d931b917ceb7b71967817acc03c454dabb30 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..8707e576fc4d95f2835d7ae2d3482930d472b958 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 %zu", 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,77 @@ 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) - { - flags = flags | F_ORDR; - break; - } + 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 == g_node_addr.uint64) + { + 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 e21e4c20a087d9845b0e999412e80679079435eb..f70b98db1c44f4d8e48f4e285803295974fdf862 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_tx.c b/modules/common/dap_chain_datum_tx.c index 01511bfd93ec2efaea5a476736a7e8b468535a9e..e8069c9cb6c787d9ffc7d74d25243ad959e9b05f 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -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/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 19b1f2a926e4611a18250e599ef7a90259058e36..91d06c0e68a9105616d48f1b29fcddac427b7016 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; } @@ -713,8 +715,8 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a 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); + 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); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 40ccfc136e1dfa1beffbe2e63f8a36089f47c19a..3b2ce8bc1086a03751a79dd8b32764601053ef35 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; @@ -3887,7 +3880,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; // ---------------------------------------------------------------- @@ -4719,8 +4712,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 +4723,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 +4764,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 +4785,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)); @@ -5142,9 +5115,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 +5443,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 @@ -5660,44 +5616,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->tx->header.ts_created >= a_ts_from && l_iter_current->tx->header.ts_created <= 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++; + 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++; + 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 +5718,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 +5734,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 +5749,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); } } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 74d1833763db8e6d530d6f1c344ab2419b2f1e21..ab659d337739a8be2e142fd3e4023b59d0fc4a0d 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -384,12 +384,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); @@ -397,10 +395,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) @@ -1212,26 +1209,18 @@ 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); long double l_tpd = l_to_ts == l_from_ts ? 0 : @@ -1240,74 +1229,38 @@ static int s_cli_net(int argc, char **argv, void **reply) 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){ @@ -1958,7 +1911,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) 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; @@ -1970,7 +1923,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) 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", + log_it(L_ERROR, "Incorrect format of host \"%s\", fix net config or recheck internet connection, and restart node", l_permanent_links_hosts[i]); dap_chain_net_delete(l_net); dap_config_close(l_cfg); @@ -1988,7 +1941,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) for (uint16_t 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; @@ -2010,7 +1963,7 @@ int s_net_init(const char *a_net_name, uint16_t a_acl_idx) 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", + log_it(L_ERROR, "Incorrect format of host \"%s\", fix net config or recheck internet connection, and restart node", l_seed_nodes_hosts[i]); dap_chain_net_delete(l_net); dap_config_close(l_cfg); @@ -3218,7 +3171,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); diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index cbe144ca641039acf49446974037904599bc0397..182a023c9666be4622647e296362905be77c1eb9 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; } @@ -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_node.c b/modules/net/dap_chain_node.c index a0b601f7eceb6a1957734e228270d7cb182581e5..829377cc7116c3a335b0924abc1850fc0ba48ca6 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 @@ -410,12 +411,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; @@ -429,14 +424,19 @@ dap_list_t *dap_chain_node_get_states_list_sort(dap_chain_net_t *a_net, dap_chai log_it(L_ERROR, "%s", g_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_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index d6b35ecd5b50cd84336a70e26b599f57c9580798..6d3267ed4835fe7522f4a420ad5d746868957d79 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3603,10 +3603,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) { diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 709cfb6dc13dd96478f16fedb9e0b04bbc588b05..18174820bb623fcff32796ec0edaa0395b72a0ef 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) diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 777e259835417b9ddd7e0c28b401d82452309431..4766bae94587acbf22012d81a82eb183e08b5121 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" @@ -337,8 +339,6 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db); */ 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); /** * Check whether used 'out' items 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..da0faa4edcb4e6ecf8c4b3ce6bb26ce8d47c4009 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 @@ -2216,9 +2216,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); 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/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index bc70d6a6b4daa34db798af19c8d1137392b0b213..81a078789adbdd6003050ef8fc6a1d8c15ab2da5 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -1491,7 +1491,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); @@ -1691,10 +1692,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 +1732,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 +1767,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 +1793,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 +1818,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; 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..0040e2d36fff4a4fcd381031c89b0a52d9209d81 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -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, @@ -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;