Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions common/nymsphinx/src/receiver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ mod message_receiver {
mix_id: 123,
owner: "foomp1".to_string(),
host: "10.20.30.40".parse().unwrap(),
mix_host: "10.20.30.40:1789".parse().unwrap(),
mix_hosts: vec!["10.20.30.40:1789".parse().unwrap()],
identity_key: identity::PublicKey::from_base58_string(
"3ebjp1Fb9hdcS1AR6AZihgeJiMHkB5jjJUsvqNnfQwU7",
)
Expand All @@ -257,7 +257,7 @@ mod message_receiver {
mix_id: 234,
owner: "foomp2".to_string(),
host: "11.21.31.41".parse().unwrap(),
mix_host: "11.21.31.41:1789".parse().unwrap(),
mix_hosts: vec!["11.21.31.41:1789".parse().unwrap()],
identity_key: identity::PublicKey::from_base58_string(
"D6YaMzLSY7mANtSQRKXsmMZpqgqiVkeiagKM4V4oFPFr",
)
Expand All @@ -277,7 +277,7 @@ mod message_receiver {
mix_id: 456,
owner: "foomp3".to_string(),
host: "12.22.32.42".parse().unwrap(),
mix_host: "12.22.32.42:1789".parse().unwrap(),
mix_hosts: vec!["12.22.32.42:1789".parse().unwrap()],
identity_key: identity::PublicKey::from_base58_string(
"GkWDysw4AjESv1KiAiVn7JzzCMJeksxNSXVfr1PpX8wD",
)
Expand All @@ -297,7 +297,7 @@ mod message_receiver {
vec![gateway::Node {
owner: "foomp4".to_string(),
host: "1.2.3.4".parse().unwrap(),
mix_host: "1.2.3.4:1789".parse().unwrap(),
mix_hosts: vec!["1.2.3.4:1789".parse().unwrap()],
clients_ws_port: 9000,
clients_wss_port: None,
identity_key: identity::PublicKey::from_base58_string(
Expand Down
26 changes: 14 additions & 12 deletions common/topology/src/gateway.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ pub struct Node {
pub host: NetworkAddress,
// we're keeping this as separate resolved field since we do not want to be resolving the potential
// hostname every time we want to construct a path via this node
pub mix_host: SocketAddr,
pub mix_hosts: Vec<SocketAddr>,

// #[serde(alias = "clients_port")]
pub clients_ws_port: u16,
Expand All @@ -66,7 +66,7 @@ impl std::fmt::Debug for Node {
f.debug_struct("gateway::Node")
.field("host", &self.host)
.field("owner", &self.owner)
.field("mix_host", &self.mix_host)
.field("mix_hosts", &self.mix_hosts)
.field("clients_ws_port", &self.clients_ws_port)
.field("clients_wss_port", &self.clients_wss_port)
.field("identity_key", &self.identity_key.to_base58_string())
Expand All @@ -88,13 +88,12 @@ impl Node {
pub fn extract_mix_host(
host: &NetworkAddress,
mix_port: u16,
) -> Result<SocketAddr, GatewayConversionError> {
Ok(host.to_socket_addrs(mix_port).map_err(|err| {
GatewayConversionError::InvalidAddress {
) -> Result<Vec<SocketAddr>, GatewayConversionError> {
host.to_socket_addrs(mix_port)
.map_err(|err| GatewayConversionError::InvalidAddress {
value: host.to_string(),
source: err,
}
})?[0])
})
}

pub fn identity(&self) -> &NodeIdentity {
Expand Down Expand Up @@ -135,7 +134,7 @@ impl filter::Versioned for Node {

impl<'a> From<&'a Node> for SphinxNode {
fn from(node: &'a Node) -> Self {
let node_address_bytes = NymNodeRoutingAddress::from(node.mix_host)
let node_address_bytes = NymNodeRoutingAddress::from(node.mix_hosts[0])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.first()

.try_into()
.unwrap();

Expand All @@ -151,12 +150,12 @@ impl<'a> TryFrom<&'a GatewayBond> for Node {

// try to completely resolve the host in the mix situation to avoid doing it every
// single time we want to construct a path
let mix_host = Self::extract_mix_host(&host, bond.gateway.mix_port)?;
let mix_hosts = Self::extract_mix_host(&host, bond.gateway.mix_port)?;

Ok(Node {
owner: bond.owner.as_str().to_owned(),
host,
mix_host,
mix_hosts,
clients_ws_port: bond.gateway.clients_port,
clients_wss_port: None,
identity_key: identity::PublicKey::from_base58_string(&bond.gateway.identity_key)?,
Expand Down Expand Up @@ -196,12 +195,15 @@ impl<'a> TryFrom<&'a DescribedGateway> for Node {

// get ip from the self-reported values so we wouldn't need to do any hostname resolution
// (which doesn't really work in wasm)
let mix_host = SocketAddr::new(ips[0], value.bond.gateway.mix_port);
let mix_hosts = ips
.iter()
.map(|ip| SocketAddr::new(*ip, value.bond.gateway.mix_port))
.collect();

Ok(Node {
owner: value.bond.owner.as_str().to_owned(),
host,
mix_host,
mix_hosts,
clients_ws_port: self_described.mixnet_websockets.unwrap().ws_port, //SW gateway have that field
clients_wss_port: self_described.mixnet_websockets.unwrap().wss_port, //SW gateway have that field
identity_key: identity::PublicKey::from_base58_string(
Expand Down
40 changes: 24 additions & 16 deletions common/topology/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -191,25 +191,33 @@ impl NymTopology {
mix_host: SocketAddr,
) -> Result<Option<String>, NymTopologyError> {
for node in self.described_nodes.iter() {
let sphinx_key = match node {
DescribedNymNode::Gateway(g) => &g.bond.gateway.sphinx_key,
DescribedNymNode::Mixnode(m) => &m.bond.mix_node.sphinx_key,
let (sphinx_key, socket_addresses, description) = match node {
DescribedNymNode::Gateway(g) => {
let sphinx_key = &g.bond.gateway.sphinx_key;
let gateway_node: Option<gateway::Node> = (&g.bond).try_into().ok();
let mix_hosts = gateway_node.map(|node| node.mix_hosts);
let description = &g.self_described;
(sphinx_key, mix_hosts, description)
}
DescribedNymNode::Mixnode(m) => {
let sphinx_key = &m.bond.mix_node.sphinx_key;
let mix_node: Option<mix::Node> = (&m.bond).try_into().ok();
let mix_hosts = mix_node.map(|node| node.mix_hosts);
let description = &m.self_described;
(sphinx_key, mix_hosts, description)
}
};
if let Some(description) = match node {
DescribedNymNode::Gateway(g) => &g.self_described,
DescribedNymNode::Mixnode(m) => &m.self_described,
} {
if description
.host_information
.ip_address
.contains(&mix_host.ip())
{
if let Some(sock_addr) = socket_addresses {
let ip_addresses = sock_addr.iter().map(|addr| addr.ip()).collect::<Vec<_>>();
if ip_addresses.contains(&mix_host.ip()) {
//we have our node
if description.noise_information.supported {
if description.is_some()
&& description.as_ref().unwrap().noise_information.supported
//SAFETY: We checked that `description` wasn't None
{
return Ok(Some(sphinx_key.to_string()));
} else {
return Ok(None);
}
return Ok(None);
}
}
}
Expand Down Expand Up @@ -539,7 +547,7 @@ mod converting_mixes_to_vec {
mix_id: 42,
owner: "N/A".to_string(),
host: "3.3.3.3".parse().unwrap(),
mix_host: "3.3.3.3:1789".parse().unwrap(),
mix_hosts: vec!["3.3.3.3:1789".parse().unwrap()],
identity_key: identity::PublicKey::from_base58_string(
"3ebjp1Fb9hdcS1AR6AZihgeJiMHkB5jjJUsvqNnfQwU7",
)
Expand Down
19 changes: 9 additions & 10 deletions common/topology/src/mix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ pub struct Node {
pub host: NetworkAddress,
// we're keeping this as separate resolved field since we do not want to be resolving the potential
// hostname every time we want to construct a path via this node
pub mix_host: SocketAddr,
pub mix_hosts: Vec<SocketAddr>,
pub identity_key: identity::PublicKey,
pub sphinx_key: encryption::PublicKey, // TODO: or nymsphinx::PublicKey? both are x25519
pub layer: Layer,
Expand All @@ -49,7 +49,7 @@ impl std::fmt::Debug for Node {
.field("mix_id", &self.mix_id)
.field("owner", &self.owner)
.field("host", &self.host)
.field("mix_host", &self.mix_host)
.field("mix_hosts", &self.mix_hosts)
.field("identity_key", &self.identity_key.to_base58_string())
.field("sphinx_key", &self.sphinx_key.to_base58_string())
.field("layer", &self.layer)
Expand All @@ -70,13 +70,12 @@ impl Node {
pub fn extract_mix_host(
host: &NetworkAddress,
mix_port: u16,
) -> Result<SocketAddr, MixnodeConversionError> {
Ok(host.to_socket_addrs(mix_port).map_err(|err| {
MixnodeConversionError::InvalidAddress {
) -> Result<Vec<SocketAddr>, MixnodeConversionError> {
host.to_socket_addrs(mix_port)
.map_err(|err| MixnodeConversionError::InvalidAddress {
value: host.to_string(),
source: err,
}
})?[0])
})
}
}

Expand All @@ -89,7 +88,7 @@ impl filter::Versioned for Node {

impl<'a> From<&'a Node> for SphinxNode {
fn from(node: &'a Node) -> Self {
let node_address_bytes = NymNodeRoutingAddress::from(node.mix_host)
let node_address_bytes = NymNodeRoutingAddress::from(node.mix_hosts[0])
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.first()

.try_into()
.unwrap();

Expand All @@ -105,13 +104,13 @@ impl<'a> TryFrom<&'a MixNodeBond> for Node {

// try to completely resolve the host in the mix situation to avoid doing it every
// single time we want to construct a path
let mix_host = Self::extract_mix_host(&host, bond.mix_node.mix_port)?;
let mix_hosts = Self::extract_mix_host(&host, bond.mix_node.mix_port)?;

Ok(Node {
mix_id: bond.mix_id,
owner: bond.owner.as_str().to_owned(),
host,
mix_host,
mix_hosts,
identity_key: identity::PublicKey::from_base58_string(&bond.mix_node.identity_key)?,
sphinx_key: encryption::PublicKey::from_base58_string(&bond.mix_node.sphinx_key)?,
layer: bond.layer,
Expand Down
21 changes: 12 additions & 9 deletions common/topology/src/serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,13 @@ impl TryFrom<SerializableMixNode> for mix::Node {

// try to completely resolve the host in the mix situation to avoid doing it every
// single time we want to construct a path
let mix_host = mix::Node::extract_mix_host(&host, mix_port)?;
let mix_hosts = mix::Node::extract_mix_host(&host, mix_port)?;

Ok(mix::Node {
mix_id: value.mix_id,
owner: value.owner,
host,
mix_host,
mix_hosts,
identity_key: identity::PublicKey::from_base58_string(&value.identity_key)
.map_err(MixnodeConversionError::from)?,
sphinx_key: encryption::PublicKey::from_base58_string(&value.sphinx_key)
Expand All @@ -159,7 +159,7 @@ impl<'a> From<&'a mix::Node> for SerializableMixNode {
mix_id: value.mix_id,
owner: value.owner.clone(),
host: value.host.to_string(),
mix_port: Some(value.mix_host.port()),
mix_port: Some(value.mix_hosts[0].port()),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as @octol says, first() : )

identity_key: value.identity_key.to_base58_string(),
sphinx_key: value.sphinx_key.to_base58_string(),
layer: value.layer.into(),
Expand All @@ -182,7 +182,7 @@ pub struct SerializableGateway {
// (thank you wasm)
#[cfg_attr(feature = "wasm-serde-types", tsify(optional))]
#[serde(alias = "explicit_ip")]
pub explicit_ip: Option<IpAddr>,
pub explicit_ips: Option<Vec<IpAddr>>,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this might break --custom-mixnet flag. please double check.

Copy link
Contributor Author

@simonwicky simonwicky Mar 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current state, --custom-mixnet is broken anyway because it doesn't exist on mix nodes and gateway. This doesn't mean that it will stay broken though


#[cfg_attr(feature = "wasm-serde-types", tsify(optional))]
#[serde(alias = "mix_port")]
Expand Down Expand Up @@ -221,16 +221,19 @@ impl TryFrom<SerializableGateway> for gateway::Node {

// try to completely resolve the host in the mix situation to avoid doing it every
// single time we want to construct a path
let mix_host = if let Some(explicit_ip) = value.explicit_ip {
SocketAddr::new(explicit_ip, mix_port)
let mix_hosts = if let Some(explicit_ips) = value.explicit_ips {
explicit_ips
.iter()
.map(|explicit_ip| SocketAddr::new(*explicit_ip, mix_port))
.collect()
} else {
gateway::Node::extract_mix_host(&host, mix_port)?
};

Ok(gateway::Node {
owner: value.owner,
host,
mix_host,
mix_hosts,
clients_ws_port,
clients_wss_port: value.clients_wss_port,
identity_key: identity::PublicKey::from_base58_string(&value.identity_key)
Expand All @@ -247,8 +250,8 @@ impl<'a> From<&'a gateway::Node> for SerializableGateway {
SerializableGateway {
owner: value.owner.clone(),
host: value.host.to_string(),
explicit_ip: Some(value.mix_host.ip()),
mix_port: Some(value.mix_host.port()),
explicit_ips: Some(value.mix_hosts.iter().map(|addr| addr.ip()).collect()),
mix_port: Some(value.mix_hosts[0].port()),
clients_ws_port: Some(value.clients_ws_port),
clients_wss_port: value.clients_wss_port,
identity_key: value.identity_key.to_base58_string(),
Expand Down
10 changes: 1 addition & 9 deletions nym-connect/desktop/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 0 additions & 7 deletions nym-wallet/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions sdk/rust/nym-sdk/examples/manually_overwrite_topology.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ async fn main() {
mix_id: 63,
owner: "n1k52k5n45cqt5qpjh8tcwmgqm0wkt355yy0g5vu".to_string(),
host: "172.105.92.48".parse().unwrap(),
mix_host: "172.105.92.48:1789".parse().unwrap(),
mix_hosts: vec!["172.105.92.48:1789".parse().unwrap()],
identity_key: "GLdR2NRVZBiCoCbv4fNqt9wUJZAnNjGXHkx3TjVAUzrK"
.parse()
.unwrap(),
Expand All @@ -40,7 +40,7 @@ async fn main() {
mix_id: 23,
owner: "n1fzv4jc7fanl9s0qj02ge2ezk3kts545kjtek47".to_string(),
host: "178.79.143.65".parse().unwrap(),
mix_host: "178.79.143.65:1789".parse().unwrap(),
mix_hosts: vec!["178.79.143.65:1789".parse().unwrap()],
identity_key: "4Yr4qmEHd9sgsuQ83191FR2hD88RfsbMmB4tzhhZWriz"
.parse()
.unwrap(),
Expand All @@ -57,7 +57,7 @@ async fn main() {
mix_id: 66,
owner: "n1ae2pjd7q9p0dea65pqkvcm4x9s264v4fktpyru".to_string(),
host: "139.162.247.97".parse().unwrap(),
mix_host: "139.162.247.97:1789".parse().unwrap(),
mix_hosts: vec!["139.162.247.97:1789".parse().unwrap()],
identity_key: "66UngapebhJRni3Nj52EW1qcNsWYiuonjkWJzHFsmyYY"
.parse()
.unwrap(),
Expand Down