diff --git a/dap-sdk b/dap-sdk index 1f0c4caf7a9cec9ddee67e9019e337c4c9278168..5d4221856c689086adb730cbc530111d1ea1e21d 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 1f0c4caf7a9cec9ddee67e9019e337c4c9278168 +Subproject commit 5d4221856c689086adb730cbc530111d1ea1e21d diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index 7dbf04b51274ef029b745509fa14f186eb41158e..44fe70e5886e581aed4c1eaa83e100cd0b42cf2f 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -1449,7 +1449,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) * @param sh HTTP server instance * @param url URL string */ -void dap_chain_mempool_add_proc(dap_http_t * a_http_server, const char * a_url) +void dap_chain_mempool_add_proc(dap_http_server_t * a_http_server, const char * a_url) { dap_http_simple_proc_add(a_http_server, a_url, 4096, chain_mempool_proc); } diff --git a/modules/mempool/include/dap_chain_mempool.h b/modules/mempool/include/dap_chain_mempool.h index d18df1e803e53ec819a4f0635fe31e00efb368d9..a2221296a2a3e5de36bd2360878f659bcb4b53a9 100644 --- a/modules/mempool/include/dap_chain_mempool.h +++ b/modules/mempool/include/dap_chain_mempool.h @@ -4,7 +4,7 @@ #include "dap_chain_net.h" #include "dap_chain_datum.h" #include "dap_chain_ledger.h" -#include "dap_http.h" +#include "dap_http_server.h" #include "dap_cert.h" #include "dap_chain_block_cache.h" /* @@ -56,7 +56,7 @@ dap_datum_mempool_t * dap_datum_mempool_deserialize(uint8_t *datum_mempool_str, void dap_datum_mempool_clean(dap_datum_mempool_t *datum); 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); +void dap_chain_mempool_add_proc(dap_http_server_t * a_http_server, const char * a_url); void dap_chain_mempool_filter(dap_chain_t *a_chain, int *a_removed); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index 227d5c0bd2c7d138c07e75a955ec20bdee7ca103..bc549582557f87509b80b4e74fcf1188a543bc3a 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -4783,6 +4783,7 @@ int dap_ledger_tx_load(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, dap_c */ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) { + dap_return_if_fail(a_ledger); dap_ledger_private_t *l_ledger_pvt = PVT(a_ledger); pthread_rwlock_wrlock(&l_ledger_pvt->ledger_rwlock); pthread_rwlock_wrlock(&l_ledger_pvt->tokens_rwlock); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index d85f0058f2441c2996521ad0e88c8f71bcf2ed8b..0f5ca1b87e4100f4ab84a3dc0d0bec60538d25ef 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -181,6 +181,9 @@ typedef struct dap_chain_net_pvt{ uint16_t permanent_links_count; dap_stream_node_addr_t *permanent_links; // TODO realize permanent links from config + uint16_t poa_nodes_count; + dap_stream_node_addr_t *poa_nodes_addrs; + uint16_t seed_nodes_count; struct sockaddr_in *seed_nodes_ipv4; struct sockaddr_in6 *seed_nodes_ipv6; // TODO @@ -577,6 +580,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) dap_chain_node_info_t l_link_node_info = {}; l_link_node_info.hdr.ext_addr_v4 = l_net_pvt->seed_nodes_ipv4[i].sin_addr; l_link_node_info.hdr.ext_port = l_net_pvt->seed_nodes_ipv4[i].sin_port; + l_link_node_info.hdr.address = l_net_pvt->poa_nodes_addrs[i]; if (s_net_link_add(a_net, &l_link_node_info) > 0) // Maximum links count reached break; } @@ -2414,11 +2418,14 @@ void dap_chain_net_delete(dap_chain_net_t *a_net) } if (PVT(a_net)->main_timer) dap_interval_timer_delete(PVT(a_net)->main_timer); + DAP_DEL_Z(PVT(a_net)->poa_nodes_addrs); DAP_DEL_Z(PVT(a_net)->seed_nodes_ipv4); DAP_DEL_Z(PVT(a_net)->seed_nodes_ipv6); DAP_DEL_Z(PVT(a_net)->node_info); - dap_ledger_purge(a_net->pub.ledger, true); - dap_ledger_handle_free(a_net->pub.ledger); + if (a_net->pub.ledger) { + dap_ledger_purge(a_net->pub.ledger, true); + dap_ledger_handle_free(a_net->pub.ledger); + } DAP_DELETE(a_net); } @@ -2506,6 +2513,28 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) // Wait time before reconnect attempt with same link l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10); + char **l_poa_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "seed_nodes_addrs", &l_net_pvt->poa_nodes_count); + if (!l_net_pvt->poa_nodes_count) { + log_it(L_ERROR, "Can't read seed nodes addresses"); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -15; + } + l_net_pvt->poa_nodes_addrs = DAP_NEW_SIZE(dap_stream_node_addr_t, l_net_pvt->poa_nodes_count * sizeof(dap_stream_node_addr_t)); + if (!l_net_pvt->poa_nodes_addrs) { + log_it(L_CRITICAL, g_error_memory_alloc); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -1; + } + for (uint16_t i = 0; i < l_net_pvt->poa_nodes_count; i++) { + if (dap_stream_node_addr_from_str(l_net_pvt->poa_nodes_addrs + i, l_poa_nodes_addrs[i])) { + log_it(L_ERROR, "Incorrect format for address #%hu", i); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -16; + } + } uint16_t l_seed_nodes_ipv4_len = 0; char **l_seed_nodes_ipv4 = dap_config_get_array_str(l_cfg, "general", "seed_nodes_ipv4", &l_seed_nodes_ipv4_len); uint16_t l_seed_nodes_ipv6_len = 0; @@ -2519,9 +2548,12 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) if (l_seed_nodes_port_len) { if ((l_seed_nodes_ipv4_len && l_seed_nodes_ipv4_len != l_seed_nodes_port_len) || (l_seed_nodes_ipv6_len && l_seed_nodes_ipv6_len != l_seed_nodes_port_len) || - (l_seed_nodes_hostnames_len && l_seed_nodes_hostnames_len != l_seed_nodes_port_len)) { + (l_seed_nodes_hostnames_len && l_seed_nodes_hostnames_len != l_seed_nodes_port_len) || + (!l_seed_nodes_ipv4_len && !l_seed_nodes_ipv6_len && !l_seed_nodes_hostnames_len)) { log_it (L_ERROR, "Configuration mistake for seed nodes"); - + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -6; } l_net_pvt->seed_nodes_count = l_seed_nodes_port_len; } else { @@ -2530,8 +2562,23 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) l_net_pvt->seed_nodes_count = l_bootstrap_nodes_len; } log_it (L_DEBUG, "Read %u seed nodes params", l_net_pvt->seed_nodes_count); - l_net_pvt->seed_nodes_ipv4 = DAP_NEW_SIZE(struct sockaddr_in, l_net_pvt->seed_nodes_count * sizeof(struct sockaddr_in)); - l_net_pvt->seed_nodes_ipv6 = DAP_NEW_SIZE(struct sockaddr_in6, l_net_pvt->seed_nodes_count * sizeof(struct sockaddr_in6)); + if (l_seed_nodes_ipv6_len) { + l_net_pvt->seed_nodes_ipv6 = DAP_NEW_SIZE(struct sockaddr_in6, l_net_pvt->seed_nodes_count * sizeof(struct sockaddr_in6)); + if (!l_net_pvt->seed_nodes_ipv6) { + log_it(L_CRITICAL, g_error_memory_alloc); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -1; + } + } else { // Just only IPv4 can be resolved for now + l_net_pvt->seed_nodes_ipv4 = DAP_NEW_SIZE(struct sockaddr_in, l_net_pvt->seed_nodes_count * sizeof(struct sockaddr_in)); + if (!l_net_pvt->seed_nodes_ipv4) { + log_it(L_CRITICAL, g_error_memory_alloc); + dap_chain_net_delete(l_net); + dap_config_close(l_cfg); + return -1; + } + } // Load seed nodes from cfg file for (uint16_t i = 0; i < l_net_pvt->seed_nodes_count; i++) { char *l_node_hostname = NULL; @@ -2551,16 +2598,16 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) l_node_port = atoi(l_bootstrap_port_str); l_node_hostname = l_bootstrap_nodes[i]; } - if (!l_node_port) - l_node_port = dap_config_get_item_uint16_default(g_config, "server", "listen_port_tcp", 8079); if (!l_node_port) { log_it(L_ERROR, "Can't find port for seed node #%hu", i); dap_chain_net_delete(l_net); dap_config_close(l_cfg); return -12; } else { - l_net_pvt->seed_nodes_ipv4[i].sin_port = l_node_port; - l_net_pvt->seed_nodes_ipv6[i].sin6_port = l_node_port; + if (l_seed_nodes_ipv6_len) + l_net_pvt->seed_nodes_ipv6[i].sin6_port = l_node_port; + else + l_net_pvt->seed_nodes_ipv4[i].sin_port = l_node_port; } if (l_node_hostname) { struct in_addr l_res = {}; @@ -2845,7 +2892,7 @@ int s_net_load(dap_chain_net_t *a_net) } dap_chain_net_add_poa_certs_to_cluster(l_net, l_cluster); DAP_DELETE(l_gdb_groups_mask); - if (l_net->pub.chains == l_chain) + if (l_net->pub.chains == l_chain) // Pointer for first mempool cluster in global double-linked list of clusters l_net_pvt->mempool_clusters = l_cluster; } // Service orders cluster @@ -3042,11 +3089,8 @@ void dap_chain_net_srv_order_add_notify_callback(dap_chain_net_t *a_net, dap_sto int dap_chain_net_add_poa_certs_to_cluster(dap_chain_net_t *a_net, dap_global_db_cluster_t *a_cluster) { dap_return_val_if_fail(a_net && a_cluster, -1); - for (dap_list_t *it = a_net->pub.keys; it; it = it->next) { - dap_pkey_t *l_pkey = it->data; - dap_stream_node_addr_t l_poa_addr = dap_stream_node_addr_from_pkey(l_pkey); - dap_global_db_cluster_member_add(a_cluster, &l_poa_addr, DAP_GDB_MEMBER_ROLE_ROOT); - } + for (uint16_t i = 0; i < PVT(a_net)->poa_nodes_count; i++) + dap_global_db_cluster_member_add(a_cluster, PVT(a_net)->poa_nodes_addrs + i, DAP_GDB_MEMBER_ROLE_ROOT); return 0; } diff --git a/modules/net/dap_chain_net_news.h b/modules/net/dap_chain_net_news.h deleted file mode 100644 index d3c82ce4658987c30e207472e51015d55c326c0f..0000000000000000000000000000000000000000 --- a/modules/net/dap_chain_net_news.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Authors: - * Alexander Lysikov <alexander.lysikov@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * Kelvin Project https://github.com/kelvinblockchain - * Copyright (c) 2020 - * All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "dap_http.h" - -int dap_chain_net_news_init(dap_http_t * a_http); -void dap_chain_net_srv_vpn_cdb_news_cache_reset(void); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 9fcfa027f558f66930d766a816c8088d0fd264f5..59765c7bd96b0bf9302c97582bb9d33bde701676 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -82,12 +82,8 @@ #include "dap_chain_block.h" #include "dap_chain_cs_blocks.h" -#ifndef _WIN32 -#include "dap_chain_net_news.h" -#endif #include "dap_chain_cell.h" - #include "dap_enc_base64.h" #include "json.h" #ifdef DAP_OS_UNIX @@ -3448,7 +3444,11 @@ static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_h char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_new(a_chain); uint8_t *l_data_tmp = dap_global_db_get_sync(l_gdb_group_mempool, a_datum_hash_str, NULL, NULL, NULL); - if(l_data_tmp && dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash_str) == 0) { + if (!l_data_tmp) { + DAP_DELETE(l_gdb_group_mempool); + return 1; + } + if (dap_global_db_del_sync(l_gdb_group_mempool, a_datum_hash_str) == 0) { char *l_msg_str = dap_strdup_printf("Datum %s deleted", a_datum_hash_str); json_object *l_msg = json_object_new_string(l_msg_str); DAP_DELETE(l_msg_str); @@ -3465,7 +3465,7 @@ static int mempool_delete_for_chain(dap_chain_t *a_chain, const char * a_datum_h } else { DAP_DELETE(l_gdb_group_mempool); DAP_DELETE(l_data_tmp); - return 1; + return 2; } } @@ -3501,7 +3501,7 @@ int _cmd_mempool_delete(dap_chain_net_t *a_net, dap_chain_t *a_chain, const char res = mempool_delete_for_chain(a_chain, a_datum_hash, a_json_reply); } if (res) { - char *l_msg_str = dap_strdup_printf("Error! Can't find datum %s", a_datum_hash); + char *l_msg_str = dap_strdup_printf("Error! Can't %s datum %s", res == 1 ? "find" : "delete", a_datum_hash); if (!l_msg_str) { dap_json_rpc_allocation_error; return DAP_JSON_RPC_ERR_CODE_MEMORY_ALLOCATED; diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index fadccfe53697b5ff48d867299c1c51717c43c5b9..eac80ec86b27bd2f7ef3182264e0eaaf13ec123c 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -268,8 +268,17 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) l_node_client->callbacks.connected(l_node_client, l_node_client->callbacks_arg); dap_stream_ch_chain_net_pkt_hdr_t l_announce = { .version = DAP_STREAM_CH_CHAIN_NET_PKT_VERSION, .net_id = l_node_client->net->pub.id }; + // Announce net on downlink dap_client_write_unsafe(a_client, 'N', DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE, &l_announce, sizeof(l_announce)); + // Add uplink to clusters + dap_stream_node_addr_t *l_uplink_addr = &l_node_client->info->hdr.address; + dap_global_db_cluster_t *it; + DL_FOREACH(dap_global_db_instance_get_default()->clusters, it) + if (dap_cluster_member_find_unsafe(it->role_cluster, l_uplink_addr)) + dap_cluster_member_add(it->links_cluster, l_uplink_addr, 0, NULL); + dap_chain_net_add_cluster_link(l_node_client->net, l_uplink_addr); + pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_ESTABLISHED; if (s_stream_ch_chain_debug_more) diff --git a/modules/net/include/dap_chain_net_bugreport.h b/modules/net/include/dap_chain_net_bugreport.h index c930015f0b79897ba7502452b74da80595b89872..d4ca32a594bfc38129acb7504ea0dfe72fde2ade 100644 --- a/modules/net/include/dap_chain_net_bugreport.h +++ b/modules/net/include/dap_chain_net_bugreport.h @@ -22,6 +22,6 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ -#include "dap_http.h" +#include "dap_http_server.h" -int dap_chain_net_bugreport_init(dap_http_t * a_http); +int dap_chain_net_bugreport_init(dap_http_server_t * a_http); diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index 20e33178fc72ff76962a576110d4ded2f872c32e..be4dc5d5c7db959bbf037181267497274b9cf6d6 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -865,7 +865,7 @@ dap_chain_net_srv_price_t * dap_chain_net_srv_get_price_from_order(dap_chain_net } uint64_t l_max_price_cfg = dap_config_get_item_uint64_default(g_config, a_config_section, "max_price", 0xFFFFFFFFFFFFFFF); - if (l_order->node_addr.uint64 != l_node_addr->uint64 && + if (l_order->node_addr.uint64 != g_node_addr.uint64 && l_order->srv_uid.uint64 != a_srv->uid.uint64) { DAP_DELETE(l_price); DAP_DEL_Z(l_order); @@ -970,7 +970,7 @@ int dap_chain_net_srv_price_apply_from_my_order(dap_chain_net_srv_t *a_srv, cons log_it(L_ERROR, "Invalid order: NULL. Skip order."); continue; } - if (l_order->node_addr.uint64 == l_node_addr->uint64 && + if (l_order->node_addr.uint64 == g_node_addr.uint64 && l_order->srv_uid.uint64 == a_srv->uid.uint64) { l_err_code = 0; dap_chain_net_srv_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_price_t); 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 d448dfa7877f708e65e56fbca106fe53e04aae14..0d49e1cbf4a280689545bf7531f2aeff27bb3731 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 @@ -2547,7 +2547,8 @@ static int s_cli_srv_stake(int a_argc, char **a_argv, void **a_str_reply) char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str(&l_datum_hash, l_hash_str, sizeof(l_hash_str)); dap_string_append_printf(l_str_tmp,"%s \n",spaces); - dap_string_append_printf(l_str_tmp, "%s \n", dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_datum_tx->header.ts_created)); + dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_datum_tx->header.ts_created); + dap_string_append_printf(l_str_tmp, "%s \n", buf); dap_string_append_printf(l_str_tmp,"tx_hash:\t%s \n",l_hash_str); l_signing_addr_str = dap_chain_addr_to_str(&l_tx_out_cond->subtype.srv_stake_pos_delegate.signing_addr); diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c index d7a33983479c3a3f272a53d1c9bd83047d8d69d3..3e0630c055cfac649bb14a19887b240afc3ddd91 100644 --- a/modules/service/xchange/dap_chain_net_srv_xchange.c +++ b/modules/service/xchange/dap_chain_net_srv_xchange.c @@ -1132,11 +1132,7 @@ static int s_cli_srv_xchange_order(int a_argc, char **a_argv, int a_arg_index, v return -15; } } - if (compare256(l_value, l_value_sell) == -1) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "%s\nNot enough cash in specified wallet", l_sign_str); - dap_chain_wallet_close(l_wallet); - return -12; - } + // Create the price dap_chain_net_srv_xchange_price_t *l_price = DAP_NEW_Z(dap_chain_net_srv_xchange_price_t); if (!l_price) { @@ -2509,7 +2505,6 @@ int dap_chain_net_srv_xchange_create(dap_chain_net_t *a_net, const char *a_token log_it(L_CRITICAL, "Memory allocation error"); return XCHANGE_CREATE_ERROR_MEMORY_ALLOCATED; } - l_price->wallet_str = dap_strdup(a_wallet->name); dap_stpcpy(l_price->token_sell, a_token_sell); l_price->net = a_net; dap_stpcpy(l_price->token_buy, a_token_buy); @@ -2519,7 +2514,6 @@ int dap_chain_net_srv_xchange_create(dap_chain_net_t *a_net, const char *a_token // Create conditional transaction dap_chain_datum_tx_t *l_tx = s_xchange_tx_create_request(l_price, a_wallet); if (!l_tx) { - DAP_DELETE(l_price->wallet_str); DAP_DELETE(l_price); return XCHANGE_CREATE_ERROR_CAN_NOT_COMPOSE_THE_CONDITIONAL_TRANSACTION; } @@ -2527,7 +2521,6 @@ int dap_chain_net_srv_xchange_create(dap_chain_net_t *a_net, const char *a_token dap_hash_fast(l_tx, dap_chain_datum_tx_get_size(l_tx), &l_tx_hash); char* l_ret = NULL; if(!(l_ret = s_xchange_tx_put(l_tx, a_net))) { - DAP_DELETE(l_price->wallet_str); DAP_DELETE(l_price); return XCHANGE_CREATE_ERROR_CAN_NOT_PUT_TRANSACTION_TO_MEMPOOL; }