DEP 0007: Network Profiles
status: draft
Motivation
Currently, network settings such as seeds, peers, inbound,
outbound_connection_timeout, and others are not configured per
transport.
This leads to several UX issues. For instance, it's not possible
to specify different outbound connection timeouts for different
transports. As a result, a tcp+tls connection might be forced
to use the timeout configured for a tor transport, and similar
limitations apply to other settings.
Additionally, it's easier to misconfigure the setup—for example,
a user might inadvertently connect to clearnet seeds while using
the tor transport, since all seed addresses are grouped under a single
field without transport separation.
Proposal
The current toml config for net settings looks like the following.
Note, only the parts that are proposed to be changed are shown here.
allowed_transports = ["tcp+tls"]
mixed_transports = []
inbound = ["tcp+tls://0.0.0.0:26661", "tcp+tls://[::]:26661"]
external_addrs = ["tcp+tls://my.resolveable.address:26661"]
seeds = [
"tcp+tls://lilith0.dark.fi:25551",
"tcp+tls://lilith1.dark.fi:25551",
#"tor://g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:25552",
#"tor://yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:25552",
]
peers = []
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 9
We propose introducing network profiles, allowing each supported transport to be configured individually.
active_profiles = ["tor"]
mixed_profiles = []
[net.profiles."tcp+tls"]
seeds = ["tcp+tls://lilith0.dark.fi:25551", "tcp+tls://lilith1.dark.fi:25551"]
peers = []
inbound = ["tcp+tls://0.0.0.0:26661", "tcp+tls://[::]:26661"]
external_addrs = ["tcp+tls://my.resolveable.address:26661"]
[net.profiles."tor"]
seeds = [
"tor://g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:25552",
"tor://yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:25552",
]
peers = []
inbound = ["tor://127.0.0.1:26661"]
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 90
[net.profiles."i2p"]
seeds = [
"i2p://6l2rdfriixo2nh5pr5bt555lyz56qox2ikzia4kuzm4okje7gtmq.b32.i2p:5262"
]
peers = []
inbound = ["tcp://127.0.0.1:25551"]
external_addrs = ["i2p://youraddress.b32.i2p:25551"]
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 90
[net.profiles."socks5"]
seeds = [
"socks5://127.0.0.1:9050/g7fxelebievvpr27w7gt24lflptpw3jeeuvafovgliq5utdst6xyruyd.onion:25552",
"socks5://127.0.0.1:9050/yvklzjnfmwxhyodhrkpomawjcdvcaushsj6torjz2gyd7e25f3gfunyd.onion:25552",
]
peers = []
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 90
[net.profiles."socks5+tls"]
seeds = [
#"socks5+tls://127.0.0.1:9050/lilith0.dark.fi:25551",
#"socks5+tls://127.0.0.1:1080/lilith1.dark.fi:25551"
]
peers = []
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 90
[net.profiles."tor+tls"]
seeds = [
"tor+tls://lilith0.dark.fi:25551",
"tor+tls://lilith1.dark.fi:25551"
]
peers = []
outbound_connect_timeout = 60
channel_handshake_timeout = 55
channel_heartbeat_interval = 90
[net.profiles."tcp"]
seeds = ["tcp://127.0.0.1:25551"]
peers = []
inbound = ["tcp://127.0.0.1:26661"]
external_addrs = ["tcp://127.0.0.1:26661"]
Each profile will have the following fields seeds, peers,
inbound, external_addrs, outbound_connect_timeout,
channel_handshake_timeout, channel_heartbeat_interval.
The SettingsOpt struct will be updated to include a new profiles
field of type NetworkProfileOpt. The fields in NetworProfileOpt
are moved from SettingsOpt. Additionally, the allowed_transports
field will be renamed to active_profiles, and mixed_transports
will be renamed to mixed_profiles.
#[derive(Clone, Debug, serde::Deserialize, structopt::StructOpt, structopt_toml::StructOptToml)]
#[structopt()]
pub struct SettingsOpt {
// --- REMOVED START ---
#[serde(default)]
#[structopt(long = "accept")]
pub inbound: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub external_addrs: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub peers: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub seeds: Vec<Url>,
#[structopt(skip)]
pub outbound_connect_timeout: Option<u64>,
#[structopt(skip)]
pub channel_handshake_timeout: Option<u64>,
#[structopt(skip)]
pub channel_heartbeat_interval: Option<u64>,
// --- REMOVED END ---
// --- MODIFIED START ---
#[serde(default)]
#[structopt(long = "profiles")]
pub active_profiles: Option<Vec<String>>,
#[serde(default)]
#[structopt(long = "mixed-profiles")]
pub mixed_profiles: Option<Vec<String>>,
// --- MODIFIED END ---
// --- NEWLY ADDED START ---
#[serde(default)]
#[structopt(skip)]
pub profiles: HashMap<String, NetworkProfileOpt>,
// --- NEWLY ADDED END ---
}
#[derive(Clone, Debug, serde::Deserialize, structopt::StructOpt, structopt_toml::StructOptToml)]
#[structopt()]
pub struct NetworkProfileOpt {
#[serde(default)]
#[structopt(long = "accept")]
pub inbound: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub external_addrs: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub peers: Vec<Url>,
#[serde(default)]
#[structopt(long)]
pub seeds: Vec<Url>,
#[structopt(skip)]
pub outbound_connect_timeout: Option<u64>,
#[structopt(skip)]
pub channel_handshake_timeout: Option<u64>,
#[structopt(skip)]
pub channel_heartbeat_interval: Option<u64>,
}
The Settings struct will also be updated to include a profiles
field of type NetworkProfile. The NetworkProfile struct will
correspond to and map the three fields defined in NetworkProfileOpt.
#[derive(Debug, Clone)]
pub struct Settings {
//...
pub profiles : HashMap<String, NetworkProfile>,
//...
}
#[derive(Debug, Clone)]
pub struct NetworkProfile {
pub outbound_connect_timeout: u64,
pub channel_handshake_timeout: u64,
pub channel_heartbeat_interval: u64,
}
We construct the Settings struct from SettingsOpt by filtering the
profiles hashmap using the active_profiles list. The seeds,
peers, inbound_addrs, and external_addrs fields are aggregated
from the filtered profiles and assigned to the corresponding fields in
Settings. These fields are not retained in NetworkProfile, as
they are not transport-specific.