Sfoglia il codice sorgente

bin/darkfid: DEP-0007: add network profiles to net setting section of darkfid toml config, retrieve outbound_connect_timeout from network profiles

oars 1 anno fa
parent
commit
a7d5d02fb7

+ 222 - 121
bin/darkfid/darkfid_config.toml

@@ -70,6 +70,50 @@ p2p_datastore = "~/.local/share/darkfi/darkfid/testnet"
 # Path to a configured hostlist for saving known peers
 hostlist = "~/.local/share/darkfi/darkfid/testnet/p2p_hostlist.tsv"
 
+# Outbound connection slots number, this many connections will be
+# attempted. (This does not include manual connections)
+outbound_connections = 8
+
+# Inbound connections slots number, this many active inbound connections
+# will be allowed. (This does not include manual or outbound connections)
+#inbound_connections = 0
+
+# Manual connections retry limit, 0 for forever looping
+#manual_attempt_limit = 0
+
+# Allow localnet hosts
+localnet = false
+
+# Cooling off time for peer discovery when unsuccessful
+#outbound_peer_discovery_cooloff_time = 30
+
+# Time between peer discovery attempts
+#outbound_peer_discovery_attempt_time = 5
+
+# Whitelisted network transports for outbound connections
+active_profiles = ["tor"]
+
+# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
+# if tcp is added to mixed_profiles and tor is added to active_profiles)
+#mixed_profiles = []
+
+# Tor Socks5 proxy
+#tor_socks5_proxy = "socks5://127.0.0.1:9050"
+
+# Nym Socks5 proxy
+#nym_socks5_proxy = "socks5://127.0.0.1:1080"
+
+# I2p Socks5 proxy
+#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
+
+[network_config."testnet".net.profiles."tcp+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+seeds = ["tcp+tls://lilith0.dark.fi:8342", "tcp+tls://lilith1.dark.fi:8342"]
+
+# Peer nodes to manually connect to
+#peers = []
+
 # P2P accept addresses the instance listens on for inbound connections
 # You can also use an IPv6 address
 #inbound = ["tcp+tls://0.0.0.0:8342"]
@@ -87,61 +131,67 @@ hostlist = "~/.local/share/darkfi/darkfid/testnet/p2p_hostlist.tsv"
 # Combined:
 #external_addrs = ["tcp+tls://XXX.XXX.XXX.XXX:8342", "tcp+tls://[ipv6 address here]:8342"]
 
-# Peer nodes to manually connect to
-#peers = []
-
+[network_config."testnet".net.profiles."tor"]
 # Seed nodes to connect to for peer discovery and/or adversising our
 # own external addresses
-seeds = ["tcp+tls://lilith0.dark.fi:8342", "tcp+tls://lilith1.dark.fi:8342"]
-#seeds = [
-#    "tor://g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:8343",
-#    "tor://yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:8343",
-#]
-
-# Whitelisted network transports for outbound connections
-allowed_transports = ["tcp+tls"]
-
-# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
-# if tcp is added to mixed_transports and tor is added to allowed_transports)
-#mixed_transports = []
+seeds = [
+    "tor://g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:8343",
+    "tor://yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:8343",
+]
 
-# Tor Socks5 proxy
-#tor_socks5_proxy = "socks5://127.0.0.1:9050"
+# Peer nodes to manually connect to
+#peers = []
 
-# Nym Socks5 proxy
-#nym_socks5_proxy = "socks5://127.0.0.1:1080"
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tor://127.0.0.1:8342"]
 
-# I2p Socks5 proxy
-#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
+[network_config."testnet".net.profiles."i2p"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
 
-# Outbound connection slots number, this many connections will be
-# attempted. (This does not include manual connections)
-outbound_connections = 8
+# Peer nodes to manually connect to
+#peers = []
 
-# Inbound connections slots number, this many active inbound connections
-# will be allowed. (This does not include manual or outbound connections)
-#inbound_connections = 0
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tcp://127.0.0.1:25551"]
 
-# Manual connections retry limit, 0 for forever looping
-#manual_attempt_limit = 0
+# P2P external addresses the instance advertises so other peers can
+# reach us and connect to us, as long as inbound addrs are configured.
+#external_addrs = ["i2p://youraddress.b32.i2p:25551"]
 
-# Outbound connection timeout (in seconds)
-#outbound_connect_timeout = 10
+[network_config."testnet".net.profiles."socks5"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+seeds = [
+    "socks5://127.0.0.1:9050/g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:8343",
+    "socks5://127.0.0.1:9050/yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:8343",
+]
 
-# Exchange versions (handshake) timeout (in seconds)
-#channel_handshake_timeout = 4
+# Peer nodes to manually connect to
+#peers = []
 
-# Ping-pong exchange execution interval (in seconds)
-#channel_heartbeat_interval = 10
+[network_config."testnet".net.profiles."socks5+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+seeds = [
+    #"socks5+tls://127.0.0.1:9050/lilith0.dark.fi:8342",
+    #"socks5+tls://127.0.0.1:1080/lilith1.dark.fi:8342"
+]
 
-# Allow localnet hosts
-localnet = false
+# Peer nodes to manually connect to
+#peers = []
 
-# Cooling off time for peer discovery when unsuccessful
-#outbound_peer_discovery_cooloff_time = 30
+[network_config."testnet".net.profiles."tor+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+seeds = [
+    "tor+tls://lilith0.dark.fi:8342",
+    "tor+tls://lilith1.dark.fi:8342"
+]
 
-# Time between peer discovery attempts
-#outbound_peer_discovery_attempt_time = 5
+# Peer nodes to manually connect to
+#peers = []
 
 # Mainnet blockchain network configuration
 [network_config."mainnet"]
@@ -204,6 +254,56 @@ p2p_datastore = "~/.local/share/darkfi/darkfid/mainnet"
 # Path to a configured hostlist for saving known peers
 hostlist = "~/.local/share/darkfi/darkfid/mainnet/p2p_hostlist.tsv"
 
+# Outbound connection slots number, this many connections will be
+# attempted. (This does not include manual connections)
+outbound_connections = 8
+
+# Inbound connections slots number, this many active inbound connections
+# will be allowed. (This does not include manual or outbound connections)
+#inbound_connections = 0
+
+# Manual connections retry limit, 0 for forever looping
+#manual_attempt_limit = 0
+
+# Allow localnet hosts
+localnet = false
+
+# Cooling off time for peer discovery when unsuccessful
+#outbound_peer_discovery_cooloff_time = 30
+
+# Time between peer discovery attempts
+#outbound_peer_discovery_attempt_time = 5
+
+# Nodes to avoid interacting with for the duration of the program, in the
+# format ["host", ["scheme", "scheme"], [port, port]].
+# If scheme is left empty it will default to "tcp+tls".
+# If ports are left empty all ports from this peer will be blocked.
+#blacklist = [["example.com", ["tcp"], [8551, 23331]]]
+
+# Whitelisted network transports for outbound connections
+active_profiles = ["tor"]
+
+# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
+# if tcp is added to mixed_profiles and tor is added to active_profiles)
+#mixed_profiles = []
+
+# Tor Socks5 proxy
+#tor_socks5_proxy = "socks5://127.0.0.1:9050"
+
+# Nym Socks5 proxy
+#nym_socks5_proxy = "socks5://127.0.0.1:1080"
+
+# I2p Socks5 proxy
+#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
+
+[network_config."mainnet".net.profiles."tcp+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+seeds = ["tcp+tls://lilith0.dark.fi:8442", "tcp+tls://lilith1.dark.fi:8442"]
+
+# Peer nodes to manually connect to
+#peers = []
+
 # P2P accept addresses the instance listens on for inbound connections
 # You can also use an IPv6 address
 #inbound = ["tcp+tls://0.0.0.0:8442"]
@@ -221,63 +321,57 @@ hostlist = "~/.local/share/darkfi/darkfid/mainnet/p2p_hostlist.tsv"
 # Combined:
 #external_addrs = ["tcp+tls://XXX.XXX.XXX.XXX:8442", "tcp+tls://[ipv6 address here]:8442"]
 
-# Peer nodes to manually connect to
-#peers = []
-
+[network_config."mainnet".net.profiles."tor"]
 # Seed nodes to connect to for peer discovery and/or adversising our
 # own external addresses
-seeds = ["tcp+tls://lilith0.dark.fi:8442", "tcp+tls://lilith1.dark.fi:8442"]
-
-# Whitelisted network transports for outbound connections
-allowed_transports = ["tcp+tls"]
+#seeds = []
 
-# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
-# if tcp is added to mixed_transports and tor is added to allowed_transports)
-#mixed_transports = []
+# Peer nodes to manually connect to
+#peers = []
 
-# Tor Socks5 proxy
-#tor_socks5_proxy = "socks5://127.0.0.1:9050"
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tor://127.0.0.1:8442"]
 
-# Nym Socks5 proxy
-#nym_socks5_proxy = "socks5://127.0.0.1:1080"
+[network_config."mainnet".net.profiles."i2p"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
 
-# I2p Socks5 proxy
-#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
+# Peer nodes to manually connect to
+#peers = []
 
-# Outbound connection slots number, this many connections will be
-# attempted. (This does not include manual connections)
-outbound_connections = 8
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tcp://127.0.0.1:8442"]
 
-# Inbound connections slots number, this many active inbound connections
-# will be allowed. (This does not include manual or outbound connections)
-#inbound_connections = 0
+# P2P external addresses the instance advertises so other peers can
+# reach us and connect to us, as long as inbound addrs are configured.
+#external_addrs = ["i2p://youraddress.b32.i2p:8442"]
 
-# Manual connections retry limit, 0 for forever looping
-#manual_attempt_limit = 0
+[network_config."mainnet".net.profiles."socks5"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
 
-# Outbound connection timeout (in seconds)
-#outbound_connect_timeout = 10
+# Peer nodes to manually connect to
+#peers = []
 
-# Exchange versions (handshake) timeout (in seconds)
-#channel_handshake_timeout = 4
+[network_config."mainnet".net.profiles."socks5+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
 
-# Ping-pong exchange execution interval (in seconds)
-#channel_heartbeat_interval = 10
+# Peer nodes to manually connect to
+#peers = []
 
-# Allow localnet hosts
-localnet = false
+[network_config."mainnet".net.profiles."tor+tls"]
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
 
-# Cooling off time for peer discovery when unsuccessful
-#outbound_peer_discovery_cooloff_time = 30
+# Peer nodes to manually connect to
+#peers = []
 
-# Time between peer discovery attempts
-#outbound_peer_discovery_attempt_time = 5
 
-# Nodes to avoid interacting with for the duration of the program, in the
-# format ["host", ["scheme", "scheme"], [port, port]].
-# If scheme is left empty it will default to "tcp+tls".
-# If ports are left empty all ports from this peer will be blocked.
-#blacklist = [["example.com", ["tcp"], [8551, 23331]]]
 
 # Localnet blockchain network configuration
 [network_config."localnet"]
@@ -343,36 +437,6 @@ p2p_datastore = "~/.local/share/darkfi/darkfid/localnet"
 # Path to a configured hostlist for saving known peers
 hostlist = "~/.local/share/darkfi/darkfid/localnet/p2p_hostlist.tsv"
 
-# P2P accept addresses the instance listens on for inbound connections
-#inbound = ["tcp+tls://0.0.0.0:8242"]
-
-# P2P external addresses the instance advertises so other peers can
-# reach us and connect to us, as long as inbound addrs are configured.
-#external_addrs = []
-
-# Peer nodes to manually connect to
-#peers = []
-
-# Seed nodes to connect to for peer discovery and/or adversising our
-# own external addresses
-#seeds = []
-
-# Whitelisted network transports for outbound connections
-#allowed_transports = ["tcp+tls"]
-
-# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
-# if tcp is added to mixed_transports and tor is added to allowed_transports)
-#mixed_transports = []
-
-# Tor Socks5 proxy
-#tor_socks5_proxy = "socks5://127.0.0.1:9050"
-
-# Nym Socks5 proxy
-#nym_socks5_proxy = "socks5://127.0.0.1:1080"
-
-# I2p Socks5 proxy
-#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
-
 # Outbound connection slots number, this many connections will be
 # attempted. (This does not include manual connections)
 #outbound_connections = 8
@@ -390,15 +454,6 @@ hostlist = "~/.local/share/darkfi/darkfid/localnet/p2p_hostlist.tsv"
 # Manual connections retry limit, 0 for forever looping
 #manual_attempt_limit = 0
 
-# Outbound connection timeout (in seconds)
-#outbound_connect_timeout = 10
-
-# Exchange versions (handshake) timeout (in seconds)
-#channel_handshake_timeout = 4
-
-# Ping-pong exchange execution interval (in seconds)
-#channel_heartbeat_interval = 10
-
 # Allow localnet hosts
 localnet = true
 
@@ -407,3 +462,49 @@ localnet = true
 
 # Time between peer discovery attempts
 #outbound_peer_discovery_attempt_time = 5
+
+# Whitelisted network transports for outbound connections
+#active_profiles = ["tcp+tls"]
+
+# Transports you want to be mixed (e.g. Tor would be allowed to connect to `tcp://`
+# if tcp is added to mixed_profiles and tor is added to active_profiles)
+#mixed_profiles = []
+
+# Tor Socks5 proxy
+#tor_socks5_proxy = "socks5://127.0.0.1:9050"
+
+# Nym Socks5 proxy
+#nym_socks5_proxy = "socks5://127.0.0.1:1080"
+
+# I2p Socks5 proxy
+#i2p_socks5_proxy = "socks5://127.0.0.1:4447"
+
+[net.profiles."tcp+tls"]
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tcp+tls://0.0.0.0:8242"]
+
+# P2P external addresses the instance advertises so other peers can
+# reach us and connect to us, as long as inbound addrs are configured.
+#external_addrs = []
+
+# Peer nodes to manually connect to
+#peers = []
+
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []
+
+[net.profiles."tcp"]
+# P2P accept addresses the instance listens on for inbound connections
+#inbound = ["tcp://0.0.0.0:8242"]
+
+# P2P external addresses the instance advertises so other peers can
+# reach us and connect to us, as long as inbound addrs are configured.
+#external_addrs = []
+
+# Peer nodes to manually connect to
+#peers = []
+
+# Seed nodes to connect to for peer discovery and/or adversising our
+# own external addresses
+#seeds = []

+ 3 - 1
bin/darkfid/src/task/consensus.rs

@@ -69,7 +69,9 @@ pub async fn consensus_init_task(
     node.validator.consensus.generate_empty_fork().await?;
 
     // Sync blockchain
-    let comms_timeout = node.p2p_handler.p2p.settings().read().await.outbound_connect_timeout;
+    let comms_timeout =
+        node.p2p_handler.p2p.settings().read_arc().await.outbound_connect_timeout_max();
+
     let checkpoint = if !config.skip_sync {
         // Parse configured checkpoint
         if config.checkpoint_height.is_some() && config.checkpoint.is_none() {

+ 36 - 7
bin/darkfid/src/task/sync.rs

@@ -146,7 +146,6 @@ async fn synced_peers(
     checkpoint: Option<(u32, HeaderHash)>,
 ) -> HashMap<(u32, [u8; 32]), Vec<ChannelPtr>> {
     info!(target: "darkfid::task::sync::synced_peers", "Receiving tip from peers...");
-    let comms_timeout = node.p2p_handler.p2p.settings().read().await.outbound_connect_timeout;
     let mut tips = HashMap::new();
     loop {
         // Grab channels
@@ -154,6 +153,14 @@ async fn synced_peers(
 
         // Ask each peer(if we got any) if they are synced
         for peer in peers {
+            let comms_timeout = node
+                .p2p_handler
+                .p2p
+                .settings()
+                .read_arc()
+                .await
+                .outbound_connect_timeout(peer.address().scheme());
+
             // If a checkpoint was provider, we check that the peer follows that sequence
             if let Some(c) = checkpoint {
                 // Communication setup
@@ -230,6 +237,9 @@ async fn synced_peers(
         let _ = subscription.receive().await;
         subscription.unsubscribe().await;
 
+        let comms_timeout =
+            node.p2p_handler.p2p.settings().read_arc().await.outbound_connect_timeout_max();
+
         info!(target: "darkfid::task::sync::synced_peers", "Sleeping for {comms_timeout} to allow for more nodes to connect...");
         sleep(comms_timeout).await;
     }
@@ -286,7 +296,6 @@ async fn retrieve_headers(
             }
         }
     }
-    let comms_timeout = node.p2p_handler.p2p.settings().read().await.outbound_connect_timeout;
 
     // We subtract 1 since tip_height is increased by one
     let total = tip_height - last_known - 1;
@@ -322,6 +331,14 @@ async fn retrieve_headers(
                 continue
             };
 
+            let comms_timeout = node
+                .p2p_handler
+                .p2p
+                .settings()
+                .read_arc()
+                .await
+                .outbound_connect_timeout(peer.address().scheme());
+
             // Node waits for response
             let Ok(response) = response_sub.receive_with_timeout(comms_timeout).await else {
                 debug!(target: "darkfid::task::sync::retrieve_headers", "Timeout while waiting for `HeaderSyncResponse` from peer: {peer:?}");
@@ -424,7 +441,6 @@ async fn retrieve_blocks(
             }
         }
     }
-    let comms_timeout = node.p2p_handler.p2p.settings().read().await.outbound_connect_timeout;
 
     let mut received_blocks = 0;
     let total = node.validator.blockchain.headers.len_sync();
@@ -471,6 +487,14 @@ async fn retrieve_blocks(
                 continue
             };
 
+            let comms_timeout = node
+                .p2p_handler
+                .p2p
+                .settings()
+                .read_arc()
+                .await
+                .outbound_connect_timeout(peer.address().scheme());
+
             // Node waits for response
             let Ok(response) = response_sub.receive_with_timeout(comms_timeout).await else {
                 debug!(target: "darkfid::task::sync::retrieve_blocks", "Timeout while waiting for `SyncResponse` from peer: {peer:?}");
@@ -555,11 +579,16 @@ async fn sync_best_fork(node: &DarkfiNodePtr, peers: &[ChannelPtr], last_tip: &H
         return
     };
 
-    // Node waits for response
-    let Ok(response) = response_sub
-        .receive_with_timeout(node.p2p_handler.p2p.settings().read().await.outbound_connect_timeout)
+    let comms_timeout = node
+        .p2p_handler
+        .p2p
+        .settings()
+        .read_arc()
         .await
-    else {
+        .outbound_connect_timeout(peer.address().scheme());
+
+    // Node waits for response
+    let Ok(response) = response_sub.receive_with_timeout(comms_timeout).await else {
         debug!(target: "darkfid::task::sync::sync_best_fork", "Timeout while waiting for `ForkSyncResponse` from peer: {peer:?}");
         return
     };

+ 14 - 16
bin/darkfid/src/task/unknown_proposal.rs

@@ -141,11 +141,11 @@ async fn handle_unknown_proposal(
         return true
     };
 
+    let comms_timeout =
+        p2p.settings().read_arc().await.outbound_connect_timeout(channel.address().scheme());
+
     // Node waits for response
-    let response = match response_sub
-        .receive_with_timeout(p2p.settings().read().await.outbound_connect_timeout)
-        .await
-    {
+    let response = match response_sub.receive_with_timeout(comms_timeout).await {
         Ok(r) => r,
         Err(e) => {
             debug!(target: "darkfid::task::handle_unknown_proposal", "Asking peer for fork sequence failed: {e}");
@@ -252,11 +252,10 @@ async fn handle_reorg(
             return true
         };
 
+        let comms_timeout =
+            p2p.settings().read_arc().await.outbound_connect_timeout(channel.address().scheme());
         // Node waits for response
-        let response = match response_sub
-            .receive_with_timeout(p2p.settings().read().await.outbound_connect_timeout)
-            .await
-        {
+        let response = match response_sub.receive_with_timeout(comms_timeout).await {
             Ok(r) => r,
             Err(e) => {
                 debug!(target: "darkfid::task::handle_reorg", "Asking peer for header hash failed: {e}");
@@ -364,11 +363,10 @@ async fn handle_reorg(
             return true
         };
 
+        let comms_timeout =
+            p2p.settings().read_arc().await.outbound_connect_timeout(channel.address().scheme());
         // Node waits for response
-        let response = match response_sub
-            .receive_with_timeout(p2p.settings().read().await.outbound_connect_timeout)
-            .await
-        {
+        let response = match response_sub.receive_with_timeout(comms_timeout).await {
             Ok(r) => r,
             Err(e) => {
                 debug!(target: "darkfid::task::handle_reorg", "Asking peer for headers sequence failed: {e}");
@@ -526,11 +524,11 @@ async fn handle_reorg(
             return true
         };
 
+        let comms_timeout =
+            p2p.settings().read_arc().await.outbound_connect_timeout(channel.address().scheme());
+
         // Node waits for response
-        let response = match response_sub
-            .receive_with_timeout(p2p.settings().read().await.outbound_connect_timeout)
-            .await
-        {
+        let response = match response_sub.receive_with_timeout(comms_timeout).await {
             Ok(r) => r,
             Err(e) => {
                 debug!(target: "darkfid::task::handle_reorg", "Asking peer for proposals sequence failed: {e}");