diff --git a/CMakeLists.txt b/CMakeLists.txt index 16097f62b5258e20e82f34f257f9635b33081d92..14bcb0d0ffb08c56dfcc2b28cd60498c045696a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,7 @@ endif() if (CELLFRAME_MODULES MATCHES "network") message("[+] Module 'network'") set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_io dap_json_rpc dap_enc_server dap_notify_srv dap_http_server dap_session - dap_stream dap_stream_ch dap_client dap_cli_server dap_stream_ch_chain_net dap_chain_net dap_chain_net_srv dap_stream_ch_chain_voting dap_chain_mempool ) + dap_stream dap_stream_ch dap_client dap_cli_server dap_stream_ch_chain_net dap_chain_net dap_chain_net_srv dap_chain_mempool) endif() # Chain net services diff --git a/dap-sdk b/dap-sdk index 277fc0459376d770da32c4a6d885824fbebd7b69..40ff133c163d177dbfb2bbc1bf3ddfd0740ab1a4 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 277fc0459376d770da32c4a6d885824fbebd7b69 +Subproject commit 40ff133c163d177dbfb2bbc1bf3ddfd0740ab1a4 diff --git a/modules/CMakeLists.txt b/modules/CMakeLists.txt index 188c40318a74c72a529f19877ee7b0ecc95003ab..1aca3bdd4b20b06554a6cc296a9731a0bcbd42e9 100644 --- a/modules/CMakeLists.txt +++ b/modules/CMakeLists.txt @@ -23,7 +23,6 @@ if (CELLFRAME_MODULES MATCHES "network") add_subdirectory(json_rpc) # Stream channels add_subdirectory(channel/chain-net) - add_subdirectory(channel/chain-voting) endif() # Mining 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 762a57f1caf58836a566a090667950eda0375457..b1d9e9998fb10c93662452edf0cd803da679d740 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 @@ -1190,7 +1190,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch , void* a_arg) } l_request->err_code = 0; - dap_strncpy(l_request->host_send, a_ch->stream->esocket->remote_addr_str, 0xFF); + dap_strncpy(l_request->host_send, a_ch->stream->esocket->remote_addr_str, DAP_HOSTADDR_STRLEN); l_request->recv_time2 = dap_nanotime_now(); dap_stream_ch_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_RESPONSE, l_request, diff --git a/modules/channel/chain-voting/CMakeLists.txt b/modules/channel/chain-voting/CMakeLists.txt deleted file mode 100644 index f9efc7aa2bda54f5d0f283bf8f0e71ee8034ef8c..0000000000000000000000000000000000000000 --- a/modules/channel/chain-voting/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project (dap_stream_ch_chain_voting) - -file(GLOB DAP_STREAM_CH_CHAIN_VOTING_SRCS *.c) -file(GLOB DAP_STREAM_CH_CHAIN_VOTING_HDRS include/*.h) - -add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_CHAIN_VOTING_SRCS} ${DAP_STREAM_CH_CHAIN_VOTING_HDRS}) - -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch dap_chain_net) - - -target_include_directories(${PROJECT_NAME} INTERFACE .) -target_include_directories(${PROJECT_NAME} PUBLIC include) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../../../../dap-sdk/3rdparty/uthash/src) - -if (INSTALL_SDK) -set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${DAP_STREAM_CH_CHAIN_VOTING_HDRS}") -INSTALL(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION lib/modules/channel/chain-voting/ - ARCHIVE DESTINATION lib/modules/channel/chain-voting/ - PUBLIC_HEADER DESTINATION include/modules/channel/chain-voting/ -) -endif() \ No newline at end of file diff --git a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c b/modules/channel/chain-voting/dap_stream_ch_chain_voting.c deleted file mode 100644 index 4f3c204c3719c19078659613fc100f268d700bbc..0000000000000000000000000000000000000000 --- a/modules/channel/chain-voting/dap_stream_ch_chain_voting.c +++ /dev/null @@ -1,236 +0,0 @@ -#include "dap_stream.h" -#include "dap_stream_worker.h" -#include "dap_stream_ch_pkt.h" -#include "dap_stream_ch.h" -#include "dap_stream_ch_proc.h" -#include "dap_chain_ch.h" -#include "dap_stream_ch_chain_voting.h" -#include "dap_chain_net.h" -#include "dap_client_pvt.h" -#include "dap_chain_node_cli.h" -#include "dap_chain_cs_blocks.h" - -#define LOG_TAG "dap_stream_ch_chain_voting" - -#define PKT_SIGN_N_HDR_OVERHEAD (15 * 1024) - -struct voting_pkt_in_callback { - void * arg; - dap_chain_voting_ch_callback_t packet_in_callback; -}; - -struct voting_node_client_list { - dap_chain_node_addr_t node_addr; // HT key - dap_chain_node_info_t *node_info; - dap_chain_node_client_t *node_client; - UT_hash_handle hh; -}; - -static struct voting_node_client_list *s_node_client_list = NULL; - -static size_t s_pkt_in_callback_count = 0; -static struct voting_pkt_in_callback s_pkt_in_callback[16] = {}; -static pthread_rwlock_t s_node_client_list_lock; - -static void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg); -static void s_stream_ch_delete(dap_stream_ch_t *a_ch, void *a_arg); -static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg); - -int dap_stream_ch_chain_voting_init() -{ - log_it(L_NOTICE, "Chains voting channel initialized"); - - pthread_rwlock_init(&s_node_client_list_lock, NULL); - dap_stream_ch_proc_add(DAP_STREAM_CH_VOTING_ID, - s_stream_ch_new, - s_stream_ch_delete, - s_stream_ch_packet_in, - NULL); - - return 0; -} - -void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch_callback_t packet_in_callback) -{ - size_t i = s_pkt_in_callback_count; - s_pkt_in_callback[i].arg = a_arg; - s_pkt_in_callback[i].packet_in_callback = packet_in_callback; - s_pkt_in_callback_count++; -} - -static bool s_callback_pkt_in_call_all(void *a_arg) -{ - dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = a_arg; - for (size_t i = 0; i < s_pkt_in_callback_count; i++) { - struct voting_pkt_in_callback *l_callback = s_pkt_in_callback + i; - if (l_callback->packet_in_callback) { - l_callback->packet_in_callback(l_callback->arg, &l_voting_pkt->hdr.sender_node_addr, &l_voting_pkt->hdr.receiver_node_addr, - &l_voting_pkt->hdr.data_hash, l_voting_pkt->data, l_voting_pkt->hdr.data_size); - } - } - DAP_DELETE(a_arg); - return false; -} - -void dap_stream_ch_voting_queue_clear() -{ - for (struct voting_node_client_list *it = s_node_client_list; it; it = it->hh.next) - dap_chain_node_client_queue_clear(it->node_client); -} - -void dap_stream_ch_chain_voting_message_write(dap_chain_net_t *a_net, dap_chain_node_addr_t *a_remote_node_addr, - dap_stream_ch_chain_voting_pkt_t *a_voting_pkt) -{ - size_t l_voting_pkt_size = sizeof(*a_voting_pkt) + a_voting_pkt->hdr.data_size; - struct voting_node_client_list *l_node_client_item = NULL; - if (a_remote_node_addr->uint64 != dap_chain_net_get_cur_addr_int(a_net)) { - pthread_rwlock_rdlock(&s_node_client_list_lock); - HASH_FIND(hh, s_node_client_list, a_remote_node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item); - pthread_rwlock_unlock(&s_node_client_list_lock); - if (!l_node_client_item) { - size_t node_info_size = 0; - dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t*)dap_global_db_get_sync(a_net->pub.gdb_nodes, - dap_chain_node_addr_to_str_static(a_remote_node_addr), - &node_info_size, NULL, NULL); - if (!l_node_info) { - log_it(L_WARNING, "Can't find validator's addr "NODE_ADDR_FP_STR" in database", NODE_ADDR_FP_ARGS(a_remote_node_addr)); - return; - } - char l_channels[] = { DAP_STREAM_CH_VOTING_ID, '\0' }; - dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect_channels(a_net, l_node_info, l_channels); - if (!l_node_client || !l_node_client->client) { - log_it(L_ERROR, "Can't connect to remote node "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_remote_node_addr)); - return; - } - l_node_client->client->connect_on_demand = true; - l_node_client->client->always_reconnect = true; - - l_node_client_item = DAP_NEW_Z(struct voting_node_client_list); - if (!l_node_client_item) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - l_node_client_item->node_addr = *a_remote_node_addr; - l_node_client_item->node_info = l_node_info; - l_node_client_item->node_client = l_node_client; - pthread_rwlock_wrlock(&s_node_client_list_lock); - HASH_ADD(hh, s_node_client_list, node_addr, sizeof(dap_chain_node_addr_t), l_node_client_item); - pthread_rwlock_unlock(&s_node_client_list_lock); - } - if (!l_node_client_item->node_client) { - log_it(L_ERROR, "NULL node_client in item of voting channel"); - return; - } - dap_chain_node_client_write_mt(l_node_client_item->node_client, DAP_STREAM_CH_VOTING_ID, - DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA, a_voting_pkt, - l_voting_pkt_size); - } else - dap_proc_thread_callback_add(NULL, s_callback_pkt_in_call_all, - DAP_DUP_SIZE(a_voting_pkt, l_voting_pkt_size)); -} - -void dap_stream_ch_chain_voting_deinit() -{ - struct voting_node_client_list *l_node_info_item, *l_node_info_tmp; - HASH_ITER(hh, s_node_client_list, l_node_info_item, l_node_info_tmp) { - // Clang bug at this, l_node_info_item should change at every loop cycle - HASH_DEL(s_node_client_list, l_node_info_item); - dap_chain_node_client_close_mt(l_node_info_item->node_client); - DAP_DELETE(l_node_info_item); - } -} - -void dap_stream_ch_chain_voting_close_all_clients(dap_chain_net_id_t a_net_id) -{ - struct voting_node_client_list *l_node_info_item, *l_node_info_tmp; - pthread_rwlock_wrlock(&s_node_client_list_lock); - HASH_ITER(hh, s_node_client_list, l_node_info_item, l_node_info_tmp) { - // Clang bug at this, l_node_info_item should change at every loop cycle - if (l_node_info_item->node_client->net->pub.id.uint64 == a_net_id.uint64){ - HASH_DEL(s_node_client_list, l_node_info_item); - dap_chain_node_client_close_mt(l_node_info_item->node_client); - DAP_DELETE(l_node_info_item); - } - } - pthread_rwlock_unlock(&s_node_client_list_lock); -} - -static void s_stream_ch_new(dap_stream_ch_t *a_ch, void *a_arg) -{ - UNUSED(a_arg); - a_ch->internal = DAP_NEW_Z(dap_stream_ch_chain_voting_t); - dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch); - l_ch_chain_voting->_inheritor = a_ch; -} - -static void s_stream_ch_delete(dap_stream_ch_t *a_ch, UNUSED_ARG void *a_arg) -{ - DAP_DEL_Z(a_ch->internal); -} - -static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) -{ - dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *) a_arg; - if (!l_ch_pkt) - return; - - size_t l_voting_pkt_size = l_ch_pkt->hdr.data_size; - if (!l_voting_pkt_size || l_voting_pkt_size < sizeof(dap_stream_ch_chain_voting_pkt_t) || - l_voting_pkt_size > DAP_CHAIN_CS_BLOCKS_MAX_BLOCK_SIZE + PKT_SIGN_N_HDR_OVERHEAD) { - log_it(L_ERROR, "Invalid packet size %zu, drop this packet", l_voting_pkt_size); - return; - } - - dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = (dap_stream_ch_chain_voting_pkt_t *)l_ch_pkt->data; - dap_chain_net_t *l_net = dap_chain_net_by_id(l_voting_pkt->hdr.net_id); - - if (!l_net) - return; - if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) { - log_it(L_ERROR, "Reject packet because net %s is offline", l_net->pub.name); - dap_stream_ch_chain_voting_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_ERROR, l_voting_pkt->hdr.net_id.uint64, - &l_voting_pkt->hdr.sender_node_addr, &l_voting_pkt->hdr.receiver_node_addr, NULL, 0); - a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; - return; - } - - dap_proc_thread_callback_add(dap_proc_thread_get(a_ch->stream_worker->worker->id), s_callback_pkt_in_call_all, - DAP_DUP_SIZE(l_voting_pkt, l_voting_pkt_size)); - dap_stream_ch_chain_voting_t *l_ch_chain_voting = DAP_STREAM_CH_CHAIN_VOTING(a_ch); - if (l_ch_chain_voting->callback_notify) - l_ch_chain_voting->callback_notify(l_ch_chain_voting, l_ch_pkt->hdr.type, l_voting_pkt, - l_voting_pkt->hdr.data_size, l_ch_chain_voting->callback_notify_arg); -} - -dap_stream_ch_chain_voting_pkt_t *dap_stream_ch_chain_voting_pkt_new(uint64_t a_net_id, - dap_chain_node_addr_t *a_sender_node_addr, - dap_chain_node_addr_t *a_receiver_node_addr, - const void *a_data, size_t a_data_size) -{ - dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_voting_pkt_t, - sizeof(dap_stream_ch_chain_voting_pkt_t) + a_data_size); - l_voting_pkt->hdr.data_size = a_data_size; - l_voting_pkt->hdr.version = 1; - l_voting_pkt->hdr.net_id.uint64 = a_net_id; - if (a_sender_node_addr) - l_voting_pkt->hdr.sender_node_addr = *a_sender_node_addr; - if (a_receiver_node_addr) - l_voting_pkt->hdr.receiver_node_addr = *a_receiver_node_addr; - dap_hash_fast(a_data, a_data_size, &l_voting_pkt->hdr.data_hash); - if (a_data_size && a_data) - memcpy(l_voting_pkt->data, a_data, a_data_size); - return l_voting_pkt; -} - -size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id, - dap_chain_node_addr_t *a_sender_node_addr, - dap_chain_node_addr_t *a_receiver_node_addr, - const void * a_data, size_t a_data_size) -{ - dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = dap_stream_ch_chain_voting_pkt_new(a_net_id, a_sender_node_addr, - a_receiver_node_addr, a_data, - a_data_size); - size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_voting_pkt, sizeof(l_voting_pkt) + a_data_size); - DAP_DELETE(l_voting_pkt); - return l_ret; -} diff --git a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h b/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h deleted file mode 100644 index 5f55d10dea0daee4f7209fb5d484fbf5ba52f438..0000000000000000000000000000000000000000 --- a/modules/channel/chain-voting/include/dap_stream_ch_chain_voting.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include <pthread.h> - -#include "dap_chain_common.h" -#include "dap_chain.h" -#include "dap_chain_node_client.h" -#include "dap_list.h" -#include "uthash.h" - -#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_DATA 0x01 -#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_TEST 0x02 -#define DAP_STREAM_CH_CHAIN_VOTING_PKT_TYPE_ERROR 0xFF - -#define DAP_STREAM_CH_VOTING_ID 'V' - -typedef void (*dap_chain_voting_ch_callback_t)(void *a_arg, dap_chain_node_addr_t *a_sender_addr, dap_chain_node_addr_t *a_receiver_addr, - dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size); - -typedef struct dap_stream_ch_chain_voting_pkt_hdr { - uint8_t version; - uint8_t padding[7]; - uint64_t data_size; - dap_chain_hash_fast_t data_hash; - dap_chain_net_id_t net_id; - dap_chain_node_addr_t sender_node_addr; - dap_chain_node_addr_t receiver_node_addr; -} DAP_ALIGN_PACKED dap_stream_ch_chain_voting_pkt_hdr_t; - -typedef struct dap_stream_ch_chain_voting_pkt { - dap_stream_ch_chain_voting_pkt_hdr_t hdr; - uint8_t data[]; -} DAP_ALIGN_PACKED dap_stream_ch_chain_voting_pkt_t; - - -typedef struct dap_stream_ch_chain_voting dap_stream_ch_chain_voting_t; -typedef void (*dap_stream_ch_chain_voting_callback_packet_t)(dap_stream_ch_chain_voting_t *a_ch_voting, uint8_t a_pkt_type, - dap_stream_ch_chain_voting_pkt_t *a_pkt, size_t a_pkt_data_size, - void * a_arg); - -typedef struct dap_stream_ch_chain_voting { - void *_inheritor; // parent stream ch - dap_stream_ch_chain_voting_callback_packet_t callback_notify; - void *callback_notify_arg; -} dap_stream_ch_chain_voting_t; - -#define DAP_STREAM_CH_CHAIN_VOTING(a) ((dap_stream_ch_chain_voting_t *) ((a)->internal) ) - -inline static uint8_t dap_stream_ch_chain_voting_get_id(void) { return (uint8_t) 'V'; } - -void dap_stream_ch_chain_voting_in_callback_add(void* a_arg, dap_chain_voting_ch_callback_t packet_in_callback); - -void dap_stream_ch_chain_voting_message_write(dap_chain_net_t * a_net, dap_chain_node_addr_t *a_remote_node_addr, - dap_stream_ch_chain_voting_pkt_t *a_voting_pkt); - -dap_stream_ch_chain_voting_pkt_t *dap_stream_ch_chain_voting_pkt_new(uint64_t a_net_id, - dap_chain_node_addr_t *a_sender_node_addr, - dap_chain_node_addr_t *a_receiver_node_addr, - const void *a_data, size_t a_data_size); - -size_t dap_stream_ch_chain_voting_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id, - dap_chain_node_addr_t *a_sender_node_addr, - dap_chain_node_addr_t *a_receiver_node_addr, - const void * a_data, size_t a_data_size); - -int dap_stream_ch_chain_voting_init(); -void dap_stream_ch_chain_voting_deinit(); -void dap_stream_ch_chain_voting_close_all_clients(dap_chain_net_id_t a_net_id); -void dap_stream_ch_voting_queue_clear(); diff --git a/modules/consensus/esbocs/CMakeLists.txt b/modules/consensus/esbocs/CMakeLists.txt index 9c1ccd621372ddc6438b9d009ea8559ea453275f..68598f99038dce11e73fa6aa6bb6639f1f3028a7 100644 --- a/modules/consensus/esbocs/CMakeLists.txt +++ b/modules/consensus/esbocs/CMakeLists.txt @@ -8,7 +8,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_ESBOCS_SRCS} ${DAP_CHAIN_CS_ESBOC target_include_directories(${PROJECT_NAME} INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_stream_ch_chain_voting dap_chain_net_srv_stake) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_chain dap_chain_cs_blocks dap_chain_net_srv_stake) if (INSTALL_SDK) set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${DAP_CHAIN_CS_ESBOCS_HEADERS}") @@ -17,4 +17,4 @@ INSTALL(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib/modules/consensus/esbocs/ PUBLIC_HEADER DESTINATION include/modules/consensus/esbocs/ ) -endif() \ No newline at end of file +endif() diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index 58306e4d9b0cd7baa5ff8d3429a440fa74c57573..b1b5ac2f6f86ed783ca8404ba9ad97ae0b6060a3 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -25,6 +25,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "utlist.h" #include "dap_timerfd.h" #include "rand/dap_rand.h" +#include "dap_stream_ch_proc.h" #include "dap_chain_net.h" #include "dap_chain_common.h" #include "dap_chain_mempool.h" @@ -32,7 +33,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_chain_cs.h" #include "dap_chain_cs_blocks.h" #include "dap_chain_cs_esbocs.h" -#include "dap_stream_ch_chain_voting.h" #include "dap_chain_net_srv_stake_pos_delegate.h" #include "dap_chain_ledger.h" #include "dap_chain_node_cli.h" @@ -51,8 +51,8 @@ enum s_esbocs_session_state { static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_validators); static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s_esbocs_session_state a_new_state, dap_time_t a_time); -static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr, - dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size); +static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg); +static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain_node_addr_t *a_sender_node_addr, uint8_t *a_data, size_t a_data_size); static void s_session_round_clear(dap_chain_esbocs_session_t *a_session); static void s_session_round_new(dap_chain_esbocs_session_t *a_session); static bool s_session_candidate_to_chain( @@ -164,9 +164,14 @@ DAP_STATIC_INLINE uint16_t s_get_round_skip_timeout(dap_chain_esbocs_session_t * return PVT(a_session->esbocs)->round_attempt_timeout * 6 * PVT(a_session->esbocs)->round_attempts_max; } -int dap_chain_cs_esbocs_init() { - dap_stream_ch_chain_voting_init(); +int dap_chain_cs_esbocs_init() +{ dap_chain_cs_add("esbocs", s_callback_new); + dap_stream_ch_proc_add(DAP_STREAM_CH_ESBOCS_ID, + NULL, + NULL, + 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>" "\tSets minimum validators count for ESBOCS consensus\n" @@ -527,7 +532,6 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf pthread_mutexattr_settype(&l_mutex_attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&l_session->mutex, &l_mutex_attr); pthread_mutexattr_destroy(&l_mutex_attr); - dap_stream_ch_chain_voting_in_callback_add(l_session, s_session_packet_in); dap_chain_add_callback_notify(a_chain, s_new_atom_notifier, l_session); s_session_round_new(l_session); @@ -580,7 +584,6 @@ void dap_chain_esbocs_stop_timer(dap_chain_net_id_t a_net_id) l_session->cs_timer = NULL; } } - dap_stream_ch_chain_voting_close_all_clients(a_net_id); } void dap_chain_esbocs_start_timer(dap_chain_net_id_t a_net_id) @@ -910,10 +913,8 @@ static void s_session_round_clear(dap_chain_esbocs_session_t *a_session) static void s_session_round_new(dap_chain_esbocs_session_t *a_session) { - if (!a_session->round_fast_forward) { + if (!a_session->round_fast_forward) s_session_update_penalty(a_session); - dap_stream_ch_voting_queue_clear(); - } s_session_round_clear(a_session); a_session->cur_round.id++; a_session->cur_round.sync_attempt++; @@ -956,11 +957,9 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session) a_session->chain->net_name, a_session->chain->name, a_session->cur_round.id); l_round_already_started = true; for (dap_list_t *it = l_item->messages; it; it = it->next) { - dap_hash_fast_t l_msg_hash; dap_chain_esbocs_message_t *l_msg = it->data; size_t l_msg_size = s_get_esbocs_message_size(l_msg); - dap_hash_fast(l_msg, l_msg_size, &l_msg_hash); - s_session_packet_in(a_session, NULL, NULL, &l_msg_hash, (uint8_t *)l_msg, l_msg_size); + s_session_packet_in(a_session, NULL, (uint8_t *)l_msg, l_msg_size); } } HASH_ITER(hh, a_session->sync_items, l_item, l_tmp) { @@ -1451,8 +1450,7 @@ static void s_session_candidate_verify(dap_chain_esbocs_session_t *a_session, da l_item->message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_COMMIT_SIGN) && dap_hash_fast_compare(&l_item->message->hdr.candidate_hash, a_candidate_hash) && l_item->message->hdr.attempt_num == a_session->cur_round.attempt_num) { - s_session_packet_in(a_session, NULL, NULL, &l_item->message_hash, - (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message)); + s_session_packet_in(a_session, NULL, (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message)); } } // Process candidate @@ -1770,8 +1768,7 @@ static void s_session_directive_process(dap_chain_esbocs_session_t *a_session, d l_item->message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_AGAINST) && dap_hash_fast_compare(&l_item->message->hdr.candidate_hash, a_directive_hash) && l_item->message->hdr.attempt_num == a_session->cur_round.attempt_num) { - s_session_packet_in(a_session, NULL, NULL, &l_item->message_hash, - (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message)); + s_session_packet_in(a_session, NULL, (uint8_t *)l_item->message, s_get_esbocs_message_size(l_item->message)); } } // Send own vote @@ -1849,6 +1846,81 @@ static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, return 0; } +struct esbocs_msg_args { + dap_stream_node_addr_t addr_from; + dap_chain_esbocs_session_t *session; + size_t message_size; + byte_t message[]; +}; + +static bool s_process_incoming_message(void *a_arg) +{ + struct esbocs_msg_args *l_args = a_arg; + s_session_packet_in(l_args->session, &l_args->addr_from, l_args->message, l_args->message_size); + DAP_DELETE(l_args); + return false; +} + +static void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg) +{ + dap_stream_ch_pkt_t *l_ch_pkt = (dap_stream_ch_pkt_t *)a_arg; + if (!l_ch_pkt) + return; + dap_chain_esbocs_message_t *l_message = (dap_chain_esbocs_message_t *)l_ch_pkt->data; + size_t l_message_size = l_ch_pkt->hdr.data_size; + if (l_message_size < sizeof(dap_chain_esbocs_message_t) || + l_message_size > DAP_CHAIN_CS_BLOCKS_MAX_BLOCK_SIZE + PKT_SIGN_N_HDR_OVERHEAD || + l_message_size != sizeof(*l_message) + l_message->hdr.sign_size + l_message->hdr.message_size) { + log_it(L_WARNING, "Invalid message size %zu, drop this packet", l_message_size); + return; + } + dap_chain_net_t *l_net = dap_chain_net_by_id(l_message->hdr.net_id); + if (!l_net) { + log_it(L_WARNING, "Can't find net with ID 0x%" DAP_UINT64_FORMAT_x, l_message->hdr.net_id.uint64); + return; + } + if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) { + log_it(L_MSG, "Reject packet because net %s is offline", l_net->pub.name); + a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; + return; + } + if (l_message->hdr.recv_addr.uint64 != g_node_addr.uint64) { + log_it(L_WARNING, "Wrong packet destination address" NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_message->hdr.recv_addr)); + return; + } + dap_chain_esbocs_session_t *l_session; + DL_FOREACH(s_session_items, l_session) + if (l_session->chain->net_id.uint64 == l_net->pub.id.uint64) + break; + if (!l_session) { + log_it(L_WARNING, "Session for net %s not found", l_net->pub.name); + a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; + return; + } + if (l_message->hdr.version != DAP_CHAIN_ESBOCS_PROTOCOL_VERSION) { + debug_if(PVT(l_session->esbocs)->debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U + " Message is rejected - different protocol version %hu (need %u)", + l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id, + l_message->hdr.version, DAP_CHAIN_ESBOCS_PROTOCOL_VERSION); + return; + } + debug_if(PVT(l_session->esbocs)->debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." + " Receive pkt type:0x%x from addr:"NODE_ADDR_FP_STR", my_addr:"NODE_ADDR_FP_STR"", + l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id, + l_session->cur_round.attempt_num, l_message->hdr.type, + 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, g_error_memory_alloc); + return; + } + l_args->addr_from = a_ch->stream->node; + l_args->session = l_session; + l_args->message_size = l_message_size; + memcpy(l_args->message, l_message, l_message_size); + dap_proc_thread_callback_add(NULL, s_process_incoming_message, l_args); +} + /** * @brief s_session_packet_in * @param a_arg @@ -1857,19 +1929,13 @@ static int s_session_directive_apply(dap_chain_esbocs_directive_t *a_directive, * @param a_data * @param a_data_size */ -static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr, - dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size) +static void s_session_packet_in(dap_chain_esbocs_session_t *a_session, dap_chain_node_addr_t *a_sender_node_addr, uint8_t *a_data, size_t a_data_size) { - dap_chain_esbocs_session_t *l_session = a_arg; + dap_chain_esbocs_session_t *l_session = a_session; dap_chain_esbocs_message_t *l_message = (dap_chain_esbocs_message_t *)a_data; bool l_cs_debug = PVT(l_session->esbocs)->debug; uint16_t l_cs_level = PVT(l_session->esbocs)->min_validators_count; - if (a_data_size < sizeof(dap_chain_esbocs_message_hdr_t)) { - log_it(L_WARNING, "Too smalll message size %zu, less than header size %zu", a_data_size, sizeof(dap_chain_esbocs_message_hdr_t)); - return; - } - size_t l_message_data_size = l_message->hdr.message_size; void *l_message_data = l_message->msg_n_sign; dap_chain_hash_fast_t *l_candidate_hash = &l_message->hdr.candidate_hash; @@ -1878,46 +1944,26 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod dap_chain_esbocs_round_t *l_round = &l_session->cur_round; dap_chain_addr_t l_signing_addr; char l_validator_addr_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = {0}; + dap_chain_hash_fast_t l_data_hash = {}; + + dap_hash_fast(l_message, a_data_size, &l_data_hash); if (a_sender_node_addr) { //Process network messages only pthread_mutex_lock(&l_session->mutex); - debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." - " Receive pkt type:0x%x from addr:"NODE_ADDR_FP_STR", my_addr:"NODE_ADDR_FP_STR"", - l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id, - l_session->cur_round.attempt_num, l_message->hdr.type, - NODE_ADDR_FP_ARGS(a_sender_node_addr), NODE_ADDR_FP_ARGS_S(l_session->my_addr)); - if (a_receiver_node_addr->uint64 != l_session->my_addr.uint64) { - debug_if(l_cs_debug, L_MSG, "Wrong packet destination address"); - goto session_unlock; - } - if (l_message->hdr.version != DAP_CHAIN_ESBOCS_PROTOCOL_VERSION) { - debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U - " SYNC message is rejected - different protocol version %hu (need %u)", - l_session->chain->net_name, l_session->chain->name, l_session->cur_round.id, - l_message->hdr.version, DAP_CHAIN_ESBOCS_PROTOCOL_VERSION); - goto session_unlock; - } - if (sizeof(*l_message) + l_message->hdr.sign_size + l_message->hdr.message_size != a_data_size) { - log_it(L_WARNING, "incorrect message size in header is %zu when data size is only %zu and header size is %zu", - l_message->hdr.sign_size, a_data_size, sizeof(*l_message)); - goto session_unlock; - } - if (l_message->hdr.chain_id.uint64 != l_session->chain->id.uint64) { debug_if(l_cs_debug, L_MSG, "Invalid chain ID %"DAP_UINT64_FORMAT_U, l_message->hdr.chain_id.uint64); goto session_unlock; } - - dap_chain_hash_fast_t l_data_hash = {}; - dap_hash_fast(l_message, a_data_size, &l_data_hash); - if (!dap_hash_fast_compare(a_data_hash, &l_data_hash)) { + // check hash message dup + dap_chain_esbocs_message_item_t *l_message_item_temp = NULL; + HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_message_item_temp); + if (l_message_item_temp) { debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." - " Message rejected: message hash does not match", + " Message rejected: message hash is exists in chain (duplicate)", l_session->chain->net_name, l_session->chain->name, - l_session->cur_round.id, l_session->cur_round.attempt_num); + l_session->cur_round.id, l_message->hdr.attempt_num); goto session_unlock; } - l_message->hdr.sign_size = 0; // restore header on signing time if (dap_sign_verify_all(l_sign, l_sign_size, l_message, l_message_data_size + sizeof(l_message->hdr))) { debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." @@ -1948,16 +1994,6 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod l_session->cur_round.id, l_message->hdr.round_id); } - // check hash message dup - dap_chain_esbocs_message_item_t *l_message_item_temp = NULL; - HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_message_item_temp); - if (l_message_item_temp) { - debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu." - " Message rejected: message hash is exists in chain (duplicate)", - l_session->chain->net_name, l_session->chain->name, - l_session->cur_round.id, l_message->hdr.attempt_num); - goto session_unlock; - } dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_session->chain->net_id); // check messages chain dap_chain_esbocs_message_item_t *l_chain_message, *l_chain_message_tmp; @@ -1985,7 +2021,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod } } } - s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr); + s_message_chain_add(l_session, l_message, a_data_size, &l_data_hash, &l_signing_addr); } else dap_chain_addr_fill_from_sign(&l_signing_addr, l_sign, l_session->chain->net_id); @@ -1998,7 +2034,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod case DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC: // Add local sync messages, cause a round clear if (!a_sender_node_addr) - s_message_chain_add(l_session, l_message, a_data_size, a_data_hash, &l_signing_addr); + s_message_chain_add(l_session, l_message, a_data_size, &l_data_hash, &l_signing_addr); // Accept all validators l_not_in_list = !dap_chain_net_srv_stake_key_delegated(&l_signing_addr); break; @@ -2164,7 +2200,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod l_session->cur_round.id, l_message->hdr.attempt_num, l_approve ? "APPROVE" : "REJECT", l_candidate_hash_str); dap_chain_esbocs_message_item_t *l_unprocessed_item = NULL; - HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item); + HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item); if (l_unprocessed_item) l_unprocessed_item->unprocessed = true; break; @@ -2313,7 +2349,7 @@ static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_nod l_message->hdr.type == DAP_CHAIN_ESBOCS_MSG_TYPE_VOTE_FOR ? "FOR" : "AGAINST"); dap_chain_esbocs_message_item_t *l_unprocessed_item = NULL; - HASH_FIND(hh, l_round->message_items, a_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item); + HASH_FIND(hh, l_round->message_items, &l_data_hash, sizeof(dap_chain_hash_fast_t), l_unprocessed_item); if (l_unprocessed_item) l_unprocessed_item->unprocessed = true; break; @@ -2353,50 +2389,60 @@ session_unlock: static void s_message_send(dap_chain_esbocs_session_t *a_session, uint8_t a_message_type, dap_hash_fast_t *a_block_hash, const void *a_data, size_t a_data_size, dap_list_t *a_validators) { - dap_chain_net_t *l_net = dap_chain_net_by_id(a_session->chain->net_id); size_t l_message_size = sizeof(dap_chain_esbocs_message_hdr_t) + a_data_size; dap_chain_esbocs_message_t *l_message = NULL; DAP_NEW_Z_SIZE_RET(l_message, dap_chain_esbocs_message_t, l_message_size, NULL); l_message->hdr.version = DAP_CHAIN_ESBOCS_PROTOCOL_VERSION; + l_message->hdr.type = a_message_type; l_message->hdr.round_id = a_session->cur_round.id; l_message->hdr.attempt_num = a_session->cur_round.attempt_num; + l_message->hdr.net_id = a_session->chain->net_id; l_message->hdr.chain_id = a_session->chain->id; l_message->hdr.ts_created = dap_time_now(); - l_message->hdr.type = a_message_type; l_message->hdr.message_size = a_data_size; l_message->hdr.candidate_hash = *a_block_hash; if (a_data && a_data_size) memcpy(l_message->msg_n_sign, a_data, a_data_size); - dap_sign_t *l_sign = dap_sign_create(PVT(a_session->esbocs)->blocks_sign_key, l_message, - sizeof(l_message->hdr) + a_data_size, 0); - size_t l_sign_size = dap_sign_get_size(l_sign); - l_message_size += l_sign_size; - l_message = DAP_REALLOC(l_message, l_message_size); - if (!l_message) { - log_it(L_CRITICAL, "Memory allocation error"); - return; - } - memcpy(l_message->msg_n_sign + a_data_size, l_sign, l_sign_size); - DAP_DELETE(l_sign); - l_message->hdr.sign_size = l_sign_size; - - dap_stream_ch_chain_voting_pkt_t *l_voting_pkt = - dap_stream_ch_chain_voting_pkt_new(l_net->pub.id.uint64, &a_session->my_addr, - NULL, l_message, l_message_size); - DAP_DELETE(l_message); - for (dap_list_t *it = a_validators; it; it = it->next) { dap_chain_esbocs_validator_t *l_validator = it->data; if (l_validator->is_synced || a_message_type == DAP_CHAIN_ESBOCS_MSG_TYPE_START_SYNC) { debug_if(PVT(a_session->esbocs)->debug, L_MSG, "Send pkt type 0x%x to "NODE_ADDR_FP_STR, a_message_type, NODE_ADDR_FP_ARGS_S(l_validator->node_addr)); - l_voting_pkt->hdr.receiver_node_addr = l_validator->node_addr; - dap_stream_ch_chain_voting_message_write(l_net, &l_validator->node_addr, l_voting_pkt); + l_message->hdr.recv_addr = l_validator->node_addr; + l_message->hdr.sign_size = 0; + dap_sign_t *l_sign = dap_sign_create(PVT(a_session->esbocs)->blocks_sign_key, l_message, + l_message_size, 0); + size_t l_sign_size = dap_sign_get_size(l_sign); + 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, "Memory allocation error"); + return; + } + memcpy(l_message->msg_n_sign + a_data_size, l_sign, l_sign_size); + DAP_DELETE(l_sign); + + if (l_validator->node_addr.uint64 != a_session->my_addr.uint64) { + dap_stream_ch_pkt_send_by_addr(&l_validator->node_addr, DAP_STREAM_CH_ESBOCS_ID, + a_message_type, l_message, l_message_size + l_sign_size); + continue; + } + 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, g_error_memory_alloc); + return; + } + l_args->addr_from = a_session->my_addr; + l_args->session = a_session; + l_args->message_size = l_message_size + l_sign_size; + memcpy(l_args->message, l_message, l_message_size + l_sign_size); + dap_proc_thread_callback_add(NULL, s_process_incoming_message, l_args); } } - DAP_DELETE(l_voting_pkt); + DAP_DELETE(l_message); } diff --git a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h index 53b9533a3a9ac7320099e7db6682b6c24ae1b7ab..ab8eb9743be616510df3a054efd0cd96ab8a86cd 100644 --- a/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h +++ b/modules/consensus/esbocs/include/dap_chain_cs_esbocs.h @@ -30,6 +30,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_cert.h" #include "dap_global_db_driver.h" +#define DAP_STREAM_CH_ESBOCS_ID 'E' + #define DAP_CHAIN_ESBOCS_PROTOCOL_VERSION 8 #define DAP_CHAIN_ESBOCS_GDB_GROUPS_PREFIX "esbocs" #define DAP_CHAIN_CLUSTER_ID_ESBOCS 0x8000 @@ -53,6 +55,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #define DAP_CHAIN_ESBOCS_DIRECTIVE_TSD_TYPE_ADDR 0x01 +#define PKT_SIGN_N_HDR_OVERHEAD (15 * 1024) + typedef struct dap_chain_esbocs_session dap_chain_esbocs_session_t; /* consensus messages @@ -74,9 +78,10 @@ typedef struct dap_chain_esbocs_message_hdr { uint64_t sign_size; uint64_t message_size; dap_time_t ts_created; - dap_chain_net_id_t net_it; + dap_chain_net_id_t net_id; dap_chain_id_t chain_id; dap_chain_cell_id_t cell_id; + dap_stream_node_addr_t recv_addr; dap_hash_fast_t candidate_hash; } DAP_ALIGN_PACKED dap_chain_esbocs_message_hdr_t; diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt index 6fca1d33d2056731e63a2ece9cc51ae9c02e6383..4cc53c5c4e335ae4ddd37c241026abad795140a8 100644 --- a/modules/net/CMakeLists.txt +++ b/modules/net/CMakeLists.txt @@ -30,7 +30,7 @@ add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_io dap_notify_srv dap_cli_server dap_chain dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_global_db dap_chain_net_srv_xchange dap_chain_cs_none - dap_stream_ch_chain_net dap_stream_ch_chain_voting dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common) + dap_stream_ch_chain_net dap_chain_cs_esbocs dap_json_rpc dap_json_rpc_chain_common) if(LINUX) target_link_libraries(${PROJECT_NAME} resolv) endif() @@ -50,4 +50,4 @@ INSTALL(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib/modules/net/ PUBLIC_HEADER DESTINATION include/modules/net/ ) -endif() \ No newline at end of file +endif() diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c index dc920e8a48c15779b88d07845bad27bb366245ba..8e5a61dbc4e29a37949eb41db997c803fd9f0f09 100644 --- a/modules/net/dap_chain_net_node_list.c +++ b/modules/net/dap_chain_net_node_list.c @@ -127,7 +127,7 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple, uint8_t l_host_size = dap_min(INET6_ADDRSTRLEN, (int)dap_strlen(a_http_simple->es_hostaddr) + 1); l_node_info = DAP_NEW_STACK_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_host_size); *l_node_info = (dap_chain_node_info_t) { - .address = addr, + .address.uint64 = addr, .ext_port = port, .ext_host_len = dap_strncpy(l_node_info->ext_host, a_http_simple->es_hostaddr, l_host_size) - l_node_info->ext_host }; @@ -363,4 +363,4 @@ int dap_chain_net_node_list_init() } DAP_DELETE(l_addr_by_alias); return l_res; -}*/ \ No newline at end of file +}*/ diff --git a/modules/net/dap_chain_net_voting.c b/modules/net/dap_chain_net_voting.c index ab69757fb3a2f3e70347dad8daf2bfdc60c0d5b4..0f2b73180c160cd6997417f39d18ffdf40b509df 100644 --- a/modules/net/dap_chain_net_voting.c +++ b/modules/net/dap_chain_net_voting.c @@ -572,7 +572,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) } if(dap_list_length(l_options_list)>DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT){ - dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can to contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT); + dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT); return -102; } @@ -626,7 +626,7 @@ static int s_cli_voting(int a_argc, char **a_argv, void **a_str_reply) return DAP_CHAIN_NET_VOTE_CREATE_LENGTH_QUESTION_OVERSIZE_MAX; } break; case DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX: { - dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can to contain no more than %d options", + dap_cli_server_cmd_set_reply_text(a_str_reply, "The voting can contain no more than %d options", DAP_CHAIN_DATUM_TX_VOTING_OPTION_MAX_COUNT); return DAP_CHAIN_NET_VOTE_CREATE_COUNT_OPTION_OVERSIZE_MAX; } break; @@ -1574,17 +1574,15 @@ dap_list_t *dap_chain_net_vote_list(dap_chain_net_t *a_net) { return l_list; } -dap_chain_net_vote_info_t *dap_chain_net_vote_extract_info(dap_chain_net_t *a_net, dap_hash_fast_t *a_voting) { +dap_chain_net_vote_info_t *dap_chain_net_vote_extract_info(dap_chain_net_t *a_net, dap_hash_fast_t *a_voting) +{ if (!a_net || !a_voting) return NULL; dap_chain_net_votings_t *l_voting = NULL; pthread_rwlock_rdlock(&s_votings_rwlock); - HASH_FIND(hh, s_votings, &a_voting, sizeof(dap_hash_fast_t), l_voting); + HASH_FIND(hh, s_votings, a_voting, sizeof(dap_hash_fast_t), l_voting); pthread_rwlock_unlock(&s_votings_rwlock); - if(!l_voting){ - return NULL; - } - return s_dap_chain_net_vote_extract_info(l_voting); + return l_voting ? s_dap_chain_net_vote_extract_info(l_voting) : NULL; } void dap_chain_net_vote_info_free(dap_chain_net_vote_info_t *a_info){ diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 57a7739067d95b7591629ae48e1bf0a1c8565bb0..206764e7db10b5d2e05363a1cccd4648f730f3de 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -982,7 +982,7 @@ int com_node(int a_argc, char ** a_argv, void **a_str_reply) dap_cli_server_cmd_set_reply_text(a_str_reply, "node requires parameter -port"); return -1; } - l_node_info->ext_host_len = dap_strncpy(l_node_info->ext_host, l_hostname, 0xFF) - l_node_info->ext_host; + l_node_info->ext_host_len = dap_strncpy(l_node_info->ext_host, l_hostname, DAP_HOSTADDR_STRLEN) - l_node_info->ext_host; l_node_info->address.uint64 = dap_chain_net_get_cur_addr_int(l_net); if (l_addr_str) { if (dap_chain_node_info_save(l_net, &l_node_info) == DAP_GLOBAL_DB_RC_SUCCESS) { diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 60d9bbf32f5ae1716c20f3b0f811c1b7c80008db..14d7c426dae8246dfe1727c997eefb42142b0ffc 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -67,7 +67,6 @@ #include "dap_stream_ch_proc.h" #include "dap_stream_ch_chain_net_pkt.h" #include "dap_stream_ch_chain_net_srv.h" -#include "dap_stream_ch_chain_voting.h" #include "dap_stream_pkt.h" #include "dap_chain_node_client.h" @@ -962,15 +961,6 @@ static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ l_node_client->ch_chain_net_srv = l_ch; l_node_client->ch_chain_net_srv_uuid = l_ch->uuid; break; - } - // 'V' - case DAP_STREAM_CH_VOTING_ID: { - dap_stream_ch_chain_voting_t *l_ch_chain = DAP_STREAM_CH_CHAIN_VOTING(l_ch); - // l_ch_chain->callback_notify = s_ch_chain_callback_notify_voting_packet_in; - l_ch_chain->callback_notify_arg = l_node_client; - l_node_client->ch_chain_net = l_ch; - l_node_client->ch_chain_net_uuid = l_ch->uuid; - break; } default: { l_ret = -2; diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 091c90e48a1d767f10cd9011971683daa70f915c..8669a791d98b5ce2cb57c41df83b20e29c59519a 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -178,7 +178,7 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_test { 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[0xFF + 1], host_recv[0xFF + 1]; + 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; diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index dbe305b35043720a3f9c2313c261c83c23e2e739..1ef5e9feddf6250a2c4a2e3b946ab569f1319ee6 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -504,7 +504,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_host, u int l_timeout_conn_ms = 10000; int l_ret = 0; - unsigned l_hostlen = dap_min((int)dap_strlen(a_host), 0xFF); + unsigned l_hostlen = dap_min((int)dap_strlen(a_host), DAP_HOSTADDR_STRLEN); if(!s_node_info) s_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_hostlen + 1); s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen) - s_node_info->ext_host; @@ -551,7 +551,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_host, u l_request->data_size = a_data_size_to_send; randombytes(l_request->data, a_data_size_to_send); dap_hash_fast(l_request->data, l_request->data_size, &l_request->data_hash); - dap_strncpy(l_request->host_recv, a_host, 0xFF); + dap_strncpy(l_request->host_recv, a_host, DAP_HOSTADDR_STRLEN); l_request->time_connect_ms = l_dtime_connect_ms; l_request->send_time1 = dap_nanotime_now(); size_t l_request_size = l_request->data_size + sizeof(dap_stream_ch_chain_net_srv_pkt_test_t); @@ -586,10 +586,10 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_host, u { dap_return_val_if_fail(a_net && a_host, -1); int l_ret = 0; - unsigned l_hostlen = dap_min((int)strlen(a_host), 0xFF); + unsigned l_hostlen = dap_min((int)strlen(a_host), DAP_HOSTADDR_STRLEN); if(!s_node_info) s_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, sizeof(dap_chain_node_info_t) + l_hostlen + 1); - s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen); + s_node_info->ext_host_len = dap_strncpy(s_node_info->ext_host, a_host, l_hostlen) - s_node_info->ext_host; s_node_info->ext_port = a_port; const char l_active_channels[] = { DAP_STREAM_CH_NET_SRV_ID, DAP_STREAM_CH_NET_SRV_ID_VPN, 0 }; //R, S