diff --git a/dap-sdk/core/src/dap_config.c b/dap-sdk/core/src/dap_config.c index fea4cf8e0dadae744a13b357e12ee3cd36c5e641..9064f362ca409d65c9acdad231224168c94e368e 100755 --- a/dap-sdk/core/src/dap_config.c +++ b/dap-sdk/core/src/dap_config.c @@ -595,7 +595,7 @@ const char * dap_config_get_item_str_default(dap_config_t * a_config, const char */ bool dap_config_get_item_bool(dap_config_t * a_config, const char * a_section_path, const char * a_item_name) { -char *cp; + const char *cp; if ( !(cp = dap_config_get_item_str(a_config, a_section_path, a_item_name)) ) return false; diff --git a/dap-sdk/crypto/src/dap_sign.c b/dap-sdk/crypto/src/dap_sign.c index 7bb858d07ffe2ccf0e5358487d72915280ea7fde..628d1e0bf3e746c5940a36a11f93ffb3953a398d 100755 --- a/dap-sdk/crypto/src/dap_sign.c +++ b/dap-sdk/crypto/src/dap_sign.c @@ -441,7 +441,7 @@ int dap_sign_verify(dap_sign_t * a_chain_sign, const void * a_data, const size_t */ size_t dap_sign_get_size(dap_sign_t * a_chain_sign) { - if(!a_chain_sign) + if(!a_chain_sign || a_chain_sign->header.type.type == SIG_TYPE_NULL) return 0; return (sizeof(dap_sign_t) + a_chain_sign->header.sign_size + a_chain_sign->header.sign_pkey_size); } diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index c97c38f0a56f1a5c8ad702d2bb7bb24093115dd8..821db99af59892057dd8b0e26bd833ae1fe37e83 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -664,7 +664,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) } uint64_t l_last_id = l_store_obj->id; - char *l_last_group = l_store_obj->group; + const char *l_last_group = l_store_obj->group; int l_last_type = l_store_obj->type; bool l_group_changed = false; @@ -740,15 +740,14 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) dap_chain_t *l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); if(l_chain) { if(l_chain->callback_add_datums_with_group){ - void * restrict l_store_obj_value = l_store_obj[i].value; + const void * restrict l_store_obj_value = l_store_obj[i].value; l_chain->callback_add_datums_with_group(l_chain, (dap_chain_datum_t** restrict) l_store_obj_value, 1, l_store_obj[i].group); } } // save data to global_db - dap_store_obj_t *l_obj_copy = dap_store_obj_copy(l_obj, 1); - if(!dap_chain_global_db_obj_save(l_obj_copy, 1)) { + if(!dap_chain_global_db_obj_save(l_obj, 1)) { struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_gdb_in_pkt_error_worker_callback, l_sync_req_err); @@ -756,8 +755,6 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) if (s_debug_more) log_it(L_DEBUG, "Added new GLOBAL_DB synchronization record"); } - DAP_DELETE(l_obj_copy->group); - DAP_DELETE(l_obj_copy); } if(l_store_obj) { dap_store_obj_free(l_store_obj, l_data_obj_count); diff --git a/modules/common/include/dap_chain_datum.h b/modules/common/include/dap_chain_datum.h index 0b112fa6b1eb23f27bcf49693dcaa4294b11d38d..1c27bd58292cbbee4ac50cb89a56331cda678a1c 100644 --- a/modules/common/include/dap_chain_datum.h +++ b/modules/common/include/dap_chain_datum.h @@ -141,9 +141,9 @@ typedef void (*dap_chain_datum_callback_iter_delete_t)(dap_chain_datum_iter_t * * @param a_datum * @return */ -static inline size_t dap_chain_datum_size(dap_chain_datum_t * a_datum) +static inline size_t dap_chain_datum_size(const dap_chain_datum_t *a_datum) { - if(!a_datum) + if (!a_datum) return 0; return sizeof(a_datum->header) + a_datum->header.data_size; } diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 2d457e059cc608c4676fe3bff9393266aa382aeb..2afb73402da10f3fd0b39c3ea16481e0b3f5d67f 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -385,7 +385,7 @@ static void s_round_event_clean_dup(dap_chain_cs_dag_t * a_dag, const char *a_ev l_item->signs_count = l_event->header.signs_count; // l_item->ts_update = l_events_round[l_index].timestamp; l_item->ts_update = l_event_round_item->cfg.ts_update; - l_item->hash_str = l_events_round[l_index].key; + l_item->hash_str = (char *)l_events_round[l_index].key; HASH_ADD_STR(s_event_clean_dup_items, hash_str, l_item); if ( l_event->header.signs_count > l_max_signs_count ) { l_max_signs_count = l_event->header.signs_count; diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index da89542409c95420fcdf35af3941426d0e64f1d4..d425ad77c57a515c1d5251ce0fdbe13b9aa16eec 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -337,7 +337,7 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out) * @param a_timestamp an object time stamp * @return True if successful, false otherwise. */ -static bool global_db_gr_del_add(char *a_key,const char *a_group, time_t a_timestamp) +static bool global_db_gr_del_add(const char *a_key, const char *a_group, time_t a_timestamp) { dap_store_obj_t store_data = {0}; char l_group[DAP_DB_K_MAXGRPLEN]; @@ -390,7 +390,7 @@ int l_res = 0; * @param a_key an object key string, looked like "0x8FAFBD00B..." * @return If successful, a time stamp, otherwise 0. */ -time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key) +time_t global_db_gr_del_get_timestamp(const char *a_group, const char *a_key) { time_t l_timestamp = 0; if(!a_key) @@ -410,7 +410,7 @@ time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key) dap_store_obj_free(l_obj, l_count_out); } unlock(); - DAP_DELETE(store_data.group); + DAP_DELETE((char *)store_data.group); return l_timestamp; } diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c index 45d7dff218ba4d787268f1474e0da7696803ab14..74ddac6d9a0b9bda0e7b9c3c5053a83decb65cd8 100644 --- a/modules/global-db/dap_chain_global_db_driver.c +++ b/modules/global-db/dap_chain_global_db_driver.c @@ -157,9 +157,9 @@ void dap_store_obj_free(dap_store_obj_t *a_store_obj, size_t a_store_count) return; for(size_t i = 0; i < a_store_count; i++) { dap_store_obj_t *l_store_obj_cur = a_store_obj + i; - DAP_DELETE(l_store_obj_cur->group); - DAP_DELETE(l_store_obj_cur->key); - DAP_DELETE(l_store_obj_cur->value); + DAP_DELETE((char *)l_store_obj_cur->group); + DAP_DELETE((char *)l_store_obj_cur->key); + DAP_DELETE((char *)l_store_obj_cur->value); } DAP_DELETE(a_store_obj); } diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index 16252d46783a000909f27b4c946eeae623201f29..6fa70eca99b9b9bf92f6a5ea2aaa0ac64c000d7d 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -78,10 +78,10 @@ static struct __cuttdb_req_list__ { atomic_int s_req_flag; -static pthread_mutex_t s_req_list_lock = PTHREAD_MUTEX_INITIALIZER; /* Coordinate access to the req_list */ +static pthread_mutex_t s_req_list_lock = PTHREAD_MUTEX_INITIALIZER; /* Coordinate access to the req_list */ -static pthread_mutex_t s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t s_req_list_async_cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t s_req_list_async_lock = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t s_req_list_async_cond = PTHREAD_COND_INITIALIZER; static int s_req_async_proc_stop_flag = 0; @@ -136,7 +136,7 @@ static void cdb_serialize_val_to_dap_store_obj(pdap_store_obj_t a_obj, const cha a_obj->value_len = dap_hex_to_uint(val + offset, sizeof(uint64_t)); offset += sizeof(uint64_t); a_obj->value = DAP_NEW_SIZE(uint8_t, a_obj->value_len); - memcpy(a_obj->value, val + offset, a_obj->value_len); + memcpy((byte_t *)a_obj->value, val + offset, a_obj->value_len); offset += a_obj->value_len; a_obj->timestamp = dap_hex_to_uint(val + offset, sizeof(uint64_t)); } @@ -217,7 +217,7 @@ bool dap_cdb_get_count_iter_callback(void *arg, const char *key, int ksize, cons CDB_PAGEWARMUP * @return A pointer to CDB, if success. NULL, if error. */ -pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) { +pcdb_instance dap_cdb_init_group(const char *a_group, int a_flags) { pcdb_instance l_cdb_i = NULL; pthread_mutex_lock(&cdb_mutex); char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2]; @@ -658,7 +658,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { } }*/ cdb_record l_rec; - l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key); + l_rec.key = (char *)a_store_obj->key; //dap_strdup(a_store_obj->key); int offset = 0; char *l_val = DAP_NEW_Z_SIZE(char, sizeof(uint64_t) + sizeof(uint64_t) + a_store_obj->value_len + sizeof(uint64_t)); dap_uint_to_hex(l_val, ++l_cdb_i->id, sizeof(uint64_t)); @@ -667,7 +667,6 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { offset += sizeof(uint64_t); if(a_store_obj->value && a_store_obj->value_len){ memcpy(l_val + offset, a_store_obj->value, a_store_obj->value_len); - DAP_DELETE(a_store_obj->value); } offset += a_store_obj->value_len; dap_uint_to_hex(l_val + offset, a_store_obj->timestamp, sizeof(uint64_t)); @@ -677,13 +676,11 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { log_it(L_ERROR, "Couldn't add record with key [%s] to CDB: \"%s\"", l_rec.key, cdb_errmsg(cdb_errno(l_cdb_i->cdb))); ret = -1; } - DAP_DELETE(l_rec.key); DAP_DELETE(l_rec.val); } else if(a_store_obj->type == DAP_DB$K_OPTYPE_DEL) { if(a_store_obj->key) { if(cdb_del(l_cdb_i->cdb, a_store_obj->key, (int) strlen(a_store_obj->key)) == -3) ret = 1; - DAP_DELETE(a_store_obj->key); } else { cdb_destroy(l_cdb_i->cdb); if (!dap_cdb_init_group(a_store_obj->group, CDB_TRUNC | CDB_PAGEWARMUP)) { diff --git a/modules/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c index 389e2fa09103c1b89bb0eed859c7deae640daf7d..418dd10ccd41728bbecb98b0158d2877c66421ca 100644 --- a/modules/global-db/dap_chain_global_db_driver_pgsql.c +++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c @@ -89,7 +89,7 @@ static void s_pgsql_free_connection(PGconn *a_conn) * @param a_drv_callback a pointer to a structure of callback functions * @return If successful returns 0, else a error code <0. */ -int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback) +int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback, bool a_async_mode) { dap_hash_fast_t l_dir_hash; dap_hash_fast(a_filename_dir, strlen(a_filename_dir), &l_dir_hash); @@ -304,8 +304,6 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj) // execute add request l_res = PQexecParams(l_conn, l_query_str, 2, NULL, l_param_vals, l_param_lens, l_param_formats, 0); - DAP_DELETE(a_store_obj->value); - DAP_DELETE(a_store_obj->key); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { if (s_trans_conn) { //we shouldn't fail within a transaacion dap_db_driver_pgsql_end_transaction(); @@ -329,7 +327,6 @@ int dap_db_driver_pgsql_apply_store_obj(dap_store_obj_t *a_store_obj) // remove all group else l_query_str = dap_strdup_printf("DROP TABLE \"%s\"", a_store_obj->group); - DAP_DELETE(a_store_obj->key); // execute delete request l_res = PQexec(l_conn, l_query_str); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index c24f5fc07267168beb10b12656cf372130517868..1975f4dea5823f8aa15ae309121b8d58cd85ac18 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -536,7 +536,7 @@ static bool dap_db_driver_sqlite_query_free(sqlite3_stmt *l_res) * @param len a length of byte array * @return Returns a hexadecimal string */ -static char* dap_db_driver_get_string_from_blob(uint8_t *blob, int len) +static char* dap_db_driver_get_string_from_blob(const uint8_t *blob, int len) { char *str_out; int ret; @@ -669,7 +669,6 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) if(!a_store_obj->key) return -1; char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len); - DAP_DEL_Z(a_store_obj->value); //add one record l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'', '%lld', x'%s')", l_table_name, a_store_obj->key, a_store_obj->timestamp, l_blob_value); @@ -728,8 +727,6 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) l_ret = -1; } s_sqlite_free_connection(s_db); - if (a_store_obj->key) - DAP_DELETE(a_store_obj->key); dap_db_driver_sqlite_free(l_query); DAP_DELETE(l_table_name); return l_ret; @@ -766,7 +763,7 @@ static void fill_one_item(const char *a_group, dap_store_obj_t *a_obj, SQLITE_RO { a_obj->value_len = (size_t) l_cur_val->len; a_obj->value = DAP_NEW_SIZE(uint8_t, a_obj->value_len); - memcpy(a_obj->value, l_cur_val->val.val_blob, a_obj->value_len); + memcpy((byte_t *)a_obj->value, l_cur_val->val.val_blob, a_obj->value_len); } break; // value } diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c index ae23e302ad91d00e6bc6dc2320b020891c7d277c..d6e93f0569627dd4cc3630d3ad5f73b8fab4628d 100644 --- a/modules/global-db/dap_chain_global_db_hist.c +++ b/modules/global-db/dap_chain_global_db_hist.c @@ -119,7 +119,7 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_ if(l_rec.keys_count >= 1) l_rec.group = a_store_obj->group; if(l_rec.keys_count == 1) - l_rec.keys = a_store_obj->key; + l_rec.keys = (char *)a_store_obj->key; else { // make keys vector char **l_keys = DAP_NEW_Z_SIZE(char*, sizeof(char*) * (((size_t ) a_dap_store_count) + 1)); @@ -128,14 +128,9 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_ // if it is marked, the data has not been saved if(a_store_obj[i].timestamp == (time_t) -1) continue; - l_keys[i] = a_store_obj[i].key; + l_keys[i] = (char *)a_store_obj[i].key; } - l_keys[i] = NULL; l_rec.keys = dap_strjoinv(GLOBAL_DB_HIST_KEY_SEPARATOR, l_keys); - for(i = 0; i < a_dap_store_count; i++) { - DAP_DELETE(l_keys[i]); - DAP_DEL_Z(a_store_obj[i].value); - } DAP_DELETE(l_keys); } @@ -221,8 +216,8 @@ static void *s_list_thread_proc(void *arg) dap_store_obj_t *l_obj_cur = l_objs + i; l_obj_cur->type = l_obj_type; if (l_obj_type == 'd') { - DAP_DELETE(l_obj_cur->group); - l_obj_cur->group = dap_strdup(l_del_group_name_replace); + DAP_DELETE((char *)l_obj_cur->group); + l_obj_cur->group = l_del_group_name_replace; } dap_db_log_list_obj_t *l_list_obj = DAP_NEW_Z(dap_db_log_list_obj_t); uint64_t l_cur_id = l_obj_cur->id; @@ -244,9 +239,6 @@ static void *s_list_thread_proc(void *arg) l_dap_db_log_list->list_read = l_list; pthread_mutex_unlock(&l_dap_db_log_list->list_mutex); } - - if (l_del_group_name_replace) - DAP_DELETE(l_del_group_name_replace); } pthread_mutex_lock(&l_dap_db_log_list->list_mutex); diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index e2e4729888fa2aed4f9f0c7bf574033ff0943f96..a0bb5fbdef6f52de7b2982f7479a065c5138a1bb 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -316,8 +316,8 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz if (offset+str_length> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'group' field"); break;} // Check for buffer boundries obj->group = DAP_NEW_SIZE(char, str_length + 1); - memcpy(obj->group, pkt->data + offset, str_length); - obj->group[str_length] = '\0'; + memcpy((char *)obj->group, pkt->data + offset, str_length); + ((char *)obj->group)[str_length] = '\0'; offset += str_length; if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'id' field"); break;} // Check for buffer boundries @@ -334,8 +334,8 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz if (offset+ str_length > pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'key' field"); break;} // Check for buffer boundries obj->key = DAP_NEW_SIZE(char, str_length + 1); - memcpy(obj->key, pkt->data + offset, str_length); - obj->key[str_length] = '\0'; + memcpy((char *)obj->key, pkt->data + offset, str_length); + ((char *)obj->key)[str_length] = '\0'; offset += str_length; if (offset+sizeof (uint64_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries @@ -344,7 +344,7 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz if (offset+obj->value_len> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value' field"); break;} // Check for buffer boundries obj->value = DAP_NEW_SIZE(uint8_t, obj->value_len); - memcpy(obj->value, pkt->data + offset, obj->value_len); + memcpy((char *)obj->value, pkt->data + offset, obj->value_len); offset += obj->value_len; } assert(pkt->data_size == offset); diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h index d8f7705fd31a4c4d686dce2abbf9933ce04f91a3..4bdbffbd0d337e4efb4d55baa981a50989008e61 100644 --- a/modules/global-db/include/dap_chain_global_db.h +++ b/modules/global-db/include/dap_chain_global_db.h @@ -85,7 +85,7 @@ bool dap_chain_global_db_del(char *a_key); /** * Get timestamp of the deleted entry */ -time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key); +time_t global_db_gr_del_get_timestamp(const char *a_group, const char *a_key); /** * Read the entire database into an array of size bytes diff --git a/modules/global-db/include/dap_chain_global_db_driver.h b/modules/global-db/include/dap_chain_global_db_driver.h index e9c6670fbf24eb05bf5fcbd301f3998028d04e99..ce523785ad25e9b9b94f5ceae34eb340d9cf6e9b 100644 --- a/modules/global-db/include/dap_chain_global_db_driver.h +++ b/modules/global-db/include/dap_chain_global_db_driver.h @@ -40,10 +40,10 @@ typedef struct dap_store_obj { uint64_t id; uint64_t timestamp; uint32_t type; /* Operation type: ADD/DELETE, see DAP_DB$K_OPTYPE_* constants */ - char *group; - char *key; + const char *group; + const char *key; const char *c_key; - uint8_t *value; + const uint8_t *value; uint64_t value_len; }DAP_ALIGN_PACKED dap_store_obj_t, *pdap_store_obj_t; diff --git a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h index 78fb58e3dabc39d33ca5e4ddabd42f8dc513adef..5d59b15b1311b1b989e208c46ecfd781eaab478e 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h +++ b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h @@ -9,7 +9,7 @@ #define DAP_PGSQL_POOL_COUNT 16 #define PGSQL_INVALID_TABLE "42P01" -int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback); +int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback, bool a_async_mode); int dap_db_driver_pgsql_deinit(); int dap_db_driver_pgsql_start_transaction(void); int dap_db_driver_pgsql_end_transaction(void); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index e7080e4b9c1317e9655dbddbe8fcb06b3baba9f6..3caefa9b72fff61d4dc365f59f48f6c41364ad4a 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -77,7 +77,7 @@ int dap_datum_mempool_init(void) * @param a_datum * @return */ -char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_chain_t * a_chain ) +char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain) { if( a_datum == NULL){ log_it(L_ERROR, "NULL datum trying to add in mempool"); @@ -90,7 +90,7 @@ char *dap_chain_mempool_datum_add(const dap_chain_datum_t * a_datum, const dap_c char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash); char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain); - if(dap_chain_global_db_gr_set( l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) { + if (dap_chain_global_db_gr_set(l_key_str, a_datum, dap_chain_datum_size(a_datum), l_gdb_group)) { log_it(L_NOTICE, "Datum with data's hash %s was placed in mempool", l_key_str); } else { log_it(L_WARNING, "Can't place data's hash %s was placed in mempool", l_key_str); diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index 56dc212e3eb3957c3e1065f27a5bade5cac5f6e4..4ecf470e0bddcf7f2f05fea13d0d7a23e57298f8 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -43,7 +43,7 @@ void dap_datum_mempool_free(dap_datum_mempool_t *datum); void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url); -char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, const dap_chain_t *a_chain); +char *dap_chain_mempool_datum_add(const dap_chain_datum_t *a_datum, dap_chain_t *a_chain); dap_hash_fast_t* dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from, const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_to, const dap_chain_addr_t* a_addr_fee, diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index edb8e96262f4b8573b28eb96314ef8dae0599cf0..bab62c72b1c4df00440011611066e3501aba71df 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -417,16 +417,19 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c l_group = (char *)a_group; } dap_store_obj_t *l_obj = (dap_store_obj_t *)dap_chain_global_db_obj_get(a_key, l_group); - if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) { - DAP_DELETE(l_group); - } if (!l_obj) { + if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) { + DAP_DELETE(l_group); + } log_it(L_DEBUG, "Notified GDB event does not exist"); return; } l_obj->type = a_op_code; - DAP_DELETE(l_obj->group); - l_obj->group = dap_strdup(a_group); + DAP_DELETE((char *)l_obj->group); + l_obj->group = dap_strdup(l_group); + if ( a_op_code == DAP_DB$K_OPTYPE_DEL ) { + DAP_DELETE(l_group); + } dap_store_obj_pkt_t *l_data_out = dap_store_packet_single(l_obj); dap_store_obj_free(l_obj, 1); dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); @@ -1805,7 +1808,6 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) return -11; } ret = dap_chain_global_db_gr_del(l_hash_string, l_gdb_group_str); - DAP_DELETE(l_hash_string); DAP_DELETE(l_gdb_group_str); if (!ret) { dap_chain_node_cli_set_reply_text(a_str_reply, "Cant't find certificate public key hash in database"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 109be05169e0e4d2deb307b111909b423126a7a6..05564dc4e22265c9b24d1c075702245cb8991ce7 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -4435,7 +4435,7 @@ int cmd_gdb_import(int argc, char ** argv, char ** a_str_reply) dap_enc_base64_decode(l_value_str, strlen(l_value_str), l_val, DAP_ENC_DATA_TYPE_B64); l_group_store[j].value = (uint8_t*)l_val; } - if (dap_chain_global_db_driver_appy(l_group_store, l_records_count)) { + if (dap_chain_global_db_driver_apply(l_group_store, l_records_count)) { log_it(L_CRITICAL, "An error occured on importing group %s...", l_group_name); } //dap_store_obj_free(l_group_store, l_records_count); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index a2416a54bdc94de1536463d9717ea4c852b45fb5..ff03823de2f918c4e952f55fbb476b0ae4783718 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -92,16 +92,23 @@ size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order) if (!a_order) return 0; size_t l_sign_size = 0; - size_t l_header_size = sizeof(dap_chain_net_srv_order_old_t); - if (a_order->version > 1) { + if (a_order->version == 3) { dap_sign_t *l_sign = (dap_sign_t *)&a_order->ext_n_sign[a_order->ext_size]; if (l_sign->header.type.type == SIG_TYPE_NULL) l_sign_size = sizeof(dap_sign_type_t); else l_sign_size = dap_sign_get_size(l_sign); - l_header_size = sizeof(dap_chain_net_srv_order_t); + return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size; } - return l_header_size + a_order->ext_size + l_sign_size; + dap_chain_net_srv_order_old_t *l_order = (dap_chain_net_srv_order_old_t *)a_order; + if(l_order->version == 2) { + dap_sign_t *l_sign = (dap_sign_t *)&l_order->ext[l_order->ext_size]; + if (l_sign->header.type.type == SIG_TYPE_NULL) + l_sign_size = sizeof(dap_sign_type_t); + else + l_sign_size = dap_sign_get_size(l_sign); + } + return sizeof(dap_chain_net_srv_order_old_t) + l_order->ext_size + l_sign_size; } /** @@ -277,7 +284,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( ) { UNUSED(a_expires); - if (!a_net) + if (!a_net && !a_key) // Order must have network & sign return NULL; dap_chain_net_srv_order_t *l_order; if (a_ext_size) { @@ -290,7 +297,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( dap_chain_net_srv_order_set_continent_region(&l_order, a_continent_num, a_region); } - l_order->version = 2; + l_order->version = 3; l_order->srv_uid = a_srv_uid; l_order->direction = a_direction; l_order->ts_created = (dap_chain_time_t) time(NULL); @@ -304,21 +311,13 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( if ( a_price_ticker) strncpy(l_order->price_ticker, a_price_ticker,sizeof(l_order->price_ticker)-1); - if (a_key) { - dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0); - if (!l_sign) { - return NULL; - } - size_t l_sign_size = dap_sign_get_size(l_sign); // sign data - l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + l_sign_size); - memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size); - DAP_DELETE(l_sign); - } else { - dap_sign_type_t l_type = { .type = SIG_TYPE_NULL }; - l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + sizeof(dap_sign_type_t)); - memcpy(&l_order->ext_n_sign[l_order->ext_size], &l_type, sizeof(dap_sign_type_t)); + dap_sign_t *l_sign = dap_sign_create(a_key, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size, 0); + if (!l_sign) { + return NULL; } - + size_t l_sign_size = dap_sign_get_size(l_sign); // sign data + l_order = DAP_REALLOC(l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size + l_sign_size); + memcpy(&l_order->ext_n_sign[l_order->ext_size], l_sign, l_sign_size); return l_order; } @@ -345,6 +344,41 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord return l_order_hash_str; } +dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order) +{ + if (((dap_chain_net_srv_order_t *)a_order)->version == 3) + return DAP_DUP_SIZE(a_order, dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)a_order)); + dap_chain_net_srv_order_old_t *l_old = (dap_chain_net_srv_order_old_t *)a_order; + size_t l_ret_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_old) + + sizeof(dap_chain_net_srv_order_t) - sizeof(dap_chain_net_srv_order_old_t); + if (l_old->version == 1) + l_ret_size += sizeof(dap_sign_type_t); + dap_chain_net_srv_order_t *l_ret = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_ret_size); + l_ret->version = 3; +#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + l_ret->srv_uid.uint64 = l_old->srv_uid.uint64; +#else + l_ret->srv_uid.uint128 = dap_chain_uint128_from(l_old->srv_uid.uint64); +#endif + l_ret->direction = l_old->direction; + l_ret->node_addr.uint64 = l_old->node_addr.uint64; + memcpy(&l_ret->tx_cond_hash, &l_old->tx_cond_hash, sizeof(dap_chain_hash_fast_t)); + l_ret->price_unit.uint32 = l_old->price_unit.uint32; + l_ret->ts_created = l_old->ts_created; + l_ret->ts_expires = l_old->ts_expires; + l_ret->price = dap_chain_uint256_from(l_old->price); + strncpy(l_ret->price_ticker, l_old->price_ticker, DAP_CHAIN_TICKER_SIZE_MAX); + l_ret->ext_size = l_old->ext_size; + memcpy(&l_ret->ext_n_sign, &l_old->ext, l_old->ext_size); + dap_sign_t *l_sign = (dap_sign_t *)&l_old->ext[l_old->ext_size]; + size_t l_sign_size = l_old->version == 1 ? 0 : dap_sign_get_size(l_sign); + if (l_sign_size) + memcpy(&l_ret->ext_n_sign[l_ret->ext_size], l_sign, l_sign_size); + else + ((dap_sign_type_t *)&l_ret->ext_n_sign[l_ret->ext_size])->type = SIG_TYPE_NULL; + return l_ret; +} + /** * @brief dap_chain_net_srv_order_find_by_hash_str @@ -389,83 +423,60 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ const uint256_t a_price_min, const uint256_t a_price_max, dap_chain_net_srv_order_t ** a_output_orders, size_t * a_output_orders_count) { - if ( a_net && a_output_orders && a_output_orders_count ){ - char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group( a_net); - size_t l_orders_count = 0; - dap_global_db_obj_t * l_orders = dap_chain_global_db_gr_load(l_gdb_group_str,&l_orders_count); - log_it( L_DEBUG ,"Loaded %zd orders", l_orders_count); - bool l_order_pass_first=true; - size_t l_order_passed_index; - size_t l_orders_size; -lb_order_pass: - l_order_passed_index = 0; - l_orders_size = 0; - for (size_t i=0; i< l_orders_count; i++){ - dap_chain_net_srv_order_t * l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; - if (l_order_pass_first) { - if (l_order->version > 2 || l_order->direction > SERV_DIR_SELL || - dap_chain_net_srv_order_get_size(l_order) != l_orders[i].value_len) { - dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str); - continue; // order is corrupted - } - dap_chain_hash_fast_t l_hash, l_hash_gdb; - dap_hash_fast(l_order, dap_chain_net_srv_order_get_size(l_order), &l_hash); - dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb); - if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) { - dap_chain_global_db_gr_del( l_orders[i].key, l_gdb_group_str); - continue; // order is corrupted - } - } - // Check direction - if (a_direction != SERV_DIR_UNDEFINED ) - if ( l_order->direction != a_direction ) - continue; - - // Check srv uid - if ( a_srv_uid.uint64 ) - if ( l_order->srv_uid.uint64 != a_srv_uid.uint64 ) - continue; - // check price unit - if ( a_price_unit.uint32 ) - if ( a_price_unit.uint32 != l_order->price_unit.uint32 ) - continue; - // Check price minimum - if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1) - continue; - // Check price maximum - if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1) - continue; - // Check ticker - if ( a_price_ticker ) - if ( strcmp( l_order->price_ticker, a_price_ticker) != 0 ) - continue; - - if( !l_order_pass_first ){ - size_t l_order_size = dap_chain_net_srv_order_get_size(l_order); - memcpy((char*)*a_output_orders + l_orders_size, l_order, l_order_size); - l_orders_size += l_order_size; - } - else - // calc size of all orders - l_orders_size += dap_chain_net_srv_order_get_size(l_order); - l_order_passed_index++; - + if (!a_net || !a_output_orders || !a_output_orders_count) + return -1; + char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net); + size_t l_orders_count = 0; + dap_global_db_obj_t *l_orders = dap_chain_global_db_gr_load(l_gdb_group_str, &l_orders_count); + log_it( L_DEBUG, "Loaded %zu orders", l_orders_count); + dap_chain_net_srv_order_t *l_order = NULL; + *a_output_orders = NULL; + *a_output_orders_count = 0; + size_t l_orders_size = 0; + for (size_t i = 0; i < l_orders_count; i++) { + DAP_DEL_Z(l_order); + l_order = dap_chain_net_srv_order_read(l_orders[i].value); + size_t l_order_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_orders[i].value); + if (l_order->version > 3 || l_order->direction > SERV_DIR_SELL || + l_order_size != l_orders[i].value_len) { + dap_chain_global_db_gr_del(l_orders[i].key, l_gdb_group_str); + continue; // order is corrupted } - // Dirty goto usage ho ho ho - if (l_order_pass_first) { - l_order_pass_first = false; - *a_output_orders_count = l_order_passed_index; - if(l_orders_size) - *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size); - goto lb_order_pass; + dap_chain_hash_fast_t l_hash, l_hash_gdb; + dap_hash_fast(l_orders[i].value, l_order_size, &l_hash); + dap_chain_hash_fast_from_str(l_orders[i].key, &l_hash_gdb); + if (memcmp(&l_hash, &l_hash_gdb, sizeof(dap_chain_hash_fast_t))) { + dap_chain_global_db_gr_del(l_orders[i].key, l_gdb_group_str); + continue; // order is corrupted } - // If we here - its the second pass through - - dap_chain_global_db_objs_delete(l_orders, l_orders_count); - DAP_DELETE( l_gdb_group_str); - return 0; + // Check direction + if (a_direction != SERV_DIR_UNDEFINED && l_order->direction != a_direction) + continue; + // Check srv uid + if (a_srv_uid.uint64 && l_order->srv_uid.uint64 != a_srv_uid.uint64) + continue; + // check price unit + if (a_price_unit.uint32 && a_price_unit.uint32 != l_order->price_unit.uint32) + continue; + // Check price minimum + if (!IS_ZERO_256(a_price_min) && compare256(l_order->price, a_price_min) == -1) + continue; + // Check price maximum + if (!IS_ZERO_256(a_price_max) && compare256(l_order->price, a_price_max) == 1) + continue; + // Check ticker + if (a_price_ticker && strcmp( l_order->price_ticker, a_price_ticker)) + continue; + size_t l_order_mem_size = dap_chain_net_srv_order_get_size(l_order); + *a_output_orders = DAP_REALLOC(*a_output_orders, l_orders_size + l_order_mem_size); + memcpy((byte_t *)*a_output_orders + l_orders_size, l_order, l_order_mem_size); + l_orders_size += l_order_mem_size; + a_output_orders_count++; } - return -1; + DAP_DEL_Z(l_order); + dap_chain_global_db_objs_delete(l_orders, l_orders_count); + DAP_DELETE(l_gdb_group_str); + return 0; } /** diff --git a/modules/net/srv/include/dap_chain_net_srv_order.h b/modules/net/srv/include/dap_chain_net_srv_order.h index 54220f22e028a0257ed60ab36c885b0b30481973..93a92d529263c41a5db437433a80c1bf35b81ae7 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -52,8 +52,11 @@ typedef struct dap_chain_net_srv_order { uint16_t version; dap_chain_net_srv_uid_t srv_uid; // Service UID - byte_t padding; // some padding +#if DAP_CHAIN_NET_SRV_UID_SIZE == 8 + byte_t padding[8]; +#endif dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE + byte_t padding_dir[3]; dap_chain_node_addr_t node_addr; // Node address that servs the order (if present) dap_chain_hash_fast_t tx_cond_hash; // Hash index of conditioned transaction attached with order dap_chain_net_srv_price_unit_uid_t price_unit; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT @@ -61,8 +64,8 @@ typedef struct dap_chain_net_srv_order dap_chain_time_t ts_expires; uint256_t price; // service price in datoshi, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT for one unit. char price_ticker[DAP_CHAIN_TICKER_SIZE_MAX]; // Token ticker to pay for service - byte_t free_space[128]; // for future changes uint32_t ext_size; + byte_t free_space[128]; // for future changes uint8_t ext_n_sign[]; } DAP_ALIGN_PACKED dap_chain_net_srv_order_t;