diff --git a/dap_chain_net.c b/dap_chain_net.c
index 15685e50d31c6af6a86919f11113298bc2b7b545..acb59dc6fd92ca667eeaf3cda8f25c57ab3d7d31 100755
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -56,6 +56,8 @@
 #include "dap_file_utils.h"
 #include "dap_config.h"
 #include "dap_hash.h"
+#include "dap_cert.h"
+#include "dap_chain_common.h"
 #include "dap_chain_net.h"
 #include "dap_chain_node_client.h"
 #include "dap_chain_node_cli.h"
@@ -1300,9 +1302,63 @@ int s_net_load(const char * a_net_name)
         char ** l_seed_nodes_port = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_port"
                                                                      ,&l_seed_nodes_port_len);
 
-        //const char * l_node_ipv4_str = dap_config_get_item_str(l_cfg , "general" ,"node-ipv4");
-        const char * l_node_addr_str = dap_config_get_item_str(l_cfg , "general" ,"node-addr");
-        const char * l_node_alias_str = dap_config_get_item_str(l_cfg , "general" , "node-alias");
+        const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto");
+
+        const char * l_node_addr_str = NULL;
+        const char * l_node_alias_str = NULL;
+
+        // use unique addr from pub key
+        if(!dap_strcmp(l_node_addr_type, "auto")) {
+            size_t l_pub_key_data_size = 0;
+            uint8_t *l_pub_key_data = NULL;
+
+            // read pub key
+            l_pub_key_data = dap_chain_global_db_gr_get("cur-node-addr-pkey", &l_pub_key_data_size, GROUP_LOCAL_NODE_ADDR);
+            // generate new pub key
+            if(!l_pub_key_data || !l_pub_key_data_size){
+
+                const char * l_certs_name_str = "node-addr";
+                dap_cert_t ** l_certs = NULL;
+                size_t l_certs_size = 0;
+                dap_cert_t * l_cert = NULL;
+                // Load certs or create if not found
+                if(!dap_cert_parse_str_list(l_certs_name_str, &l_certs, &l_certs_size)) { // Load certs
+                    const char *l_cert_folder = dap_cert_get_folder(0);
+                    // create new cert
+                    if(l_cert_folder) {
+                        char *l_cert_path = dap_strdup_printf("%s/%s.dcert", l_cert_folder, l_certs_name_str);
+                        l_cert = dap_cert_generate(l_certs_name_str, l_cert_path, DAP_ENC_KEY_TYPE_SIG_DILITHIUM);
+                        DAP_DELETE(l_cert_path);
+                    }
+                }
+                if(l_certs_size > 0)
+                    l_cert = l_certs[0];
+                if(l_cert) {
+                    l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size);
+                    // save pub key
+                    if(l_pub_key_data && l_pub_key_data_size > 0)
+                        dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), (uint8_t*) l_pub_key_data, l_pub_key_data_size,
+                        GROUP_LOCAL_NODE_ADDR);
+                }
+            }
+            // generate addr from pub_key
+            dap_chain_hash_fast_t l_hash;
+            if(l_pub_key_data_size > 0 && dap_hash_fast(l_pub_key_data, l_pub_key_data_size, &l_hash) == 1) {
+                l_node_addr_str = dap_strdup_printf("%04X::%04X::%04X::%04X",
+                        (uint16_t) *(uint16_t*) (l_hash.raw),
+                        (uint16_t) *(uint16_t*) (l_hash.raw + 2),
+                        (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 4),
+                        (uint16_t) *(uint16_t*) (l_hash.raw + DAP_CHAIN_HASH_FAST_SIZE - 2));
+            }
+            DAP_DELETE(l_pub_key_data);
+        }
+        // use static addr from setting
+        else if(!dap_strcmp(l_node_addr_type, "static")) {
+            //const char * l_node_ipv4_str = dap_config_get_item_str(l_cfg , "general" ,"node-ipv4");
+            l_node_addr_str = dap_strdup(dap_config_get_item_str(l_cfg, "general", "node-addr"));
+            l_node_alias_str = dap_config_get_item_str(l_cfg, "general", "node-alias");
+        }
+
         log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them",
                 PVT(l_net)->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
         // save new nodes from cfg file to db
@@ -1398,16 +1454,16 @@ int s_net_load(const char * a_net_name)
                     parse_succesfully = true;
                 }
                 if ( !parse_succesfully && dap_chain_node_addr_from_str(l_node_addr, l_node_addr_str) == 0) {
-                    log_it(L_DEBUG, "Parse node address with format " NODE_ADDR_FP_STR);
+                    log_it(L_DEBUG, "Parse node address with format 04hX::04hX::04hX::04hX");
                     parse_succesfully = true;
                 }
 
                 if (!parse_succesfully){
-                    log_it(L_ERROR,"Can't parse node address");
+                    log_it(L_ERROR,"Can't parse node address %s", l_node_addr_str);
                     DAP_DELETE(l_node_addr);
                     l_node_addr = NULL;
                 }
-                log_it(L_NOTICE, "Parse node addr %s successfully", l_node_addr_str);
+                log_it(L_NOTICE, "Parse node addr " NODE_ADDR_FP_STR " successfully", NODE_ADDR_FP_ARGS(l_node_addr));
                 PVT(l_net)->node_addr = l_node_addr;
                 //}
             }
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 97ae4eba1a0c6cd241639de22b76f880851cfc87..210728a87c96376cd20326001fd5bd9f78a8477b 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -991,7 +991,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
                 return -1;
             }
             // wait connected
-            int timeout_ms = 700000; //5 sec = 5000 ms
+            int timeout_ms = 7000; // 7 sec = 7000 ms
             res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
             // select new node addr
             if(l_is_auto && res){