diff --git a/dap-sdk/crypto/include/dap_sign.h b/dap-sdk/crypto/include/dap_sign.h index 1de33fe7bb144a689e6926ece32f055a52c238c3..4018361a65e70323cda9cb9aca0a741a0ca4b53c 100755 --- a/dap-sdk/crypto/include/dap_sign.h +++ b/dap-sdk/crypto/include/dap_sign.h @@ -127,7 +127,7 @@ uint8_t* dap_sign_get_sign(dap_sign_t *a_sign, size_t *a_sign_out); uint8_t* dap_sign_get_pkey(dap_sign_t *a_sign, size_t *a_pub_key_out); bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_hash); -bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_key_size_max); +bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size); dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign); const char * dap_sign_type_to_str(dap_sign_type_t a_chain_sign_type); dap_sign_type_t dap_sign_type_from_str(const char * a_type_str); diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index 3700b9c3f001620e22054a9a2a95a04782bba0b8..5d798691e5e1bbf9dfd7e7f71c30a1f0b7ad4f22 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -315,9 +315,13 @@ bool dap_sign_get_pkey_hash(dap_sign_t *a_sign, dap_chain_hash_fast_t * a_sign_h } -bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_key_size_max) +bool dap_sign_verify_size(dap_sign_t *a_sign, size_t a_max_key_size) { - if (a_sign->header.sign_pkey_size > a_key_size_max) + if (a_sign->header.sign_pkey_size > a_max_key_size) + return false; + if (a_sign->header.sign_size > a_max_key_size) + return false; + if (a_sign->header.sign_pkey_size > a_sign->header.sign_size) return false; return true; } @@ -349,7 +353,7 @@ dap_enc_key_t *dap_sign_to_enc_key(dap_sign_t * a_chain_sign) */ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t a_data_size) { - if (!a_chain_sign || !a_data || !dap_sign_verify_size(a_chain_sign, a_data_size)) + if (!a_chain_sign || !a_data) return -2; dap_enc_key_t * l_key = dap_sign_to_enc_key(a_chain_sign); diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 33c758c2a4fa0a0b8e6925db3cd452f94690e68d..cda76b3195794ca835f41ddc99a1fedc67a4e984 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -336,10 +336,15 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha if ( dap_config_get_item_str_default(l_cfg , "files","storage_dir",NULL ) ) { DAP_CHAIN_PVT ( l_chain)->file_storage_dir = strdup ( dap_config_get_item_str( l_cfg , "files","storage_dir" ) ) ; - if ( dap_chain_load_all( l_chain ) != 0 ){ - dap_chain_save_all( l_chain ); + if (dap_chain_load_all(l_chain) == 0) { + if (l_chain->callback_atom_add_from_treshold) { + while (l_chain->callback_atom_add_from_treshold(l_chain, NULL)) { + log_it(L_DEBUG, "Added atom from treshold"); + } + } + //dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Loaded chain files"); - }else { + } else { dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Initialized chain files"); } diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 20a31982a566d931fc801ba63cee952d8f1eedec..e4b10ca85ab599a692f610722edf77ace4c01fbf 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -22,7 +22,7 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ #include "uthash.h" - +#include <unistd.h> #include "dap_common.h" #include "dap_config.h" #include "dap_strfuncs.h" @@ -170,15 +170,15 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) } size_t l_el_size = 0; unsigned long q = 0; - volatile dap_chain_cell_t *l_dummy; - for (fread(&l_el_size, 1, sizeof(l_el_size), l_f); !feof(l_f); l_el_size = 0, fread(&l_el_size, 1, sizeof(l_el_size), l_f)) + volatile int l_dummy; + for (l_dummy = fread(&l_el_size, 1, sizeof(l_el_size), l_f); !feof(l_f); l_el_size = 0, l_dummy = fread(&l_el_size, 1, sizeof(l_el_size), l_f)) { if (!l_el_size) { log_it(L_ERROR, "Zero element size, chain %s is corrupted", l_file_path); ret = -4; break; } - dap_chain_atom_ptr_t l_element = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t, l_el_size); + dap_chain_atom_ptr_t l_element = DAP_NEW_SIZE(dap_chain_atom_ptr_t, l_el_size); if (!l_element) { log_it(L_ERROR, "Out of memory"); ret = -5; @@ -188,7 +188,6 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) if(l_read == l_el_size) { a_chain->callback_atom_add(a_chain, l_element, l_el_size); // !!! blocking GDB call !!! ++q; - DAP_DELETE(l_element); } else { log_it(L_ERROR, "Read only %zd of %zd bytes, stop cell loading", l_read, l_el_size); ret = -6; @@ -200,7 +199,7 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) log_it(L_INFO, "Couldn't load all atoms, %d only", q); } else { log_it(L_INFO, "Loaded all %d atoms in cell %s", q, a_cell_file_path); - l_dummy = dap_chain_cell_create_fill2(a_chain, a_cell_file_path); + dap_chain_cell_create_fill2(a_chain, a_cell_file_path); } fclose(l_f); return ret; @@ -263,7 +262,10 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s // if no atom provided in arguments, we flush all the atoms in given chain size_t l_atom_size = a_atom_size ? a_atom_size : 0; int l_total_wrote_bytes = 0; - dap_chain_atom_iter_t *l_atom_iter = a_atom ? a_cell->chain->callback_atom_iter_create(a_cell->chain) : NULL; + dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain); + if (!a_atom) { + fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET); + } for (dap_chain_atom_ptr_t l_atom = a_atom ? (dap_chain_atom_ptr_t)a_atom : a_cell->chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); l_atom; l_atom = a_atom ? NULL : a_cell->chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size)) @@ -293,6 +295,11 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s (void *)l_atom, l_atom_size); } + if (l_total_wrote_bytes > 0) { + fflush(a_cell->file_storage); + if (!a_atom) + ftruncate(fileno(a_cell->file_storage), l_total_wrote_bytes + sizeof(dap_chain_cell_file_header_t)); + } if (l_atom_iter) { a_cell->chain->callback_atom_iter_delete(l_atom_iter); } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index a21907184fef17010bb26d9ea66335d8a56cb361..d9eaf907ae3f8caef02da5235eb95c01ba565cd3 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -1113,12 +1113,16 @@ int dap_chain_ledger_token_emission_add_check(dap_ledger_t *a_ledger, const dap_ dap_sign_get_pkey_hash(l_sign,&l_sign_pkey_hash); // Find pkey in auth hashes for(uint16_t k=0; k< l_token_item->auth_signs_total; k++ ){ - if ( dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k])) + if ( dap_hash_fast_compare(&l_sign_pkey_hash, &l_token_item->auth_signs_pkey_hash[k])) { // Verify if its token emission header signed + if (!dap_sign_verify_size(l_sign, a_token_emission_size)) { + break; + } if( dap_sign_verify(l_sign,&a_token_emission->hdr, sizeof (a_token_emission) ) ){ l_aproves++; break; } + } } l_offset+=l_sign_size; }else diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 05a1e9c167fb08fab9f85acc468e653f8484a287..bb60eb3945cfff89f9f527b13e5c1f32ed78eaef 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -633,22 +633,22 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_WARNING, "In: GLOBAL_DB parse: packet in list with NULL data(pkt_data_size:%zd)", l_pkt_item->pkt_data_size); } - uint64_t l_last_id = 0; - char *l_last_group = NULL; - char l_last_type = '\0'; + uint64_t l_last_id = l_store_obj->id; + char *l_last_group = l_store_obj->group; + char l_last_type = l_store_obj->type; bool l_group_changed = false; for (size_t i = 0; i < l_data_obj_count; i++) { // obj to add dap_store_obj_t *l_obj = l_store_obj + i; - l_group_changed = l_last_group && (strcmp(l_last_group, l_obj->group) || l_last_type != l_obj->type); + l_group_changed = strcmp(l_last_group, l_obj->group) || l_last_type != l_obj->type; // Send remote side notification about received obj if (l_sync_request->request.node_addr.uint64 && (l_group_changed || i == l_data_obj_count - 1)) { struct sync_request *l_sync_req_tsd = DAP_DUP(l_sync_request); l_sync_req_tsd->request.id_end = l_last_id; - l_sync_req_tsd->gdb.sync_group = l_obj->type == 'a' ? dap_strdup(l_obj->group) : - dap_strdup_printf("%s.del", l_obj->group); + l_sync_req_tsd->gdb.sync_group = l_obj->type == 'a' ? dap_strdup(l_last_group) : + dap_strdup_printf("%s.del", l_last_group); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_gdb_sync_tsd_worker_callback, l_sync_req_tsd); } @@ -838,6 +838,12 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_data_ptr += sizeof(uint64_t); char *l_group = (char *)l_data_ptr; dap_db_set_last_id_remote(l_node_addr, l_last_id, l_group); + if (s_debug_more) { + dap_chain_node_addr_t l_addr; + l_addr.uint64 = l_node_addr; + log_it(L_INFO, "Set last_id %"DAP_UINT64_FORMAT_U" for group %s for node "NODE_ADDR_FP_STR, + l_last_id, l_group, NODE_ADDR_FP_ARGS_S(l_addr)); + } } else if (s_debug_more) log_it(L_DEBUG, "Global DB TSD packet detected"); } break; @@ -873,12 +879,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) (size_t) (((byte_t*)l_element) - l_chain_pkt->data ) < l_chain_pkt_data_size; l_element++){ dap_stream_ch_chain_hash_item_t * l_hash_item = NULL; - HASH_FIND(hh,l_ch_chain->remote_gdbs, &l_element->hash, sizeof (l_element->hash), l_hash_item ); - if( ! l_hash_item ){ + unsigned l_hash_item_hashv; + HASH_VALUE(&l_element->hash, sizeof(l_element->hash), l_hash_item_hashv); + HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, &l_element->hash, sizeof(l_element->hash), + l_hash_item_hashv, l_hash_item); + if (!l_hash_item) { l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t); memcpy(&l_hash_item->hash, &l_element->hash, sizeof (l_element->hash)); l_hash_item->size = l_element->size; - HASH_ADD(hh, l_ch_chain->remote_gdbs, hash, sizeof (l_hash_item->hash), l_hash_item); + HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, hash, sizeof(l_hash_item->hash), + l_hash_item_hashv, l_hash_item); /*if (s_debug_more){ char l_hash_str[72]={ [0]='\0'}; dap_chain_hash_fast_to_str(&l_hash_item->hash,l_hash_str,sizeof (l_hash_str)); @@ -1077,12 +1087,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) (size_t) (((byte_t*)l_element) - l_chain_pkt->data ) < l_chain_pkt_data_size; l_element++){ dap_stream_ch_chain_hash_item_t * l_hash_item = NULL; - HASH_FIND(hh,l_ch_chain->remote_atoms , &l_element->hash, sizeof (l_element->hash), l_hash_item ); + unsigned l_hash_item_hashv; + HASH_VALUE(&l_element->hash, sizeof(l_element->hash), l_hash_item_hashv); + HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_atoms, &l_element->hash, sizeof(l_element->hash), + l_hash_item_hashv, l_hash_item); if( ! l_hash_item ){ l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t); memcpy(&l_hash_item->hash, &l_element->hash, sizeof (l_element->hash)); l_hash_item->size = l_element->size; - HASH_ADD(hh, l_ch_chain->remote_atoms, hash, sizeof (l_hash_item->hash), l_hash_item); + HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_atoms, hash, sizeof(l_hash_item->hash), + l_hash_item_hashv, l_hash_item); l_count_added++; /* if (s_debug_more){ @@ -1135,7 +1149,6 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) log_it(L_INFO, "In: SYNC_CHAINS pkt"); } struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); - l_ch_chain->state = CHAIN_STATE_SYNC_CHAINS; l_ch_chain->stats_request_atoms_processed = 0; if (l_ch_pkt->hdr.type == 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); @@ -1314,6 +1327,7 @@ void dap_stream_ch_chain_go_idle ( dap_stream_ch_chain_t * a_ch_chain) HASH_DEL(a_ch_chain->remote_atoms, l_hash_item); DAP_DELETE(l_hash_item); } + a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; } /** @@ -1374,7 +1388,10 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) if (!l_obj) break; dap_stream_ch_chain_hash_item_t *l_hash_item = NULL; - HASH_FIND(hh, l_ch_chain->remote_gdbs, &l_obj->hash, sizeof(dap_hash_fast_t), l_hash_item); + unsigned l_hash_item_hashv = 0; + HASH_VALUE(&l_obj->hash, sizeof(dap_chain_hash_fast_t), l_hash_item_hashv); + HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, &l_obj->hash, sizeof(dap_hash_fast_t), + l_hash_item_hashv, l_hash_item); if (l_hash_item) { // If found - skip it /*if (s_debug_more) { char l_request_atom_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; @@ -1387,7 +1404,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t); memcpy(&l_hash_item->hash, &l_obj->hash, sizeof(dap_chain_hash_fast_t)); l_hash_item->size = l_obj->pkt->data_size; - HASH_ADD(hh, l_ch_chain->remote_gdbs, hash, sizeof(dap_chain_hash_fast_t), l_hash_item); + HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_gdbs, hash, sizeof(dap_chain_hash_fast_t), + l_hash_item_hashv, l_hash_item); l_pkt = dap_store_packet_multiple(l_pkt, l_obj->pkt); l_ch_chain->stats_request_gdb_processed++; l_pkt_size = sizeof(dap_store_obj_pkt_t) + l_pkt->data_size; @@ -1470,8 +1488,11 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_ch_chain->request_atom_iter && l_ch_chain->request_atom_iter->cur; k++){ // Check if present and skip if present - dap_stream_ch_chain_hash_item_t * l_hash_item = NULL; - HASH_FIND(hh,l_ch_chain->remote_atoms, l_ch_chain->request_atom_iter->cur_hash , sizeof (l_hash_item->hash), l_hash_item ); + dap_stream_ch_chain_hash_item_t *l_hash_item = NULL; + unsigned l_hash_item_hashv = 0; + HASH_VALUE(l_ch_chain->request_atom_iter->cur_hash, sizeof(dap_chain_hash_fast_t), l_hash_item_hashv); + HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_atoms, l_ch_chain->request_atom_iter->cur_hash, + sizeof(dap_chain_hash_fast_t), l_hash_item_hashv, l_hash_item); if( l_hash_item ){ // If found - skip it if(s_debug_more){ char l_request_atom_hash_str[81]={[0]='\0'}; @@ -1480,9 +1501,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_request_atom_hash_str); } }else{ - l_hash_item = DAP_NEW_Z(dap_stream_ch_chain_hash_item_t); - dap_hash_fast(l_ch_chain->request_atom_iter->cur, l_ch_chain->request_atom_iter->cur_size, - &l_hash_item->hash); + l_hash_item = DAP_NEW(dap_stream_ch_chain_hash_item_t); + memcpy(&l_hash_item->hash, l_ch_chain->request_atom_iter->cur_hash, sizeof(dap_chain_hash_fast_t)); if(s_debug_more){ char *l_atom_hash_str= dap_chain_hash_fast_to_str_new(&l_hash_item->hash); log_it(L_INFO, "Out CHAIN pkt: atom hash %s (size %zd) ", l_atom_hash_str, l_ch_chain->request_atom_iter->cur_size); @@ -1495,21 +1515,9 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_ch_chain->stats_request_atoms_processed++; l_hash_item->size = l_ch_chain->request_atom_iter->cur_size; - - unsigned l_hash_item_hashv =0; - dap_stream_ch_chain_hash_item_t *l_hash_item_check = NULL; - - HASH_VALUE(&l_hash_item->hash ,sizeof (l_hash_item->hash), - l_hash_item_hashv); - HASH_FIND_BYHASHVALUE(hh, l_ch_chain->remote_atoms,&l_hash_item->hash ,sizeof (l_hash_item->hash), - l_hash_item_hashv, l_hash_item_check); - if (l_hash_item_check ==NULL ){ - // Because we sent this atom to remote - we record it to not to send it twice - HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_atoms, hash, sizeof (l_hash_item->hash),l_hash_item_hashv, - l_hash_item); - }else - DAP_DELETE(l_hash_item); - + // Because we sent this atom to remote - we record it to not to send it twice + HASH_ADD_BYHASHVALUE(hh, l_ch_chain->remote_atoms, hash, sizeof(l_hash_item->hash), l_hash_item_hashv, + l_hash_item); } // Then get next atom and populate new last l_ch_chain->request_atom_iter->chain->callback_atom_iter_get_next(l_ch_chain->request_atom_iter, NULL); diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 2c8a7d8f450c1f5ce4e3f0f538fa1cae008a2212..6f48ec58ed6d1381985539588f87b58674f7a536 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -237,7 +237,7 @@ int dap_chain_datum_tx_verify_sign(dap_chain_datum_tx_t *tx) log_it(L_WARNING,"Incorrect signature's header, possible corrupted data"); return -4; } - if(dap_sign_verify(l_sign, tx->tx_items, tx_items_pos) != 1) { + if (!dap_sign_verify_size(l_sign, tx_items_size) || dap_sign_verify(l_sign, tx->tx_items, tx_items_pos) != 1) { // invalid signature ret = 0; tx_items_pos += l_item_tx_size; diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index 5e810d4c8282ef41ae54e0553f32270a938d9e43..fc2be92cdd3b535d1d68fd2438eb2ccc71759a6f 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -238,8 +238,9 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } size_t l_dag_event_size_without_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size); - int l_sign_verify_ret = dap_sign_verify(l_sign,a_dag_event,l_dag_event_size_without_sign); - if ( l_sign_verify_ret != 0){ + bool l_sign_verify_ret = dap_sign_verify_size(l_sign, a_dag_event_size) && + dap_sign_verify(l_sign,a_dag_event,l_dag_event_size_without_sign) == 0; + if ( !l_sign_verify_ret ){ log_it(L_WARNING, "Event's sign is incorrect: code %d", l_sign_verify_ret); return -41; diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c index a362e52f6bd972ba74140658f73347d44b113b9a..66a46cca55fa61f821a68b7150af9448263f9635 100644 --- a/modules/global-db/dap_chain_global_db_hist.c +++ b/modules/global-db/dap_chain_global_db_hist.c @@ -12,7 +12,7 @@ #include "dap_chain_global_db_hist.h" #include "uthash.h" -#define GDB_SYNC_ALWAYS_FROM_ZERO +//#define GDB_SYNC_ALWAYS_FROM_ZERO // for dap_db_history() typedef struct dap_tx_data{ diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 9e1f98e2e0ee816778c967e791ac86dd599eefd2..a85237c4dff4d9a925832785a942e9c12986b03a 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -34,7 +34,7 @@ #if DAP_SRV_STAKE_USED #include "dap_chain_net_srv_stake.h" #else -static bool dap_chain_net_srv_stake_key_delegated() { return false; } +static bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr) { UNUSED(a_addr); return false; } #endif //#include "dap_chain_net_srv_geoip.h" @@ -535,7 +535,8 @@ static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const dap_chain_global_db_gr_del(dap_strdup(a_key), a_group); } else { dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size]; - if (!dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size)) { + if (!dap_sign_verify_size(l_sign, a_value_len) || + dap_sign_verify(l_sign, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size) != 1) { dap_chain_global_db_gr_del(dap_strdup(a_key), a_group); DAP_DELETE(l_gdb_group_str); return; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index b0872587527a162f6a978f55070f89969df67c60..015eb3fe8697c48833e6f0e91ef34f7536e6d24d 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -24,6 +24,7 @@ #include <stdlib.h> #include <time.h> #include <pthread.h> +#include "errno.h" #include "uthash.h" #ifdef _WIN32 @@ -300,12 +301,12 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger case DAP_CHAIN_DATUM_TOKEN_DECL: { dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; return dap_chain_ledger_token_load(a_ledger, l_token, l_datum->header.data_size); - } + } break; case DAP_CHAIN_DATUM_TOKEN_EMISSION: { dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data; return dap_chain_ledger_token_emission_load(a_ledger, l_token_emission, l_datum->header.data_size); - } + } break; case DAP_CHAIN_DATUM_TX: { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data; @@ -319,10 +320,12 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger l_tx_event->event = a_event_item->event; l_tx_event->event_size = a_event_item->event_size; memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) ); - pthread_rwlock_wrlock(l_events_rwlock); + int l_err = pthread_rwlock_wrlock(l_events_rwlock); HASH_ADD(hh,PVT(a_dag)->tx_events, hash, sizeof (l_tx_event->hash), l_tx_event); - pthread_rwlock_unlock(l_events_rwlock); + if (l_err != EDEADLK) { + pthread_rwlock_unlock(l_events_rwlock); } + } break; default: return -1; @@ -376,9 +379,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha l_event_item->event_size = a_atom_size; l_event_item->ts_added = time(NULL); - dap_hash_fast(l_event, a_atom_size,&l_event_item->hash ); dap_chain_hash_fast_t l_event_hash; - dap_chain_cs_dag_event_calc_hash(l_event, a_atom_size,&l_event_hash); + dap_chain_cs_dag_event_calc_hash(l_event, a_atom_size, &l_event_hash); + memcpy(&l_event_item->hash, &l_event_hash, sizeof(dap_chain_hash_fast_t)); char * l_event_hash_str; if(s_debug_more) { @@ -421,10 +424,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha case ATOM_ACCEPT: { int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item); //All correct, no matter for result - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_wrlock(l_events_rwlock); HASH_ADD(hh, PVT(l_dag)->events,hash,sizeof (l_event_item->hash), l_event_item); s_dag_events_lasts_process_new_last_event(l_dag, l_event_item); - pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_unlock(l_events_rwlock); switch (l_consensus_check) { case 0: if(s_debug_more) @@ -439,7 +442,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha ret = ATOM_MOVE_TO_THRESHOLD; break; default: - log_it(L_WARNING, "Atom %s (size %zd) error adding (code %d)", l_event_hash_str,a_atom_size, l_consensus_check); + l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); + log_it(L_WARNING, "Atom %s (size %zd) error adding (code %d)", l_event_hash_str, a_atom_size, l_consensus_check); ret = ATOM_REJECT; break; } @@ -730,7 +734,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ DAP_DELETE(l_event_hash_str); DAP_DELETE(l_genesis_event_hash_str); return ATOM_REJECT; - }else{ + } else { + if (s_debug_more) + log_it(L_INFO, "Accepting static genesis event"); return ATOM_ACCEPT; } } @@ -739,9 +745,9 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ //chain coherence if (! PVT(l_dag)->events ){ res = ATOM_MOVE_TO_THRESHOLD; - log_it(L_DEBUG, "*** event %p goes to threshold", l_event); + //log_it(L_DEBUG, "*** event %p goes to threshold", l_event); } else { - log_it(L_DEBUG, "*** event %p hash count %d",l_event, l_event->header.hash_count); + //log_it(L_DEBUG, "*** event %p hash count %d",l_event, l_event->header.hash_count); for (size_t i = 0; i< l_event->header.hash_count; i++) { dap_chain_hash_fast_t * l_hash = ((dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs) + i; dap_chain_cs_dag_event_item_t * l_event_search = NULL; @@ -878,7 +884,6 @@ dap_chain_cs_dag_event_item_t* dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); if(s_debug_more) log_it(L_DEBUG, "Processing event (threshold): %s...", l_event_hash_str); - int l_add_res = s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item); HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (l_event_item->hash), l_event_item); s_dag_events_lasts_process_new_last_event(a_dag, l_event_item);