diff --git a/CMakeLists.txt b/CMakeLists.txt index 65c28d313556b5cf60f9cd6a3b875d9658a81ef5..b3dc45e24351856fd940d42f496c709b34b7da01 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-51") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-52") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/crypto/include/dap_hash.h b/dap-sdk/crypto/include/dap_hash.h index d81d94df5ad53a37499205ac2d93ede70b6874ff..368157ec342d67c2a194228bdda49f7295138813 100755 --- a/dap-sdk/crypto/include/dap_hash.h +++ b/dap-sdk/crypto/include/dap_hash.h @@ -45,15 +45,16 @@ typedef enum dap_hash_type { typedef union dap_chain_hash_fast{ uint8_t raw[DAP_CHAIN_HASH_FAST_SIZE]; } dap_chain_hash_fast_t; +typedef dap_chain_hash_fast_t dap_hash_fast_t; #ifdef __cplusplus extern "C" { #endif //size_t dap_chain_hash_fast_to_str(dap_chain_hash_fast_t * a_hash, char * a_str, size_t a_str_max); -int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_chain_hash_fast_t * a_hash); +int dap_chain_hash_fast_from_str( const char * a_hash_str, dap_hash_fast_t * a_hash); -static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_chain_hash_fast_t *a_hash_out ) +static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, dap_hash_fast_t *a_hash_out ) { if ( (a_data_in == NULL) || (a_data_in_size == 0) || (a_hash_out == NULL) ) return false; @@ -74,18 +75,18 @@ static inline bool dap_hash_fast( const void *a_data_in, size_t a_data_in_size, * @param a_hash2 * @return */ -static inline bool dap_hash_fast_compare(dap_chain_hash_fast_t *a_hash1, dap_chain_hash_fast_t *a_hash2) +static inline bool dap_hash_fast_compare(dap_hash_fast_t *a_hash1, dap_hash_fast_t *a_hash2) { if(!a_hash1 || !a_hash2) return false; - if(!memcmp(a_hash1, a_hash2, sizeof(dap_chain_hash_fast_t))) + if(!memcmp(a_hash1, a_hash2, sizeof(dap_hash_fast_t))) return true; return false; } -static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash ) +static inline bool dap_hash_fast_is_blank( dap_hash_fast_t *a_hash ) { - static dap_chain_hash_fast_t l_blank_hash = { 0}; + static dap_hash_fast_t l_blank_hash = { 0}; // uint8_t *l_hast_bytes = (uint8_t*) a_hash; // for(size_t i = 0; i < sizeof(dap_chain_hash_fast_t); i++) { // if(l_hast_bytes[i]) @@ -95,7 +96,7 @@ static inline bool dap_hash_fast_is_blank( dap_chain_hash_fast_t *a_hash ) } -DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, char *a_str, size_t a_str_max ) +DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_hash_fast_t *a_hash, char *a_str, size_t a_str_max ) { assert(a_str_max >= (DAP_CHAIN_HASH_FAST_SIZE * 2 + 2)); a_str[0] = '0'; @@ -105,7 +106,7 @@ DAP_STATIC_INLINE int dap_chain_hash_fast_to_str( dap_chain_hash_fast_t *a_hash, return DAP_CHAIN_HASH_FAST_SIZE * 2 + 2; } -static inline char *dap_chain_hash_fast_to_str_new(dap_chain_hash_fast_t * a_hash) +static inline char *dap_chain_hash_fast_to_str_new(dap_hash_fast_t * a_hash) { const size_t c_hash_str_size = sizeof(*a_hash)*2 +1 /*trailing zero*/ +2 /* heading 0x */+4/*just to be sure*/ ; char * ret = DAP_NEW_Z_SIZE(char, c_hash_str_size); diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index db90df595e0f8f19ad47e9a1343ae0a7f30b59bd..79748f4a8e887ad8fdd3cc155003bb2836b5b64f 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -495,3 +495,34 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not a_chain->callback_notify = a_callback; a_chain->callback_notify_arg = a_callback_arg; } + +/** + * @brief dap_chain_get_last_atom_hash + * @param a_chain + * @param a_atom_hash + * @return + */ +bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash) +{ + bool l_ret = false; + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); + dap_chain_atom_ptr_t * l_lasts_atom; + size_t l_lasts_atom_count=0; + size_t* l_lasts_atom_size =NULL; + l_lasts_atom= a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count,&l_lasts_atom_size); + if (l_lasts_atom&& l_lasts_atom_count){ + assert(l_lasts_atom_size[0]); + assert(l_lasts_atom[0]); + if(a_atom_hash){ + dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0],a_atom_hash); + if(dap_log_level_get() <= L_DEBUG){ + char l_hash_str[128]={[0]='\0'}; + dap_chain_hash_fast_to_str(a_atom_hash,l_hash_str,sizeof (l_hash_str)-1); + log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str); + } + } + l_ret = true; + } + a_chain->callback_atom_iter_delete(l_atom_iter); + return l_ret; +} diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 8cb420e0b514c38f2f3e04abba52697c0f878411..cf6c1492664526add0905720fd802b14a08355b1 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -175,3 +175,4 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger,const char * a_chai void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); +bool dap_chain_get_atom_last_hash(dap_chain_t * a_chain, dap_hash_fast_t * a_atom_hash); diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 11648cfcda2451f0f5ae4fff7f69fdef6a8ba9a0..cb15c80a7f649ca1ef7627d9142cd062bcb0ae1b 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -525,64 +525,74 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: { - char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from); - char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to); - log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", l_ch_chain->request_hdr.net_id.uint64 , - l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, - l_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)"); - dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); - if(l_chain) { - if(l_ch_chain->state != CHAIN_STATE_IDLE) { - log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state", - l_hash_from_str? l_hash_from_str:"(null)", - l_hash_to_str?l_hash_to_str:"(null)"); - dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, - l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, - "ERROR_STATE_NOT_IN_IDLE"); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - } else { - // fill ids - if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { - memcpy(&l_ch_chain->request, l_chain_pkt->data, l_chain_pkt_data_size); - memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr)); + // fill ids + if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { + memcpy(&l_ch_chain->request, l_chain_pkt->data, l_chain_pkt_data_size); + memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr)); + char *l_hash_from_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_from); + char *l_hash_to_str = dap_chain_hash_fast_to_str_new(&l_ch_chain->request.hash_to); + log_it(L_INFO, "In: SYNC_CHAINS pkt: net 0x%016x chain 0x%016x cell 0x%016x between %s and %s", l_ch_chain->request_hdr.net_id.uint64 , + l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, + l_hash_from_str? l_hash_from_str: "(null)", l_hash_to_str?l_hash_to_str:"(null)"); + dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); + if(l_chain) { + if(l_ch_chain->state != CHAIN_STATE_IDLE) { + log_it(L_INFO, "Can't process SYNC_CHAINS request between %s and %s because not in idle state", + l_hash_from_str? l_hash_from_str:"(null)", + l_hash_to_str?l_hash_to_str:"(null)"); + dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, + "ERROR_STATE_NOT_IN_IDLE"); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + } else { + dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker); + dap_proc_queue_add_callback_inter( a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch); } - dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker); - dap_proc_queue_add_callback_inter( a_ch->stream_worker->worker->proc_queue_input, s_sync_chains_callback, a_ch); } + DAP_DELETE(l_hash_from_str); + DAP_DELETE(l_hash_to_str); + }else{ + log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request)); + dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, + "ERROR_CHAIN_PKT_DATA_SIZE" ); } - DAP_DELETE(l_hash_from_str); - DAP_DELETE(l_hash_to_str); - } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: { - log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u", - l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64, - l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end ); - if(l_ch_chain->state != CHAIN_STATE_IDLE) { - log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state"); - dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, - l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, - "ERROR_STATE_NOT_IN_IDLE"); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); - break; - } - // receive the latest global_db revision of the remote node -> go to send mode if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { dap_stream_ch_chain_sync_request_t * l_request = (dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data; memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size); memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr)); + dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker); dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch); - } - else { - log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request", - a_ch->stream->session->id); + log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u", + l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64, + l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end ); + if(l_ch_chain->state != CHAIN_STATE_IDLE) { + log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state"); + dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, + "ERROR_STATE_NOT_IN_IDLE"); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + break; + } + // receive the latest global_db revision of the remote node -> go to send mode + else { + log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request", + a_ch->stream->session->id); + dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, + "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD"); + dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + } + }else{ + log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request)); dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, - "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD"); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + "ERROR_CHAIN_PKT_DATA_SIZE" ); } } break; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 980e62e7f8fc946ed2f4726882a7c8154bd181e5..3490234113f30e068257a98d2df1dde562ec9c47 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -554,6 +554,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net) default: log_it(L_INFO, "Node sync error %d",l_res); } + /* dap_chain_node_client_reset(l_node_client); l_res = dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB_RVRS, a_net->pub.id, l_chain_id, a_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb)); @@ -568,6 +569,7 @@ static int s_net_states_proc(dap_chain_net_t *a_net) default: log_it(L_INFO, "Node reverse sync error %d",l_res); } + */ l_tmp = dap_list_next(l_tmp); } if (!l_pvt_net->links) { @@ -597,12 +599,17 @@ static int s_net_states_proc(dap_chain_net_t *a_net) int l_res = 0; DL_FOREACH (a_net->pub.chains, l_chain) { dap_chain_node_client_reset(l_node_client); - dap_stream_ch_chain_sync_request_t l_request = {}; - dap_chain_hash_fast_t *l_hash = dap_db_get_last_hash_remote(l_node_client->remote_node_addr.uint64, l_chain); - if (l_hash) { - memcpy(&l_request.hash_from, l_hash, sizeof(*l_hash)); - DAP_DELETE(l_hash); - } + dap_stream_ch_chain_sync_request_t l_request = {0}; + dap_chain_get_atom_last_hash(l_chain,&l_request.hash_from); + if ( !dap_hash_fast_is_blank(&l_request.hash_from) ){ + if(dap_log_level_get() <= L_DEBUG){ + char l_hash_str[128]={[0]='\0'}; + dap_chain_hash_fast_to_str(&l_request.hash_from,l_hash_str,sizeof (l_hash_str)-1); + log_it(L_DEBUG,"Send sync chain request from %s to infinity",l_hash_str); + } + }else + log_it(L_DEBUG,"Send sync chain request for all the chains for addr "NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr)); dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, a_net->pub.id, l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request)); // wait for finishing of request @@ -620,7 +627,10 @@ static int s_net_states_proc(dap_chain_net_t *a_net) default: log_it(L_ERROR, "Sync of chain '%s' error %d", l_chain->name,l_res); } + + /* dap_chain_node_client_reset(l_node_client); + l_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(a_net); dap_stream_ch_chain_pkt_write_mt(l_worker, l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS_RVRS, a_net->pub.id, l_chain->id, a_net->pub.cell_id, &l_request, sizeof(l_request)); @@ -642,6 +652,8 @@ static int s_net_states_proc(dap_chain_net_t *a_net) default: log_it(L_ERROR, "Reverse sync of chain '%s' error %d", l_chain->name,l_res); } + */ + } l_tmp = dap_list_next(l_tmp); }