diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index d61688c07f7f0a8dd63d69287245b002e20dc95a..e6ffa337db1a1c8ebf6d95994db112b731534937 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -549,13 +549,13 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf size_t l_orders_count = 0; dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); DAP_DELETE(l_gdb_group_str); - dap_chain_net_srv_order_t *l_order_service = NULL; + const dap_chain_net_srv_order_t *l_order_service = NULL; for (size_t i = 0; i < l_orders_count; i++) { - if (l_orders[i].value_len < sizeof(dap_chain_net_srv_order_t)) { - log_it(L_ERROR, "Too small order %s with size %zu", l_orders[i].key, l_orders[i].value_len); + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); continue; } - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)l_orders[i].value; if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID) continue; dap_sign_t *l_order_sign = (dap_sign_t*)(l_order->ext_n_sign + l_order->ext_size); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 3b2ce8bc1086a03751a79dd8b32764601053ef35..f650084103e9e74b5d79a37a5328fc345d6ce2ed 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -3417,8 +3417,8 @@ const char *dap_ledger_get_description_by_ticker(dap_ledger_t *a_ledger, const c * * return transaction, or NULL if transaction not found in the cache */ -static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, - dap_chain_hash_fast_t *a_tx_hash, dap_ledger_tx_item_t **a_item_out, bool a_unspent_only) +static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash, + dap_ledger_tx_item_t **a_item_out, bool a_unspent_only) { if(!a_tx_hash) return NULL; @@ -3447,12 +3447,12 @@ static dap_chain_datum_tx_t* s_find_datum_tx_by_hash(dap_ledger_t *a_ledger, * @return */ -dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash) +dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash) { return s_find_datum_tx_by_hash(a_ledger, a_tx_hash, NULL, false); } -dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash) +dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash) { return s_find_datum_tx_by_hash(a_ledger, a_tx_hash, NULL, true); } diff --git a/modules/net/include/dap_chain_ledger.h b/modules/net/include/dap_chain_ledger.h index 4766bae94587acbf22012d81a82eb183e08b5121..e6d04d4ad2755d757b107ed9cd41489933ebba2a 100644 --- a/modules/net/include/dap_chain_ledger.h +++ b/modules/net/include/dap_chain_ledger.h @@ -365,8 +365,8 @@ uint256_t dap_ledger_calc_balance_full(dap_ledger_t *a_ledger, const dap_chain_a * * return transaction, or NULL if transaction not found in the cache */ -dap_chain_datum_tx_t* dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); -dap_chain_datum_tx_t* dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_tx_hash); +dap_chain_datum_tx_t *dap_ledger_tx_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash); +dap_chain_datum_tx_t *dap_ledger_tx_unspent_find_by_hash(dap_ledger_t *a_ledger, const dap_chain_hash_fast_t *a_tx_hash); dap_hash_fast_t *dap_ledger_get_final_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_tx_item_type_t a_cond_type, dap_chain_hash_fast_t *a_tx_hash); dap_hash_fast_t *dap_ledger_get_first_chain_tx_hash(dap_ledger_t *a_ledger, dap_chain_datum_tx_t * a_tx, dap_chain_tx_out_cond_t *a_cond_out); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 62941a875fc371ecaa9e6b151c5c1caaed234cef..b3b6fbe93bb14bf1bbf4e092a7cd5f7fe7b25172 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -206,13 +206,13 @@ static int s_cli_net_srv( int argc, char **argv, void **a_str_reply) int l_ret = dap_chain_node_cli_cmd_values_parse_net_chain( &arg_index, argc, argv, a_str_reply, NULL, &l_net, CHAIN_TYPE_INVALID); if ( l_net ) { - //char * l_orders_group = dap_chain_net_srv_order_get_gdb_group( l_net ); - dap_string_t *l_string_ret = dap_string_new(""); + const char *l_order_str = NULL; - int l_order_arg_pos = dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "order", &l_order_str); + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "order", &l_order_str); + const char *l_get_limits_str = NULL; - int l_get_limits_arg_pos = dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "get_limits", &l_get_limits_str); + dap_cli_server_cmd_find_option_val(argv, arg_index, argc, "get_limits", &l_get_limits_str); // Order direction const char *l_direction_str = NULL; diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 5a41dfa02cad40a2465fac6ca2ef0cc47beb220a..6ffa4c02d40d633f82b6d98655631d0c4780bfe0 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -81,28 +81,30 @@ void dap_chain_net_srv_order_deinit() } -size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order) +size_t dap_chain_net_srv_order_get_size(const dap_chain_net_srv_order_t *a_order) { - if (!a_order) + if (!a_order || a_order->version != 3) return 0; - size_t l_sign_size = 0; - 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); - return sizeof(dap_chain_net_srv_order_t) + 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; + dap_sign_t *l_sign = (dap_sign_t *)(a_order->ext_n_sign + a_order->ext_size); + size_t l_sign_size = l_sign->header.type.type == SIG_TYPE_NULL ? sizeof(dap_sign_type_t) : dap_sign_get_size(l_sign); + return sizeof(dap_chain_net_srv_order_t) + a_order->ext_size + l_sign_size; +} + +const dap_chain_net_srv_order_t *dap_chain_net_srv_order_check(const char *a_order_hash_str, const byte_t *a_order, size_t a_order_size) +{ + const dap_chain_net_srv_order_t *l_order = (const dap_chain_net_srv_order_t *)a_order; + dap_return_val_if_fail(l_order && a_order_size >= sizeof(dap_chain_net_srv_order_t) + sizeof(dap_sign_t) && + l_order->version == 3 && l_order->direction <= SERV_DIR_SELL, NULL); + size_t l_order_size = dap_chain_net_srv_order_get_size(l_order); + if (l_order_size != a_order_size) + return NULL; + dap_hash_fast_t l_hash, l_hash_real; + dap_hash_fast(a_order, a_order_size, &l_hash_real); + if (dap_chain_hash_fast_from_str(a_order_hash_str, &l_hash)) + return NULL; + if (memcmp(&l_hash, &l_hash_real, sizeof(dap_hash_fast_t))) + return NULL; + return l_order; } /** @@ -146,7 +148,7 @@ bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_ * @param a_continent_num [out] * @param a_region [out] */ -bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region) +bool dap_chain_net_srv_order_get_continent_region(const dap_chain_net_srv_order_t *a_order_static, uint8_t *a_continent_num, char **a_region) { if(!a_order_static || !a_order_static->ext_size || a_order_static->ext_n_sign[0]!=0x52) return false; @@ -363,50 +365,6 @@ char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_ord return NULL; } -dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t a_order_size) -{ - if (NULL == a_order) { - log_it(L_ERROR, "Argumets are NULL for dap_chain_net_srv_order_read"); - return NULL; - } - dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_order; - size_t l_order_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)a_order); - if (l_order->version > 3 || l_order->direction > SERV_DIR_SELL || l_order_size != a_order_size) - return NULL; - if (l_order->version == 3) - return DAP_DUP_SIZE(a_order, l_order_size); - 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; - l_ret->tx_cond_hash = l_old->tx_cond_hash; - 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 * @param a_net @@ -415,7 +373,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t */ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_net_t *a_net, const char *a_hash_str) { - dap_chain_net_srv_order_t *l_order = NULL; + const dap_chain_net_srv_order_t *l_order = NULL; for (int i = 0; a_net && a_hash_str && i < 2; i++) { char *l_gdb_group_str = i ? dap_chain_net_srv_order_get_gdb_group(a_net) : dap_chain_net_srv_order_get_common_group(a_net); @@ -425,21 +383,13 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne if (!l_gdb_order) continue; // check order size - size_t l_expected_size = dap_chain_net_srv_order_get_size((dap_chain_net_srv_order_t *)l_gdb_order); - if (l_order_size != l_expected_size) { - log_it(L_ERROR, "Found wrong size order %zu, expected %zu", l_order_size, l_expected_size); - DAP_DELETE(l_gdb_order); - return NULL; - } - l_order = dap_chain_net_srv_order_read(l_gdb_order, l_order_size); + l_order = dap_chain_net_srv_order_check(a_hash_str, l_gdb_order, l_order_size); if (!l_order || (l_order->ts_expires && l_order->ts_expires < dap_time_now())){ - DAP_DEL_Z(l_order); DAP_DELETE(l_gdb_order); - continue; + break; } - DAP_DELETE(l_gdb_order); } - return l_order; + return (dap_chain_net_srv_order_t *)l_order; } /** @@ -454,15 +404,15 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_find_by_hash_str(dap_chain_ne * @param a_output_orders_count * @return */ -int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_net_srv_order_direction_t a_direction, +int dap_chain_net_srv_order_find_all_by(dap_chain_net_t *a_net, const dap_chain_net_srv_order_direction_t a_direction, const dap_chain_net_srv_uid_t a_srv_uid, - const dap_chain_net_srv_price_unit_uid_t a_price_unit,const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], + const dap_chain_net_srv_price_unit_uid_t a_price_unit, const char a_price_ticker[DAP_CHAIN_TICKER_SIZE_MAX], const uint256_t a_price_min, const uint256_t a_price_max, - dap_list_t** a_output_orders, size_t * a_output_orders_count) + dap_list_t **a_output_orders, size_t *a_output_orders_count) { if (!a_net || !a_output_orders || !a_output_orders_count) return -1; - size_t l_orders_size = 0, l_output_orders_count = 0; + size_t l_output_orders_count = 0; *a_output_orders = NULL; dap_list_t* l_out_list = NULL; @@ -472,65 +422,54 @@ int dap_chain_net_srv_order_find_all_by(dap_chain_net_t * a_net,const dap_chain_ : dap_chain_net_srv_order_get_common_group(a_net); size_t l_orders_count = 0; dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(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; + log_it(L_DEBUG, "Loaded %zu orders", l_orders_count); + const dap_chain_net_srv_order_t *l_order = NULL; for (size_t i = 0; i < l_orders_count; i++) { - l_order = dap_chain_net_srv_order_read(l_orders[i].value, l_orders[i].value_len); + l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); if (!l_order) { dap_global_db_del_sync(l_gdb_group_str, l_orders[i].key); continue; // order is corrupted } - if (l_order->ts_expires && l_order->ts_expires < dap_time_now()){ - DAP_DEL_Z(l_order); + + if (l_order->ts_expires && l_order->ts_expires < dap_time_now()) continue; - } - dap_chain_hash_fast_t l_hash, l_hash_gdb; - dap_hash_fast(l_orders[i].value, l_orders[i].value_len, &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_global_db_del_sync(l_gdb_group_str, l_orders[i].key); - DAP_DEL_Z(l_order); - continue; // order is corrupted - } // Check direction - if (a_direction != SERV_DIR_UNDEFINED && l_order->direction != a_direction){ - DAP_DEL_Z(l_order); + 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){ - DAP_DEL_Z(l_order); + 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){ - DAP_DEL_Z(l_order); + 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){ - DAP_DEL_Z(l_order); + 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){ - DAP_DEL_Z(l_order); + 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)){ - DAP_DEL_Z(l_order); + 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); dap_chain_net_srv_order_t *l_output_order = DAP_DUP_SIZE(l_order, l_order_mem_size); - DAP_DEL_Z(l_order); + if (!l_output_order) { + log_it(L_CRITICAL, "%s", g_error_memory_alloc); + dap_global_db_objs_delete(l_orders, l_orders_count); + return -1; + } l_out_list = dap_list_append(l_out_list, l_output_order); l_output_orders_count++; } - dap_global_db_objs_delete(l_orders, l_orders_count); DAP_DELETE(l_gdb_group_str); + dap_global_db_objs_delete(l_orders, l_orders_count); } *a_output_orders_count = l_output_orders_count; *a_output_orders = l_out_list; @@ -563,7 +502,8 @@ int dap_chain_net_srv_order_delete_by_hash_str_sync(dap_chain_net_t *a_net, cons * @param a_orders * @param a_str_out */ -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,dap_string_t * a_str_out, const char *a_hash_out_type, const char *a_native_ticker) +void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, + const char *a_hash_out_type, const char *a_native_ticker) { if (a_order && a_str_out ){ dap_chain_hash_fast_t l_hash; diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index b6510231d08b5354d215fb147358d994e9f11409..1aa967f4ebc51c74ad0e3dfa26028241aa1970d7 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -36,10 +36,10 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #define DAP_CHAIN_NET_SRV_GRACE_PERIOD_DEFAULT 60 //Service direction -enum dap_chain_net_srv_order_direction{ +enum dap_chain_net_srv_order_direction { + SERV_DIR_UNDEFINED = 0, SERV_DIR_BUY = 1, - SERV_DIR_SELL = 2, - SERV_DIR_UNDEFINED = 0 + SERV_DIR_SELL = 2 }; typedef byte_t dap_chain_net_srv_order_direction_t; 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 68c0194f11c1332cbd54d49418856f8147f02d72..ccdce7024a7f1b7b06e8ded12b64bd64dc158403 100644 --- a/modules/net/srv/include/dap_chain_net_srv_order.h +++ b/modules/net/srv/include/dap_chain_net_srv_order.h @@ -28,24 +28,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_string.h" #include "dap_chain_common.h" #include "dap_chain_net_srv.h" -typedef struct dap_chain_net_srv_order_old -{ - uint16_t version; - dap_chain_net_srv_uid_t srv_uid; // Service UID - byte_t padding; // some padding - dap_chain_net_srv_order_direction_t direction; // Order direction - SELL or PURCHASE - 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 - dap_time_t ts_created; - dap_time_t ts_expires; - uint64_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 - //uint8_t continent; - //char region[32]; - uint32_t ext_size; - uint8_t ext[]; -} DAP_ALIGN_PACKED dap_chain_net_srv_order_old_t; typedef struct dap_chain_net_srv_order { @@ -73,11 +55,11 @@ typedef struct dap_chain_net_srv_order int dap_chain_net_srv_order_init(); void dap_chain_net_srv_order_deinit(void); -size_t dap_chain_net_srv_order_get_size(dap_chain_net_srv_order_t *a_order); -dap_chain_net_srv_order_t *dap_chain_net_srv_order_read(byte_t *a_order, size_t a_order_size); +size_t dap_chain_net_srv_order_get_size(const dap_chain_net_srv_order_t *a_order); +const dap_chain_net_srv_order_t *dap_chain_net_srv_order_check(const char *a_order_hash_str, const byte_t *a_order, size_t a_order_size); bool dap_chain_net_srv_order_set_continent_region(dap_chain_net_srv_order_t **a_order, uint8_t a_continent_num, const char *a_region); -bool dap_chain_net_srv_order_get_continent_region(dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); +bool dap_chain_net_srv_order_get_continent_region(const dap_chain_net_srv_order_t *a_order, uint8_t *a_continent_num, char **a_region); const char* dap_chain_net_srv_order_get_country_code(dap_chain_net_srv_order_t *a_order); size_t dap_chain_net_srv_order_continents_count(void); @@ -158,7 +140,7 @@ dap_chain_net_srv_order_t *dap_chain_net_srv_order_compose( char *dap_chain_net_srv_order_save(dap_chain_net_t *a_net, dap_chain_net_srv_order_t *a_order, bool a_common); -void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, +void dap_chain_net_srv_order_dump_to_string(const dap_chain_net_srv_order_t *a_order, dap_string_t *a_str_out, const char *a_hash_out_type, const char *a_native_ticker); void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 75fcfa1e55ce9541fdb8beeafd3fddbdb8236bac..58ff27e104c48bd4d23c917f8d3edb0e1fe351ab 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -207,7 +207,7 @@ void s_order_notficator(dap_store_obj_t *a_obj, void *a_arg) const char * a_obj_key_str = a_obj->key ? a_obj->key : "unknow"; dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; - dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_read((byte_t *)a_obj->value, a_obj->value_len); // Old format comliance + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(a_obj->key, a_obj->value, a_obj->value_len); // Old format comliance if (!l_order) { log_it(L_NOTICE, "Order %s is corrupted", a_obj_key_str); if (dap_global_db_driver_delete(a_obj, 1) != 0) diff --git a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c index 54171549171db906b4714732382f930e03a60918..05cf9f8cb3dbb24012bcb58e84cfe2dd175b4a70 100644 --- a/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c +++ b/modules/service/stake/dap_chain_net_srv_stake_pos_delegate.c @@ -1609,7 +1609,11 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, voi size_t l_orders_count = 0; dap_global_db_obj_t * l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); 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; + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); + continue; + } if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID && l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ORDERS) continue; @@ -2810,17 +2814,20 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, uint256_t *a_max_fee, uint256_t *a_average_fee, uint256_t *a_min_fee, uint256_t *a_median_fee) { - if (!a_net) - return false; - char * l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(a_net); + dap_return_val_if_fail(a_net, false); + 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_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); - DAP_DELETE( l_gdb_group_str); + dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_gdb_group_str, &l_orders_count); + DAP_DELETE(l_gdb_group_str); uint256_t l_min = uint256_0, l_max = uint256_0, l_average = uint256_0, l_median = uint256_0; uint64_t l_order_fee_count = 0; uint256_t l_all_fees[l_orders_count * sizeof(uint256_t)]; 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; + const dap_chain_net_srv_order_t *l_order = dap_chain_net_srv_order_check(l_orders[i].key, l_orders[i].value, l_orders[i].value_len); + if (!l_order) { + log_it(L_WARNING, "Unreadable order %s", l_orders[i].key); + continue; + } if (l_order->srv_uid.uint64 != DAP_CHAIN_NET_SRV_STAKE_POS_DELEGATE_ID) continue; if (l_order_fee_count == 0) { @@ -2843,15 +2850,16 @@ bool dap_chain_net_srv_stake_get_fee_validators(dap_chain_net_t *a_net, l_max = l_order->price; } } + dap_global_db_objs_delete(l_orders, l_orders_count); uint256_t t = uint256_0; - if (!IS_ZERO_256(l_average)) DIV_256(l_average, dap_chain_uint256_from(l_order_fee_count), &t); + if (!IS_ZERO_256(l_average)) + DIV_256(l_average, dap_chain_uint256_from(l_order_fee_count), &t); l_average = t; if (l_order_fee_count) { l_median = l_all_fees[(size_t)(l_order_fee_count * 2 / 3)]; } - dap_global_db_objs_delete(l_orders, l_orders_count); if (a_min_fee) *a_min_fee = l_min; if (a_average_fee)