diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 31b5d86b1497bb1d94cb920384236e79939f1266..d6ea5cb8544df48284d4b5654fe24d491aa77950 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -67,7 +67,6 @@ int s_prepare_env(); */ int dap_chain_init(void) { - dap_cert_init(); // Cell sharding init dap_chain_cell_init(); dap_chain_ledger_init(); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 5a281953a5839afb927d6403fcc3de3234961acf..fc7654efc02af9846d8cd0fbc15a9458217053f1 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -170,21 +170,15 @@ typedef struct dap_chain_net_pvt{ uint16_t reconnect_delay; // sec bool load_mode; - char ** seed_aliases; uint16_t bootstrap_nodes_count; struct in_addr *bootstrap_nodes_addrs; uint16_t *bootstrap_nodes_ports; - uint16_t gdb_sync_groups_count; - uint16_t gdb_sync_nodes_addrs_count; - uint16_t gdb_sync_nodes_links_count; - char **gdb_sync_groups; - dap_chain_node_addr_t *gdb_sync_nodes_addrs; - uint32_t *gdb_sync_nodes_links_ips; - uint16_t *gdb_sync_nodes_links_ports; + uint16_t permanent_links_count; + dap_chain_node_addr_t *permanent_links; // TODO realize permanent links from config - uint16_t seed_aliases_count; + uint16_t seed_nodes_count; struct in_addr *seed_nodes_addrs_v4; uint16_t *seed_nodes_ports; uint64_t *seed_nodes_addrs; @@ -264,25 +258,6 @@ static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); static void s_prepare_links_from_balancer(dap_chain_net_t *a_net); static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_replace_tries); -static void s_update_my_link_info_timer_callback(void *a_arg) -{ - dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg; - size_t l_blocks_events = 0; - dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, &g_node_addr); - if (!l_node_info) - return; - dap_chain_t *l_chain; - DL_FOREACH(l_net->pub.chains, l_chain) { - if(l_chain->callback_count_atom) - l_blocks_events += l_chain->callback_count_atom(l_chain); - } - l_node_info->hdr.blocks_events = l_blocks_events; - char *l_key = dap_chain_node_addr_to_hash_str(&g_node_addr); - //dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, l_node_info, dap_chain_node_info_get_size(l_node_info), false); - DAP_DELETE(l_node_info); -} - - /** * @brief * init network settings from cellrame-node.cfg file @@ -474,9 +449,9 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net) struct in_addr l_addr = {}; uint16_t i, l_port = 0; uint64_t l_node_adrr = 0; - if (l_net_pvt->seed_aliases_count) { + if (l_net_pvt->seed_nodes_count) { do { - i = dap_random_uint16() % l_net_pvt->seed_aliases_count; + i = dap_random_uint16() % l_net_pvt->seed_nodes_count; } while (l_net_pvt->seed_nodes_addrs[i] == g_node_addr.uint64); dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); if(l_link_node_info){ @@ -653,7 +628,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) { int ret = 0; dap_chain_net_pvt_t *l_pvt_net = PVT(a_net); - for (size_t i = 0; i < l_pvt_net->seed_aliases_count; i++) { + for (size_t i = 0; i < l_pvt_net->seed_nodes_count; i++) { /* dap_chain_node_addr_t *l_link_addr = dap_chain_node_alias_find(a_net, l_pvt_net->seed_aliases[i]); if (!l_link_addr) @@ -1020,7 +995,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla l_net_link_add = s_net_link_add(a_net, l_node_info + i); switch (l_net_link_add) { case 0: - log_it(L_MSG, "Network LOCAL balancer issues link IP %s, [%ld blocks]", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->hdr.blocks_events); + log_it(L_MSG, "Network LOCAL balancer issues link IP %s, [%ld blocks]", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->info.atoms_count); break; case -1: log_it(L_MSG, "Network LOCAL balancer: IP %s is already among links", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4)); @@ -1203,32 +1178,18 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_PREPARE", l_net->pub.name); s_net_states_notify(l_net); // Extra links from cfg - for (int i = 0; i < l_net_pvt->gdb_sync_nodes_links_count; i++) { - if (i >= l_net_pvt->gdb_sync_nodes_addrs_count) - break; - dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); + for (int i = 0; i < l_net_pvt->permanent_links_count; i++) { + dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, l_net_pvt->permanent_links + i); if (!l_link_node_info) { - log_it(L_CRITICAL, "Memory allocation error"); - return false; + log_it(L_WARNING, "Can't find addr info for permanent link " NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS(l_net_pvt->permanent_links + i)); + continue; } - l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64; - l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i]; - l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i]; s_net_link_add(l_net, l_link_node_info); DAP_DELETE(l_link_node_info); } - // Links from node info structure (currently empty) - if (l_net_pvt->node_info) { - for (size_t i = 0; i < l_net_pvt->node_info->hdr.links_number; i++) { - dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &l_net_pvt->node_info->links[i]); - s_net_link_add(l_net, l_link_node_info); - DAP_DEL_Z(l_link_node_info); - } - } else { - log_it(L_WARNING,"No nodeinfo in global_db to prepare links for connecting, try to add links from root servers"); - } - if (!l_net_pvt->seed_aliases_count && ! l_net_pvt->bootstrap_nodes_count){ + if (!l_net_pvt->seed_nodes_count && ! l_net_pvt->bootstrap_nodes_count){ log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests"); if (l_net_pvt->net_links) { // We have other links l_net_pvt->state = NET_STATE_LINKS_CONNECTING; @@ -1409,10 +1370,6 @@ void dap_chain_net_delete(dap_chain_net_t *a_net) { pthread_mutex_destroy(&PVT(a_net)->uplinks_mutex); pthread_mutex_destroy(&a_net->pub.balancer_mutex); - if(PVT(a_net)->seed_aliases) { - DAP_DELETE(PVT(a_net)->seed_aliases); - PVT(a_net)->seed_aliases = NULL; - } DAP_DELETE(a_net); } @@ -1550,7 +1507,7 @@ static bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net) DAP_DELETE(l_cache_dir); // create file, if it not presented. If file exists, ledger cache operation is stopped if (dap_file_simple_test(l_cache_file)) { - log_it(L_WARNING, "Cache file '%s' already exists", l_cache_file); + log_it(L_NOTICE, "Cache file '%s' already exists", l_cache_file); DAP_DELETE(l_cache_file); return false; } @@ -1855,7 +1812,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply) "\t\text_ipv6: %s\n" "\t\text_port: %u\n" "\t\tstate: %s\n", - NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->hdr.alias, l_info->hdr.cell_id.uint64, + NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->alias, l_info->hdr.cell_id.uint64, l_ext_addr_v4, l_ext_addr_v6, l_info->hdr.ext_port, dap_chain_node_client_state_to_str(l_node_client->state) ); } @@ -2155,6 +2112,9 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) return -1; } } + l_net->pub.gdb_groups_prefix = dap_strdup( + dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix", + dap_config_get_item_str(l_cfg, "general", "name"))); dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); l_net_pvt->load_mode = true; l_net_pvt->acl_idx = a_acl_idx; @@ -2183,21 +2143,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) HASH_ADD_STR(s_net_items,name,l_net_item); HASH_ADD(hh2, s_net_ids, net_id, sizeof(l_net_item->net_id), l_net_item); - // Check if seed nodes are present in local db alias - char **l_seed_aliases = dap_config_get_array_str(l_cfg, "general", "seed_nodes_aliases", - &l_net_pvt->seed_aliases_count); - if (l_net_pvt->seed_aliases_count) - l_net_pvt->seed_aliases = DAP_NEW_Z_SIZE(char*, sizeof(char*) * l_net_pvt->seed_aliases_count); - for(size_t i = 0; i < l_net_pvt->seed_aliases_count; i++) - l_net_pvt->seed_aliases[i] = dap_strdup(l_seed_aliases[i]); - // randomize seed nodes list - for (int j = l_net_pvt->seed_aliases_count - 1; j > 0; j--) { - short n = dap_random_uint16() % j; - char *tmp = l_net_pvt->seed_aliases[n]; - l_net_pvt->seed_aliases[n] = l_net_pvt->seed_aliases[j]; - l_net_pvt->seed_aliases[j] = tmp; - } - uint16_t l_seed_nodes_addrs_len =0; char ** l_seed_nodes_addrs = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_addrs" ,&l_seed_nodes_addrs_len); @@ -2228,12 +2173,12 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10); log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them", - l_net_pvt->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len ); - PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_aliases_count * sizeof(struct in_addr)); - PVT(l_net)->seed_nodes_addrs = DAP_NEW_SIZE(uint64_t, l_net_pvt->seed_aliases_count * sizeof(uint64_t)); - PVT(l_net)->seed_nodes_ports = DAP_NEW_SIZE(uint16_t, l_net_pvt->seed_aliases_count * sizeof(uint16_t)); + l_net_pvt->seed_nodes_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len ); + PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_nodes_count * sizeof(struct in_addr)); + PVT(l_net)->seed_nodes_addrs = DAP_NEW_SIZE(uint64_t, l_net_pvt->seed_nodes_count * sizeof(uint64_t)); + PVT(l_net)->seed_nodes_ports = DAP_NEW_SIZE(uint16_t, l_net_pvt->seed_nodes_count * sizeof(uint16_t)); // save new nodes from cfg file to db - for ( size_t i = 0; i < PVT(l_net)->seed_aliases_count && + for ( size_t i = 0; i < PVT(l_net)->seed_nodes_count && i < l_seed_nodes_addrs_len && ( ( l_seed_nodes_ipv4_len && i < l_seed_nodes_ipv4_len ) || @@ -2243,12 +2188,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) dap_chain_node_addr_t l_seed_node_addr = { 0 }; dap_chain_node_info_t l_node_info = { 0 }; - log_it(L_NOTICE, "Check alias %s in db", l_net_pvt->seed_aliases[i]); - snprintf(l_node_info.hdr.alias,sizeof (l_node_info.hdr.alias),"%s", PVT(l_net)->seed_aliases[i]); - if (dap_chain_node_addr_from_str(&l_seed_node_addr, l_seed_nodes_addrs[i])) { - log_it(L_ERROR,"Wrong address format, must be 0123::4567::89AB::CDEF"); - continue; - } if (l_seed_nodes_ipv4_len) inet_pton(AF_INET, l_seed_nodes_ipv4[i], &l_node_info.hdr.ext_addr_v4); if (l_seed_nodes_ipv6_len) @@ -2261,6 +2200,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) if (l_seed_nodes_hostnames_len) { struct sockaddr l_sa = {}; log_it(L_DEBUG, "Resolve %s addr", l_seed_nodes_hostnames[i]); + // TODO add IPv6 support int l_ret_code = dap_net_resolve_host(l_seed_nodes_hostnames[i], AF_INET, &l_sa); if (l_ret_code == 0) { struct in_addr *l_res = (struct in_addr *)&l_sa; @@ -2271,6 +2211,13 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) log_it(L_ERROR, "%s", gai_strerror(l_ret_code)); } } + // randomize seed nodes list + for (int j = l_net_pvt->seed_nodes_count - 1; j > 0; j--) { + short n = dap_random_uint16() % j; + struct in_addr tmp = l_net_pvt->seed_nodes_addrs_v4[n]; + l_net_pvt->seed_nodes_addrs_v4[n] = l_net_pvt->seed_nodes_addrs_v4[j]; + l_net_pvt->seed_nodes_addrs_v4[j] = tmp; + } } dap_chain_net_node_list_init(); @@ -2299,20 +2246,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) DAP_DELETE(l_bootstrap_name); } - const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto"); - if (!dap_strcmp(l_node_addr_type, "static")) { - const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr", - dap_config_get_item_str(l_cfg, "general", "node-alias")); - if (l_node_alias_str) { - dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str); - if (!l_alias_addr) - dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr); - } else - log_it(L_ERROR, "Can't read alias for node address from config"); - - } else if (dap_strcmp(l_node_addr_type, "auto")) - log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'"); - l_net_pvt->node_info = dap_chain_node_info_read(l_net, &g_node_addr); if ( !l_net_pvt->node_info ) { // If not present - create it l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t); @@ -2337,7 +2270,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) } log_it(L_NOTICE, "Net load information: node_addr " NODE_ADDR_FP_STR ", balancers links %u, cell_id 0x%016"DAP_UINT64_FORMAT_X, NODE_ADDR_FP_ARGS_S(g_node_addr), - l_net_pvt->seed_aliases_count, + l_net_pvt->seed_nodes_count, l_net_pvt->node_info->hdr.cell_id.uint64); /* *** Chains init by configs *** */ @@ -2513,9 +2446,6 @@ int s_net_load(dap_chain_net_t *a_net) log_it (L_NOTICE, "Initialized chain files"); } - if (l_chain->callback_created) - l_chain->callback_created(l_chain, l_cfg); - l_chain = l_chain->next; } // Process thresholds if any @@ -2592,9 +2522,6 @@ int s_net_load(dap_chain_net_t *a_net) l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false); // Init GlobalDB clusters for mempool, service and nodes (with aliases) - l_net->pub.gdb_groups_prefix = dap_strdup( - dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix", - dap_config_get_item_str(l_cfg, "general", "name"))); // Zerochain mempool cluster char *l_gdb_mempool_mask = dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, l_net->pub.chains->name); l_net_pvt->zerochain_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(), @@ -2654,6 +2581,25 @@ int s_net_load(dap_chain_net_t *a_net) dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->nodes_cluster); DAP_DELETE(l_gdb_mempool_mask); + DL_FOREACH(l_net->pub.chains, l_chain) + if (l_chain->callback_created) + l_chain->callback_created(l_chain, l_cfg); + + // TODO rework alias concept + const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto"); + if (!dap_strcmp(l_node_addr_type, "static")) { + const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr", + dap_config_get_item_str(l_cfg, "general", "node-alias")); + if (l_node_alias_str) { + dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str); + if (!l_alias_addr) + dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr); + } else + log_it(L_ERROR, "Can't read alias for node address from config"); + + } else if (dap_strcmp(l_node_addr_type, "auto")) + log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'"); + uint32_t l_timeout = dap_config_get_item_uint32_default(g_config, "node_client", "timer_update_states", 600); PVT(l_net)->main_timer = dap_interval_timer_create(l_timeout * 1000, s_main_timer_callback, l_net); log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name); @@ -2916,59 +2862,12 @@ dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net) return PVT(l_net)->node_info ? &PVT(l_net)->node_info->hdr.cell_id: 0; } - -/** - * Get nodes list (list of dap_chain_node_addr_t struct) - */ -dap_list_t* dap_chain_net_get_link_node_list(dap_chain_net_t * l_net, bool a_is_only_cur_cell) -{ - dap_list_t *l_node_list = NULL; - // get cur node address - dap_chain_node_addr_t l_cur_node_addr = { 0 }; - l_cur_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); - - dap_chain_node_info_t *l_cur_node_info = dap_chain_node_info_read(l_net, &l_cur_node_addr); - // add links to nodes list only from the same cell - if(l_cur_node_info) { - for(unsigned int i = 0; i < l_cur_node_info->hdr.links_number; i++) { - bool l_is_add = true; - dap_chain_node_addr_t *l_remote_address = l_cur_node_info->links + i; - if(a_is_only_cur_cell) { - // get remote node list - dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(l_net, l_remote_address); - if(!l_remote_node_info || l_remote_node_info->hdr.cell_id.uint64 != l_cur_node_info->hdr.cell_id.uint64) - l_is_add = false; - if (l_remote_node_info) - DAP_DELETE(l_remote_node_info); - } - if(l_is_add) { - dap_chain_node_addr_t *l_address = DAP_NEW_Z(dap_chain_node_addr_t); - if (!l_address) { - log_it(L_CRITICAL, "Memory allocation error"); - return NULL; - } - l_address->uint64 = l_cur_node_info->links[i].uint64; - l_node_list = dap_list_append(l_node_list, l_address); - } - } - DAP_DELETE(l_cur_node_info); - } - return l_node_list; -} - /** * Get remote nodes list (list of dap_chain_node_addr_t struct) */ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net) { dap_list_t *l_node_list = NULL; - /* - dap_chain_net_pvt_t *l_net_pvt = PVT(l_net); - // get nodes from seed_nodes - for(uint16_t i = 0; i < l_net_pvt->seed_aliases_count; i++) { - dap_chain_node_addr_t *l_node_address = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i]); - l_node_list = dap_list_append(l_node_list, l_node_address); - }*/ // get nodes list from global_db dap_global_db_obj_t *l_objs = NULL; @@ -2998,10 +2897,8 @@ dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net) { dap_list_t *l_node_list = NULL; dap_chain_net_pvt_t *l_pvt_net = PVT(a_net); - for(size_t i=0; i < l_pvt_net->seed_aliases_count;i++) - { + for (size_t i = 0; i < l_pvt_net->seed_nodes_count; i++) l_node_list = dap_list_append(l_node_list, &l_pvt_net->seed_nodes_addrs_v4[i]); - } return l_node_list; } @@ -3028,24 +2925,6 @@ bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net) return PVT(a_net)->flags &F_DAP_CHAIN_NET_SYNC_FROM_ZERO ; } -/** - * @brief dap_chain_net_get_extra_gdb_group - * @param a_net - * @param a_node_addr - * @return - */ -bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr) -{ - if (!a_net || !PVT(a_net)->gdb_sync_nodes_addrs) - return false; - for(uint16_t i = 0; i < PVT(a_net)->gdb_sync_nodes_addrs_count; i++) { - if(a_node_addr.uint64 == PVT(a_net)->gdb_sync_nodes_addrs[i].uint64) { - return true; - } - } - return false; -} - void dap_chain_net_proc_mempool(dap_chain_net_t *a_net) { dap_chain_t *l_chain; diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 0dd8131330e0554c1c60b168d11e86e96e9c352f..c355d6015e1bcb29c480853df42b8484350d3182 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -99,8 +99,8 @@ static uint64_t min_count_blocks_events(dap_global_db_obj_t * a_objs,size_t a_no } for (dap_list_t *node_i = a_node_addr_list; node_i; node_i = node_i->next) { if(((struct in_addr*)node_i->data)->s_addr == l_node_cand->hdr.ext_addr_v4.s_addr) { - if (!l_blocks_events || l_blocks_events > l_node_cand->hdr.blocks_events) - l_blocks_events = l_node_cand->hdr.blocks_events; + if (!l_blocks_events || l_blocks_events > l_node_cand->info.atoms_count) + l_blocks_events = l_node_cand->info.atoms_count; break; } } @@ -142,7 +142,7 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands dap_chain_node_info_t *l_node_list = (dap_chain_node_info_t *)node_i->data; if(l_node_list->hdr.address.uint64 == l_node_cand->hdr.address.uint64) { - // if(l_node_cand->hdr.blocks_events >= l_blocks_events/2) + // if(l_node_cand->info.atoms_count >= l_blocks_events/2) // { dap_chain_node_info_t * l_node_info = DAP_NEW_Z( dap_chain_node_info_t); *l_node_info = *l_node_cand; @@ -163,7 +163,7 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands { dap_chain_node_info_t *l_node_cand = (dap_chain_node_info_t *)l_objs[i].value; if(!is_it_node_from_list(l_node_addr_list, l_node_cand)){ - if(l_node_cand->hdr.blocks_events >= l_blocks_events){ + if(l_node_cand->info.atoms_count >= l_blocks_events){ if(dap_chain_net_balancer_handshake(l_node_cand,l_net)){ dap_chain_net_balancer_set_link_list(l_node_cand,l_net->pub.name); } @@ -185,8 +185,8 @@ static int callback_compare_node_list(dap_list_t *a_item1, dap_list_t *a_item2) return 0; } - return l_item1->hdr.links_number == l_item2->hdr.links_number - ? 0 : l_item1->hdr.links_number > l_item2->hdr.links_number ? 1 : -1; + return l_item1->info.links_number == l_item2->info.links_number + ? 0 : l_item1->info.links_number > l_item2->info.links_number ? 1 : -1; } dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name,uint16_t a_links_need) @@ -235,7 +235,7 @@ dap_chain_net_node_balancer_t *s_balancer_issue_link(const char *a_net_name, uin dap_chain_node_info_t * l_node_info = (dap_chain_node_info_t *)l_link_full_node_list->nodes_info; for(size_t i=0;i<l_link_full_node_list->count_node;i++) { - log_it(L_DEBUG, "Network balancer issues ip %s, [%ld blocks]",inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->hdr.blocks_events); + log_it(L_DEBUG, "Network balancer issues ip %s, [%ld blocks]",inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->info.atoms_count); } return l_link_full_node_list; diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c index 025f7256a50ac5ed7e8681e89eb5a61ebaac1179..8e01e8dec2f8b945584346d4c5005f289e58d499 100644 --- a/modules/net/dap_chain_net_node_list.c +++ b/modules/net/dap_chain_net_node_list.c @@ -78,7 +78,6 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple, dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str); dap_chain_node_info_t l_node_info = { .hdr.address.uint64 = addr, - .hdr.owner_address.uint64 = dap_chain_net_get_cur_addr_int(l_net), .hdr.ext_addr_v4.s_addr = ipv4, .hdr.ext_port = port }; @@ -105,14 +104,13 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple, if(response) { size_t l_node_info_size = dap_chain_node_info_get_size(&l_node_info); - bool res = dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, (uint8_t*)&l_node_info, l_node_info_size, true) == 0; + bool res = dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, (uint8_t*)&l_node_info, l_node_info_size, false) == 0; if(res) { char l_node_addr_str[INET_ADDRSTRLEN]={}; inet_ntop(AF_INET, &l_node_info.hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); - log_it(L_DEBUG, "Add address"NODE_ADDR_FP_STR" (%s) to node list by "NODE_ADDR_FP_STR"", - NODE_ADDR_FP_ARGS_S(l_node_info.hdr.address),l_node_addr_str, - NODE_ADDR_FP_ARGS_S(l_node_info.hdr.owner_address)); + log_it(L_DEBUG, "Add address"NODE_ADDR_FP_STR" (%s) to node list", + NODE_ADDR_FP_ARGS_S(l_node_info.hdr.address),l_node_addr_str); response = 1; } else @@ -267,29 +265,19 @@ static void s_node_list_callback_notify(dap_global_db_instance_t *a_dbi, dap_sto if (!dap_strcmp(a_obj->group, l_net->pub.gdb_nodes)) { if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) { dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *)a_obj->value; + size_t l_size_obj = dap_chain_node_info_get_size(l_node_info); + if (l_size_obj_need == l_size_obj) { + char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' }; + inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN); + inet_ntop(AF_INET6, &l_node_info->hdr.ext_addr_v6, l_node_ipv6_str, INET6_ADDRSTRLEN); + char l_ts[128] = { '\0' }; + dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), a_obj->timestamp); - size_t l_size_obj = (a_obj->value_len - (l_node_info->hdr.links_number * sizeof(dap_chain_node_addr_t))); - if(l_size_obj_need == l_size_obj) - { - if(l_node_info->hdr.owner_address.uint64 == 0){ - log_it(L_NOTICE, "Node %s removed, there is not pinners", a_obj->key); - dap_global_db_del_sync(a_obj->group, a_obj->key); - } else { - char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' }; - inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN); - inet_ntop(AF_INET6, &l_node_info->hdr.ext_addr_v6, l_node_ipv6_str, INET6_ADDRSTRLEN); - char l_ts[128] = { '\0' }; - dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), a_obj->timestamp); - - log_it(L_MSG, "Add node "NODE_ADDR_FP_STR" %s %s, pinned by "NODE_ADDR_FP_STR" at %s\n", - NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address), - l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port), - NODE_ADDR_FP_ARGS_S(l_node_info->hdr.owner_address), - l_ts); - } - } - else - { + log_it(L_MSG, "Add node "NODE_ADDR_FP_STR" %s %s at %s\n", + NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address), + l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port), + l_ts); + } else { dap_global_db_del_sync(a_obj->group, a_obj->key); log_it(L_NOTICE, "Wrong size! data size %lu need - (%lu) %s removed ",l_size_obj, l_size_obj_need, a_obj->key); diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index ed40377c87acd91e8eb0c242ae1ef80f6d89eaa8..6519c1026c9ea6c68c45410b142ef0b17710cdbc 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -68,7 +68,7 @@ dap_chain_node_addr_t *dap_chain_node_alias_find(dap_chain_net_t *a_net, const c size_t l_addr_size =0; dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases, a_alias, &l_addr_size, NULL, NULL); - if (l_addr_size != sizeof(dap_chain_node_addr_t)) { + if (l_addr && l_addr_size != sizeof(dap_chain_node_addr_t)) { log_it(L_WARNING, "Address in database is corrupted for alias %s", a_alias); DAP_DELETE(l_addr); return NULL; @@ -84,16 +84,6 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias) return dap_global_db_del_sync(a_net->pub.gdb_nodes_aliases, a_alias) == 0; } -/** - * Calculate size of struct dap_chain_node_info_t - */ -size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info) -{ - if(!node_info) - return 0; - return (sizeof(dap_chain_node_info_t) + node_info->hdr.links_number * sizeof(dap_chain_node_addr_t)); -} - /** * Compare addresses of two dap_chain_node_info_t structures * @@ -148,17 +138,17 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_chain_node_addr_t *l_address) { char *l_key = dap_chain_node_addr_to_hash_str(l_address); - if(!l_key) { + if (!l_key) { log_it(L_WARNING,"Can't calculate hash of addr"); return NULL; } size_t node_info_size = 0; dap_chain_node_info_t *l_node_info; // read node - l_node_info = (dap_chain_node_info_t *) dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key, &node_info_size, NULL, NULL); + l_node_info = (dap_chain_node_info_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key, &node_info_size, NULL, NULL); - if(!l_node_info) { - log_it(L_INFO, "node with key %s (addr " NODE_ADDR_FP_STR ") not found in base",l_key, NODE_ADDR_FP_ARGS(l_address)); + if (!l_node_info) { + log_it(L_NOTICE, "Node with address %s not found in base", l_key); DAP_DELETE(l_key); return NULL; } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 7584b9baa87fff718b072f8aad93952fb9bf121f..23bc259eee04eb7912f797b2de21bbe4c9642fb9 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -360,126 +360,6 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info return -1; } - -/** - * @brief link_add_or_del_with_reply - * Handler of command 'global_db node link' - * cmd 'add' or 'del' - * str_reply[out] for reply - * return 0 Ok, -1 error - * @param a_net - * @param a_node_info - * @param cmd - * @param a_alias_str - * @param link - * @param a_str_reply - * @return int - */ -static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, const char *cmd, - const char *a_alias_str, - dap_chain_node_addr_t *link, char **a_str_reply) -{ - if(!a_node_info->hdr.address.uint64 && !a_alias_str) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "addr not found"); - return -1; - } - if(!link->uint64) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "link not found"); - return -1; - } - // TODO check the presence of link in the node base -#ifdef DAP_CHAIN_NODE_CHECK_PRESENSE - dap_cli_server_cmd_set_reply_text(a_str_reply, "node 0x%016llx not found in base", link->uint64); - return -1; -#endif - - // find addr by alias or addr_str - dap_chain_node_addr_t *l_address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, a_alias_str); - if(!l_address) { - dap_cli_server_cmd_set_reply_text(a_str_reply, "alias not found"); - return -1; - } - - dap_chain_node_info_t * l_node_info_read = node_info_read_and_reply(a_net, l_address, a_str_reply); - size_t l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read); - if(!l_node_info_read) - return -1; - - int cmd_int = 0; - if(!strcmp(cmd, "add")) - cmd_int = 1; - else if(!strcmp(cmd, "del")) - cmd_int = 2; - - // find link in node_info_read - int index_link = -1; - for(size_t i = 0; i < l_node_info_read->hdr.links_number; i++) { - if(l_node_info_read->links[i].uint64 == link->uint64) { - // link already present - index_link = (int) i; - break; - } - } - bool res_successful = false; // is successful whether add/del - // add link - if(cmd_int == 1) { - if(index_link == -1) { - l_node_info_read->hdr.links_number++; - l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read); - l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size); - l_node_info_read->links[l_node_info_read->hdr.links_number-1] = *link; - res_successful = true; - } - } - // delete link - else if(cmd_int == 2) { - // move link list to one item prev - if(index_link >= 0) { - for(unsigned int j = (unsigned int) index_link; j < (l_node_info_read->hdr.links_number - 1); j++) { - l_node_info_read->links[j] = l_node_info_read->links[j + 1]; - } - l_node_info_read->hdr.links_number--; - res_successful = true; - l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size -= sizeof(*link)); - } - } - // save edited node_info - if(res_successful) { - bool res = true; //node_info_save_and_reply(a_net, l_node_info_read, a_str_reply); - if(res) { - res_successful = true; - if(cmd_int == 1) - dap_cli_server_cmd_set_reply_text(a_str_reply, "link added"); - if(cmd_int == 2) - dap_cli_server_cmd_set_reply_text(a_str_reply, "link deleted"); - } - else { - res_successful = false; - } - } - else { - if(cmd_int == 1) { - if(index_link >= 0) - dap_cli_server_cmd_set_reply_text(a_str_reply, "link not added because it is already present"); - else - dap_cli_server_cmd_set_reply_text(a_str_reply, "link not added"); - } - if(cmd_int == 2) { - if(index_link == -1) - dap_cli_server_cmd_set_reply_text(a_str_reply, "link not deleted because not found"); - else - dap_cli_server_cmd_set_reply_text(a_str_reply, "link not deleted"); - } - } - - DAP_DELETE(l_address); - DAP_DELETE(l_node_info_read); - if(res_successful) - return 0; - return -1; -} - - /** * @brief node_info_dump_with_reply Handler of command 'node dump' * @param a_net @@ -616,10 +496,9 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add char l_ts[128] = { '\0' }; dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), l_objs[i].timestamp); - dap_string_append_printf(l_string_reply, NODE_ADDR_FP_STR" %-20s%-8s"NODE_ADDR_FP_STR" %-32s\n", + dap_string_append_printf(l_string_reply, NODE_ADDR_FP_STR" %-20s%-8s %-32s\n", NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address), l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port), - NODE_ADDR_FP_ARGS_S(l_node_info->hdr.owner_address), l_ts); // get aliases in form of string @@ -1143,7 +1022,7 @@ static dap_tsd_t* s_chain_node_cli_com_node_create_tsd_addr(char **a_argv, int a int com_node(int a_argc, char ** a_argv, char **a_str_reply) { enum { - CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER, + CMD_NONE, CMD_ADD, CMD_DEL, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER, CMD_BAN, CMD_UNBAN, CMD_BANLIST }; int arg_index = 1; @@ -1153,13 +1032,8 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) } else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "del", NULL)) { cmd_num = CMD_DEL; - } - else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "link", NULL)) { - cmd_num = CMD_LINK; - } - else - // find add parameter ('alias' or 'handshake') - if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "handshake", NULL)) { + } // find add parameter ('alias' or 'handshake') + else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "handshake", NULL)) { cmd_num = CMD_HANDSHAKE; } else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "connect", NULL)) { @@ -1173,11 +1047,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "connections", NULL)) { cmd_num = CMD_CONNECTIONS; -// char *l_str = NULL; -// dap_stream_connections_print(&l_str); -// dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str); -// DAP_DELETE(l_str); -// return 0; } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index+1), "ban", NULL)) { cmd_num = CMD_BAN; } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index+1), "unban", NULL)) { @@ -1217,7 +1086,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_addr_t l_link = { 0 }; dap_chain_node_info_t *l_node_info = NULL; size_t l_node_info_size = sizeof(l_node_info->hdr) + sizeof(l_link); - if(cmd_num >= CMD_ADD && cmd_num <= CMD_LINK) { + if(cmd_num >= CMD_ADD && cmd_num <= CMD_DEL) { l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size); if (!l_node_info) { log_it(L_CRITICAL, "Memory allocation error"); @@ -1301,25 +1170,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) DAP_DELETE(l_node_info); return l_ret; } - case CMD_LINK: - if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "add", NULL)) { - // handler of command 'node link add -addr <node address> -link <node address>' - int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "add", alias_str, &l_link, a_str_reply); - DAP_DELETE(l_node_info); - return l_ret; - } - else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "del", NULL)) { - // handler of command 'node link del -addr <node address> -link <node address>' - int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "del", alias_str, &l_link, a_str_reply); - DAP_DELETE(l_node_info); - return l_ret; - } - else { - dap_cli_server_cmd_set_reply_text(a_str_reply, "command not recognize, supported format:\n" - "global_db node link <add|del] [-addr <node address> | -alias <node alias>] -link <node address>"); - DAP_DELETE(l_node_info); - return -1; - } case CMD_DUMP: { // handler of command 'node dump' @@ -1379,13 +1229,10 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) // get cur node links bool a_is_only_cur_cell = false; - dap_list_t *l_node_link_list = dap_chain_net_get_link_node_list(l_net, a_is_only_cur_cell); + // TODO rewrite this command totally + // dap_list_t *l_node_link_list = dap_chain_net_get_link_node_list(l_net, a_is_only_cur_cell); // get all nodes list if no links - if(!l_node_link_list) - l_node_list = dap_chain_net_get_node_list(l_net); - else - l_node_list = dap_list_concat(l_node_link_list, l_node_list); - + l_node_list = dap_chain_net_get_node_list(l_net); // select random node from the list l_nodes_count = dap_list_length(l_node_list); if(l_nodes_count > 0) { @@ -1726,7 +1573,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_string_append_printf(l_string_balanc, "node address "NODE_ADDR_FP_STR" \tipv4 %s \tnumber of links %u\n", NODE_ADDR_FP_ARGS_S(l_node_link->hdr.address), inet_ntoa(l_node_link->hdr.ext_addr_v4), - l_node_link->hdr.links_number); + l_node_link->info.links_number); } dap_cli_server_cmd_set_reply_text(a_str_reply, "Balancer link list:\n %s \n", l_string_balanc->str); diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index e11cb0e92c0d7e811cfffcf83c00f83697f3b59f..f339ea1f7a4ec2f868dc744c66d4a462748f8ab0 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -31,19 +31,22 @@ #include "dap_chain.h" typedef struct dap_chain_net dap_chain_net_t; + typedef struct dap_chain_node_info { struct { - dap_chain_node_addr_t address; + dap_chain_node_addr_t address; dap_chain_cell_id_t cell_id; - uint32_t links_number; struct in_addr ext_addr_v4; struct in6_addr ext_addr_v6; uint16_t ext_port; // Port thats node listening - char alias[240]; - dap_chain_node_addr_t owner_address; - uint64_t blocks_events; /* truncated alias len */ } DAP_ALIGN_PACKED hdr; - dap_chain_node_addr_t links[]; // dap_chain_addr_t + struct { + uint64_t atoms_count; /* truncated alias len */ + uint32_t links_number; + byte_t other_info_for_future[240]; + } DAP_ALIGN_PACKED info; + uint16_t alias_len; + byte_t alias[]; } DAP_ALIGN_PACKED dap_chain_node_info_t; typedef dap_stream_node_addr_t dap_chain_node_addr_t; @@ -54,7 +57,12 @@ typedef dap_stream_node_addr_t dap_chain_node_addr_t; /** * Calculate size of struct dap_chain_node_info_t */ -size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info); +DAP_STATIC_INLINE size_t dap_chain_node_info_get_size(dap_chain_node_info_t *a_node_info) +{ + if (!a_node_info) + return 0; + return (sizeof(dap_chain_node_info_t) + a_node_info->alias_len); +} /** * Compare addresses of two dap_chain_node_info_t structures @@ -82,9 +90,9 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias); int dap_chain_node_info_save(dap_chain_net_t * l_net,dap_chain_node_info_t *node_info); dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_net_t * l_net, dap_chain_node_addr_t *address); -inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *address) +inline static char *dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *a_address) { - return dap_hash_fast_str_new((const uint8_t*) address, sizeof(dap_chain_node_addr_t)); + return dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_address)); } bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum);