Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit d59281f

Browse files
cectontomaka
andauthored
Ensure the listen addresses are consistent with the transport (#6436)
* Initial commit Forked at: 0c42ced No parent branch. * Ensure the listen addresses are consistent with the transport * Update client/network/src/error.rs * Update client/network/src/service.rs * Better implementation * Fix bad previous impl * add boot_nodes * reserved nodes * test boot nodes * reserved nodes tests * add public_addresses and make specific error type * Update client/network/src/error.rs Co-authored-by: Pierre Krieger <[email protected]> Co-authored-by: Pierre Krieger <[email protected]>
1 parent 4c03656 commit d59281f

File tree

3 files changed

+187
-1
lines changed

3 files changed

+187
-1
lines changed

client/network/src/error.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
//! Substrate network possible errors.
2020
21+
use crate::config::TransportConfig;
2122
use libp2p::{PeerId, Multiaddr};
2223

2324
use std::fmt;
@@ -48,7 +49,18 @@ pub enum Error {
4849
second_id: PeerId,
4950
},
5051
/// Prometheus metrics error.
51-
Prometheus(prometheus_endpoint::PrometheusError)
52+
Prometheus(prometheus_endpoint::PrometheusError),
53+
/// The network addresses are invalid because they don't match the transport.
54+
#[display(
55+
fmt = "The following addresses are invalid because they don't match the transport: {:?}",
56+
addresses,
57+
)]
58+
AddressesForAnotherTransport {
59+
/// Transport used.
60+
transport: TransportConfig,
61+
/// The invalid addresses.
62+
addresses: Vec<Multiaddr>,
63+
},
5264
}
5365

5466
// Make `Debug` use the `Display` implementation.
@@ -65,6 +77,7 @@ impl std::error::Error for Error {
6577
Error::Client(ref err) => Some(err),
6678
Error::DuplicateBootnode { .. } => None,
6779
Error::Prometheus(ref err) => Some(err),
80+
Error::AddressesForAnotherTransport { .. } => None,
6881
}
6982
}
7083
}

client/network/src/service.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,24 @@ impl<B: BlockT + 'static, H: ExHashT> NetworkWorker<B, H> {
107107
/// for the network processing to advance. From it, you can extract a `NetworkService` using
108108
/// `worker.service()`. The `NetworkService` can be shared through the codebase.
109109
pub fn new(params: Params<B, H>) -> Result<NetworkWorker<B, H>, Error> {
110+
// Ensure the listen addresses are consistent with the transport.
111+
ensure_addresses_consistent_with_transport(
112+
params.network_config.listen_addresses.iter(),
113+
&params.network_config.transport,
114+
)?;
115+
ensure_addresses_consistent_with_transport(
116+
params.network_config.boot_nodes.iter().map(|x| &x.multiaddr),
117+
&params.network_config.transport,
118+
)?;
119+
ensure_addresses_consistent_with_transport(
120+
params.network_config.reserved_nodes.iter().map(|x| &x.multiaddr),
121+
&params.network_config.transport,
122+
)?;
123+
ensure_addresses_consistent_with_transport(
124+
params.network_config.public_addresses.iter(),
125+
&params.network_config.transport,
126+
)?;
127+
110128
let (to_worker, from_worker) = tracing_unbounded("mpsc_network_worker");
111129

112130
if let Some(path) = params.network_config.net_config_path {
@@ -1469,3 +1487,40 @@ impl<'a, B: BlockT, H: ExHashT> Link<B> for NetworkLink<'a, B, H> {
14691487
}
14701488
}
14711489
}
1490+
1491+
fn ensure_addresses_consistent_with_transport<'a>(
1492+
addresses: impl Iterator<Item = &'a Multiaddr>,
1493+
transport: &TransportConfig,
1494+
) -> Result<(), Error> {
1495+
if matches!(transport, TransportConfig::MemoryOnly) {
1496+
let addresses: Vec<_> = addresses
1497+
.filter(|x| x.iter()
1498+
.any(|y| !matches!(y, libp2p::core::multiaddr::Protocol::Memory(_)))
1499+
)
1500+
.cloned()
1501+
.collect();
1502+
1503+
if !addresses.is_empty() {
1504+
return Err(Error::AddressesForAnotherTransport {
1505+
transport: transport.clone(),
1506+
addresses,
1507+
});
1508+
}
1509+
} else {
1510+
let addresses: Vec<_> = addresses
1511+
.filter(|x| x.iter()
1512+
.any(|y| matches!(y, libp2p::core::multiaddr::Protocol::Memory(_)))
1513+
)
1514+
.cloned()
1515+
.collect();
1516+
1517+
if !addresses.is_empty() {
1518+
return Err(Error::AddressesForAnotherTransport {
1519+
transport: transport.clone(),
1520+
addresses,
1521+
});
1522+
}
1523+
}
1524+
1525+
Ok(())
1526+
}

client/network/src/service/tests.rs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
use crate::{config, Event, NetworkService, NetworkWorker};
2020

21+
use libp2p::PeerId;
2122
use futures::prelude::*;
2223
use sp_runtime::traits::{Block as BlockT, Header as _};
2324
use std::{sync::Arc, time::Duration};
@@ -138,6 +139,7 @@ fn build_nodes_one_proto()
138139

139140
let (node2, events_stream2) = build_test_full_node(config::NetworkConfiguration {
140141
notifications_protocols: vec![(ENGINE_ID, From::from(&b"/foo"[..]))],
142+
listen_addresses: vec![],
141143
reserved_nodes: vec![config::MultiaddrWithPeerId {
142144
multiaddr: listen_addr,
143145
peer_id: node1.local_peer_id().clone(),
@@ -342,3 +344,119 @@ fn lots_of_incoming_peers_works() {
342344
future::join_all(background_tasks_to_wait).await
343345
});
344346
}
347+
348+
#[test]
349+
#[should_panic(expected = "don't match the transport")]
350+
fn ensure_listen_addresses_consistent_with_transport_memory() {
351+
let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)];
352+
353+
let _ = build_test_full_node(config::NetworkConfiguration {
354+
listen_addresses: vec![listen_addr.clone()],
355+
transport: config::TransportConfig::MemoryOnly,
356+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
357+
});
358+
}
359+
360+
#[test]
361+
#[should_panic(expected = "don't match the transport")]
362+
fn ensure_listen_addresses_consistent_with_transport_not_memory() {
363+
let listen_addr = config::build_multiaddr![Memory(rand::random::<u64>())];
364+
365+
let _ = build_test_full_node(config::NetworkConfiguration {
366+
listen_addresses: vec![listen_addr.clone()],
367+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
368+
});
369+
}
370+
371+
#[test]
372+
#[should_panic(expected = "don't match the transport")]
373+
fn ensure_boot_node_addresses_consistent_with_transport_memory() {
374+
let listen_addr = config::build_multiaddr![Memory(rand::random::<u64>())];
375+
let boot_node = config::MultiaddrWithPeerId {
376+
multiaddr: config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)],
377+
peer_id: PeerId::random(),
378+
};
379+
380+
let _ = build_test_full_node(config::NetworkConfiguration {
381+
listen_addresses: vec![listen_addr.clone()],
382+
transport: config::TransportConfig::MemoryOnly,
383+
boot_nodes: vec![boot_node],
384+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
385+
});
386+
}
387+
388+
#[test]
389+
#[should_panic(expected = "don't match the transport")]
390+
fn ensure_boot_node_addresses_consistent_with_transport_not_memory() {
391+
let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)];
392+
let boot_node = config::MultiaddrWithPeerId {
393+
multiaddr: config::build_multiaddr![Memory(rand::random::<u64>())],
394+
peer_id: PeerId::random(),
395+
};
396+
397+
let _ = build_test_full_node(config::NetworkConfiguration {
398+
listen_addresses: vec![listen_addr.clone()],
399+
boot_nodes: vec![boot_node],
400+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
401+
});
402+
}
403+
404+
#[test]
405+
#[should_panic(expected = "don't match the transport")]
406+
fn ensure_reserved_node_addresses_consistent_with_transport_memory() {
407+
let listen_addr = config::build_multiaddr![Memory(rand::random::<u64>())];
408+
let reserved_node = config::MultiaddrWithPeerId {
409+
multiaddr: config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)],
410+
peer_id: PeerId::random(),
411+
};
412+
413+
let _ = build_test_full_node(config::NetworkConfiguration {
414+
listen_addresses: vec![listen_addr.clone()],
415+
transport: config::TransportConfig::MemoryOnly,
416+
reserved_nodes: vec![reserved_node],
417+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
418+
});
419+
}
420+
421+
#[test]
422+
#[should_panic(expected = "don't match the transport")]
423+
fn ensure_reserved_node_addresses_consistent_with_transport_not_memory() {
424+
let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)];
425+
let reserved_node = config::MultiaddrWithPeerId {
426+
multiaddr: config::build_multiaddr![Memory(rand::random::<u64>())],
427+
peer_id: PeerId::random(),
428+
};
429+
430+
let _ = build_test_full_node(config::NetworkConfiguration {
431+
listen_addresses: vec![listen_addr.clone()],
432+
reserved_nodes: vec![reserved_node],
433+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
434+
});
435+
}
436+
437+
#[test]
438+
#[should_panic(expected = "don't match the transport")]
439+
fn ensure_public_addresses_consistent_with_transport_memory() {
440+
let listen_addr = config::build_multiaddr![Memory(rand::random::<u64>())];
441+
let public_address = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)];
442+
443+
let _ = build_test_full_node(config::NetworkConfiguration {
444+
listen_addresses: vec![listen_addr.clone()],
445+
transport: config::TransportConfig::MemoryOnly,
446+
public_addresses: vec![public_address],
447+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
448+
});
449+
}
450+
451+
#[test]
452+
#[should_panic(expected = "don't match the transport")]
453+
fn ensure_public_addresses_consistent_with_transport_not_memory() {
454+
let listen_addr = config::build_multiaddr![Ip4([127, 0, 0, 1]), Tcp(0_u16)];
455+
let public_address = config::build_multiaddr![Memory(rand::random::<u64>())];
456+
457+
let _ = build_test_full_node(config::NetworkConfiguration {
458+
listen_addresses: vec![listen_addr.clone()],
459+
public_addresses: vec![public_address],
460+
.. config::NetworkConfiguration::new("test-node", "test-client", Default::default(), None)
461+
});
462+
}

0 commit comments

Comments
 (0)