From 410d0a8a4186d7d027cd2dbf9c69b9ba3784c86c Mon Sep 17 00:00:00 2001 From: "alexey.stratulat" <alexey.stratulat@demlabs.net> Date: Tue, 11 Jul 2023 06:11:25 +0000 Subject: [PATCH] Features 8985 --- modules/net/srv/dap_chain_net_srv_order.c | 102 ++++++++++++------ .../dap_chain_net_srv_stake_pos_delegate.c | 9 ++ .../dap_chain_net_srv_stake_pos_delegate.h | 2 + 3 files changed, 81 insertions(+), 32 deletions(-) diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 43d6a4b0b6..f79f08d30e 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -66,6 +66,45 @@ struct dap_order_notify { static dap_list_t *s_order_notify_callbacks = NULL; static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); +static dap_timerfd_t *s_timer_order_check_decree_sign = NULL; +static void s_srv_order_check_decree_sign_timer(){ + uint32_t l_unverified_orders_lifetime = dap_config_get_item_uint32_default(g_config, "srv", "unverified_orders_lifetime", 21600); + dap_time_t l_time_cut_off = dap_time_now(); + l_time_cut_off -= l_unverified_orders_lifetime; // 6 Hours; + size_t l_net_count = 0; + dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); + for (uint16_t i = 0; i < l_net_count; i++) { + if (dap_chain_net_get_role(l_net_list[i]).enums == NODE_ROLE_MASTER) { + char *l_order_group = dap_chain_net_srv_order_get_gdb_group(l_net_list[i]); + size_t l_order_count = 0; + dap_global_db_obj_t *l_orders = dap_global_db_get_all_sync(l_order_group, &l_order_count); + for (size_t j = 0; j < l_order_count; j++) { + dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *) (l_orders[j].value); + if (!l_order) + continue; + if (l_order->ts_created < l_time_cut_off) { + dap_sign_t *l_sign = (dap_sign_t *) (l_order->ext_n_sign + l_order->ext_size); + dap_hash_fast_t l_sign_pkey_hash = {0}; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey_hash); + dap_chain_addr_t l_signed_addr = {0}; + dap_chain_addr_fill(&l_signed_addr, l_sign->header.type, &l_sign_pkey_hash, l_net_list[i]->pub.id); + if (!dap_chain_net_srv_stake_key_delegated(&l_signed_addr)) { + char *l_pkey_hash_str = dap_hash_fast_to_str_new(&l_sign_pkey_hash); + log_it(L_NOTICE, "Order %s signed by the non-delegated public key %s. Order deleted", + l_orders[j].key, + l_pkey_hash_str); + DAP_DELETE(l_pkey_hash_str); + dap_global_db_del(l_order_group, l_orders[j].key, NULL, NULL); + } + } + } + dap_global_db_objs_delete(l_orders, l_order_count); + DAP_DELETE(l_order_group); + } + } + DAP_DELETE(l_net_list); +} + /** * @brief dap_chain_net_srv_order_init * @return @@ -78,6 +117,15 @@ int dap_chain_net_srv_order_init(void) dap_chain_net_add_gdb_notify_callback(l_net_list[i], s_srv_order_callback_notify, l_net_list[i]); } //geoip_info_t *l_ipinfo = chain_net_geoip_get_ip_info("8.8.8.8"); + if (!dap_config_get_item_bool_default(g_config, "srv", "allow_unverified_orders", false)) { + uint32_t l_unverified_orders_lifetime = dap_config_get_item_uint32_default(g_config, "srv", "unverified_orders_lifetime", 21600); // 6 Hours + s_timer_order_check_decree_sign = dap_interval_timer_create(l_unverified_orders_lifetime * 1000, + (dap_timer_callback_t)s_srv_order_check_decree_sign_timer, + NULL); + } else { + log_it(L_DEBUG, "A mode is enabled that disables verification that the signature was put by " + "the node by the validator."); + } DAP_DELETE(l_net_list); return 0; } @@ -564,6 +612,12 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d } else dap_string_append_printf(a_str_out, " ext: 0x0\n"); + dap_sign_t *l_sign = (dap_sign_t*)((byte_t*)a_order->ext_n_sign + a_order->ext_size); + dap_hash_fast_t l_sign_pkey = {0}; + dap_sign_get_pkey_hash(l_sign, &l_sign_pkey); + char *l_sign_pkey_hash_str = dap_hash_fast_to_str_new(&l_sign_pkey); + dap_string_append_printf(a_str_out, " pkey: %s\n", l_sign_pkey_hash_str); + DAP_DELETE(l_sign_pkey_hash_str); // order state /* { int l_order_state = get_order_state(a_order->node_addr); @@ -601,43 +655,26 @@ static void s_srv_order_callback_notify(dap_global_db_context_t *a_context, dap_ l_notifier->callback(a_context, a_obj, l_notifier->cb_arg); } } - if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD && - dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", true)) { + bool l_allow_unsigned_orders = dap_config_get_item_bool_default(g_config, "srv", "allow_unsigned_orders", false); +// bool l_allow_unverified_orders = dap_config_get_item_bool_default(g_config, "srv", "allow_unverified_orders", false); + if (a_obj->value && a_obj->type == DAP_DB$K_OPTYPE_ADD) { dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_obj->value; if (l_order->version != 3) { + log_it(L_NOTICE, "Order %s removed version != 3.", a_obj->key); dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); } else { - dap_sign_t *l_sign = (dap_sign_t *)(l_order->ext_n_sign + l_order->ext_size); - size_t l_max_size = a_obj->value_len - sizeof(dap_chain_net_srv_order_t) - l_order->ext_size; - int l_verify = dap_sign_verify_all(l_sign, l_max_size, l_order, sizeof(dap_chain_net_srv_order_t) + l_order->ext_size); - if (l_verify) { - log_it(L_ERROR, "Order unverified, err %d", l_verify); - dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); + if (l_allow_unsigned_orders) { + log_it(L_DEBUG, "The mode that disables verification of the order signature is enabled."); + } else { + dap_sign_t *l_sign = (dap_sign_t *) (l_order->ext_n_sign + l_order->ext_size); + size_t l_max_size = a_obj->value_len - sizeof(dap_chain_net_srv_order_t) - l_order->ext_size; + int l_verify = dap_sign_verify_all(l_sign, l_max_size, l_order, + sizeof(dap_chain_net_srv_order_t) + l_order->ext_size); + if (l_verify) { + log_it(L_ERROR, "Order unverified, err %d", l_verify); + dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); + } } - // Check new order is signs delegated key - dap_hash_fast_t l_pkey_hash = {0}; - dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); - dap_chain_addr_t l_addr = {0}; - dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); - if (!dap_chain_net_srv_stake_key_delegated(&l_addr)) { - char *l_pkey_hash_str = dap_hash_fast_to_str_new(&l_pkey_hash); - log_it(L_ERROR, "Order %s signed by the non-delegated public key %s.", a_obj->key, l_pkey_hash_str); - DAP_DELETE(l_pkey_hash_str); - dap_global_db_del_unsafe(l_gdb_context, a_obj->group, a_obj->key); - } - /*dap_chain_hash_fast_t l_pkey_hash; - if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { - dap_global_db_gr_del(dap_strdup(a_key), a_group); - DAP_DELETE(l_gdb_group_str); - return; - } - dap_chain_addr_t l_addr = {}; - dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); - uint128_t l_balance = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker); - uint64_t l_solvency = dap_chain_uint128_to(l_balance); - if (l_solvency < l_order->price && !dap_chain_net_srv_stake_key_delegated(&l_addr)) { - dap_global_db_gr_del(dap_strdup(a_key), a_group); - }*/ } } } @@ -652,3 +689,4 @@ void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_sto l_notifier->cb_arg = a_cb_arg; s_order_notify_callbacks = dap_list_append(s_order_notify_callbacks, l_notifier); } + 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 9bd5ab6302..93d481ac2c 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 @@ -1967,3 +1967,12 @@ static void s_cache_data(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap if (dap_global_db_set(l_gdb_group, l_data_key, &l_cache_data, sizeof(l_cache_data), false, NULL, NULL)) log_it(L_WARNING, "Stake service cache mismatch"); } + +bool dap_chain_net_srv_stake_check_pkey_hash(dap_hash_fast_t *a_pkey_hash) { + dap_chain_net_srv_stake_item_t *l_stake, *l_tmp; + HASH_ITER(hh, s_srv_stake->itemlist, l_stake, l_tmp) { + if (dap_hash_fast_compare(&l_stake->signing_addr.data.hash_fast, a_pkey_hash)) + return true; + } + return false; +} diff --git a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h index 6d5fc95306..820ad2a8ca 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake_pos_delegate.h @@ -88,3 +88,5 @@ bool dap_chain_net_srv_stake_check_validator(dap_chain_net_t * a_net, dap_hash_f dap_chain_datum_decree_t *dap_chain_net_srv_stake_decree_approve(dap_chain_net_t *a_net, dap_hash_fast_t *a_stake_tx_hash, dap_cert_t *a_cert); int dap_chain_net_srv_stake_mark_validator_active(dap_chain_addr_t *a_signing_addr, bool a_on_off); + +bool dap_chain_net_srv_stake_check_pkey_hash(dap_hash_fast_t *a_pkey_hash); -- GitLab