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 2eb04c7ae82ff0cfde884c2af04d2e1d4dfe1ff7..a9bc51329619874adb7c770098624a7646ed7a93 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -275,7 +275,7 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ char *l_addr_str = dap_chain_addr_to_str(&l_addr); log_it(L_WARNING, "Verify of event is false, because bal=0 for addr=%s", l_addr_str); DAP_DELETE(l_addr_str); - return -1; + return 0; //-1; } } diff --git a/modules/net/CMakeLists.txt b/modules/net/CMakeLists.txt index 856e4c5e3b9cf32c5c2d03f059adac498f9d3b81..09cbb1cf9633cd5724c651b7ce5f27f3a27b01e9 100644 --- a/modules/net/CMakeLists.txt +++ b/modules/net/CMakeLists.txt @@ -39,12 +39,13 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRCS} ${DAP_CHAIN_NET_HEADERS} ${IPUTILS_SRCS} ${IPUTILS_HEADERS}) if(WIN32) - target_link_libraries(dap_chain_net dap_core dap_crypto dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db ) + target_link_libraries(dap_chain_net dap_core dap_crypto dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_chain dap_chain_wallet dap_chain_net_srv + dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake) endif() if(UNIX) target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_chain - dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db + dap_chain_wallet dap_chain_net_srv dap_chain_mempool dap_chain_global_db dap_chain_net_srv_stake resolv ) endif() diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index cc09de5d242098665f42c8779b4b8db26bc9737d..e55befd9d9a5ec51fa1fdb537c05c36369af8f8e 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -67,6 +67,7 @@ #include "dap_chain_node_cli.h" #include "dap_chain_node_cli_cmd.h" #include "dap_chain_ledger.h" +#include "dap_chain_net_srv_stake.h" #include "dap_chain_global_db.h" #include "dap_chain_global_db_remote.h" @@ -263,28 +264,34 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c } }*/ } - if (!dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { + if (!a_value || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { return; } dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; char *l_gdb_group_str = dap_chain_net_srv_order_get_gdb_group(l_net); - if (strcmp(a_group, l_gdb_group_str)) { + if (!strcmp(a_group, l_gdb_group_str)) { dap_chain_net_srv_order_t *l_order = (dap_chain_net_srv_order_t *)a_value; if (l_order->version == 1) { dap_chain_global_db_gr_del((char *)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)) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + DAP_DELETE(l_gdb_group_str); + return; + } dap_chain_hash_fast_t l_pkey_hash; if (!dap_sign_get_pkey_hash(l_sign, &l_pkey_hash)) { + dap_chain_global_db_gr_del((char *)a_key, a_group); + DAP_DELETE(l_gdb_group_str); return; } - dap_chain_addr_t l_addr = {0}; + dap_chain_addr_t l_addr = {}; dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, l_net->pub.id); uint64_t l_solvency = dap_chain_ledger_calc_balance(l_net->pub.ledger, &l_addr, l_order->price_ticker); - if (l_solvency < l_order->price) { + if (l_solvency < l_order->price && !dap_chain_net_srv_stake_key_delegated(&l_addr)) { dap_chain_global_db_gr_del((char *)a_key, a_group); } - // TODO check for delegated key } DAP_DELETE(l_gdb_group_str); } diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index 2dc64bfa7c705ddaac0323959680aed83c9a7cf6..fb49da89f356e0dddb24ecebce8268eea3884516 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -124,6 +124,24 @@ bool dap_chain_net_srv_stake_verificator(dap_chain_tx_out_cond_t *a_cond, dap_ch return false; } +bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr) +{ + if (!s_srv_stake) { + return true; + } + while (!s_srv_stake->initialized); + + if (!a_addr) { + return false; + } + dap_chain_net_srv_stake_item_t *l_stake = NULL; + HASH_FIND(hh, s_srv_stake->itemlist, a_addr, sizeof(dap_chain_addr_t), l_stake); + if (l_stake) { // public key delegated for this network + return true; + } + return false; +} + bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum_tx_t *a_tx) { if (!s_srv_stake) { @@ -139,33 +157,36 @@ bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum if (l_stake == NULL) { // public key not delegated for this network return true; } + dap_chain_tx_sig_t *l_tx_sig = (dap_chain_tx_sig_t *)dap_chain_datum_tx_item_get(a_tx, NULL, TX_ITEM_TYPE_SIG, NULL); + dap_sign_t *l_sign = dap_chain_datum_tx_item_sign_get_sig((dap_chain_tx_sig_t *)l_tx_sig); + dap_chain_hash_fast_t l_pkey_hash = {}; + dap_sign_get_pkey_hash(l_sign, &l_pkey_hash); + dap_chain_addr_t l_owner_addr = {}; + dap_chain_addr_fill(&l_owner_addr, l_sign->header.type, &l_pkey_hash, a_addr->net_id); uint64_t l_outs_sum = 0, l_fee_sum = 0; dap_list_t *l_list_out_items = dap_chain_datum_tx_items_get(a_tx, TX_ITEM_TYPE_OUT_ALL, NULL); uint32_t l_out_idx_tmp = 0; // current index of 'out' item for (dap_list_t *l_list_tmp = l_list_out_items; l_list_tmp; l_list_tmp = dap_list_next(l_list_tmp), l_out_idx_tmp++) { dap_chain_tx_item_type_t l_type = *(uint8_t *)l_list_tmp->data; - if (l_type == TX_ITEM_TYPE_OUT_COND) { - dap_chain_tx_out_cond_t *l_out_cond = (dap_chain_tx_out_cond_t *)l_list_tmp->data; - l_outs_sum += l_out_cond->header.value; - } if (l_type == TX_ITEM_TYPE_OUT) { dap_chain_tx_out_t *l_out = (dap_chain_tx_out_t *)l_list_tmp->data; - if (memcmp(&l_stake->addr_fee, &l_out->addr, sizeof(dap_chain_addr_t))) { + if (!memcmp(&l_stake->addr_fee, &l_out->addr, sizeof(dap_chain_addr_t))) { l_fee_sum += l_out->header.value; - } else { + } else if (memcmp(&l_owner_addr, &l_out->addr, sizeof(dap_chain_addr_t))) { l_outs_sum += l_out->header.value; } - } else { // TX_ITEM_TYPE_OUT_EXT + } + if (l_type == TX_ITEM_TYPE_OUT_EXT) { dap_chain_tx_out_ext_t *l_out_ext = (dap_chain_tx_out_ext_t *)l_list_tmp->data; - if (memcmp(&l_stake->addr_fee, &l_out_ext->addr, sizeof(dap_chain_addr_t))) { + if (!memcmp(&l_stake->addr_fee, &l_out_ext->addr, sizeof(dap_chain_addr_t))) { l_fee_sum += l_out_ext->header.value; - } else { + } else if (memcmp(&l_owner_addr, &l_out_ext->addr, sizeof(dap_chain_addr_t))) { l_outs_sum += l_out_ext->header.value; } } } dap_list_free(l_list_out_items); - if (l_outs_sum * l_stake->fee_value / 100.0 < l_fee_sum) { + if (l_fee_sum < l_outs_sum * l_stake->fee_value / 100.0) { return false; } return true; @@ -440,7 +461,6 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha l_stake->fee_value = l_fee; // Create the order & put it to GDB char *l_order_hash_str = s_stake_order_create(l_stake, l_cert->enc_key); - dap_cert_delete(l_cert); if (l_order_hash_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); DAP_DELETE(l_order_hash_str); @@ -545,7 +565,6 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha // Create the order & put it to GDB dap_chain_net_srv_order_delete_by_hash_str(l_net, l_order_hash_str); l_order_hash_str = s_stake_order_create(l_stake, l_cert->enc_key); - dap_cert_delete(l_cert); if (l_order_hash_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "Successfully created order %s", l_order_hash_str); DAP_DELETE(l_order_hash_str); diff --git a/modules/service/stake/include/dap_chain_net_srv_stake.h b/modules/service/stake/include/dap_chain_net_srv_stake.h index 34b16264371774ecd25e3c475b61de7d0c30c8c3..4a89391531b1a3fa7881344ba2ce6fc53f405750 100644 --- a/modules/service/stake/include/dap_chain_net_srv_stake.h +++ b/modules/service/stake/include/dap_chain_net_srv_stake.h @@ -57,3 +57,4 @@ int dap_chain_net_srv_stake_init(); void dap_chain_net_srv_stake_deinit(); bool dap_chain_net_srv_stake_verificator(dap_chain_tx_out_cond_t *a_cond, dap_chain_datum_tx_t *a_tx); bool dap_chain_net_srv_stake_validator(dap_chain_addr_t *a_addr, dap_chain_datum_tx_t *a_tx); +bool dap_chain_net_srv_stake_key_delegated(dap_chain_addr_t *a_addr); diff --git a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c index 6d328957f96aa402776db57aa281638d9dd1240b..10a4b262f1a35cea817c94501bb248ece81d1831 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn_cmd.c @@ -1,4 +1,5 @@ #include <dap_chain_node_cli.h> +#include "dap_chain_node_cli_cmd.h" #include "dap_chain_net_srv_vpn_cmd.h" #include "dap_chain_net_vpn_client.h"