From fde05dd236154ff8d5258cbb86436ca97573bee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 23 Mar 2020 18:49:49 +0100 Subject: [PATCH] Show an error when we connect to a bootnode with a different peer id (#5365) Currently when we connect to a bootnode and it returns a different peer id, than the one we provided, we disconnect silently. This pr changes the behavior to printing an error when a bootnode returns a different peer id than the provided one. --- substrate/client/network/src/service.rs | 32 ++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/substrate/client/network/src/service.rs b/substrate/client/network/src/service.rs index 81bea868b4..83492e2e93 100644 --- a/substrate/client/network/src/service.rs +++ b/substrate/client/network/src/service.rs @@ -171,12 +171,14 @@ impl NetworkWorker { let mut known_addresses = Vec::new(); let mut bootnodes = Vec::new(); let mut reserved_nodes = Vec::new(); + let mut boot_node_ids = HashSet::new(); // Process the bootnodes. for bootnode in params.network_config.boot_nodes.iter() { match parse_str_addr(bootnode) { Ok((peer_id, addr)) => { bootnodes.push(peer_id.clone()); + boot_node_ids.insert(peer_id.clone()); known_addresses.push((peer_id, addr)); }, Err(_) => warn!(target: "sub-libp2p", "Not a valid bootnode address: {}", bootnode), @@ -331,7 +333,8 @@ impl NetworkWorker { metrics: match params.metrics_registry { Some(registry) => Some(Metrics::register(®istry)?), None => None - } + }, + boot_node_ids, }) } @@ -772,6 +775,8 @@ pub struct NetworkWorker { event_streams: Vec>, /// Prometheus network metrics. metrics: Option, + /// The `PeerId`'s of all boot nodes. + boot_node_ids: HashSet, } struct Metrics { @@ -991,8 +996,29 @@ impl Future for NetworkWorker { trace!(target: "sub-libp2p", "Libp2p => NewListenAddr({})", addr), Poll::Ready(SwarmEvent::ExpiredListenAddr(addr)) => trace!(target: "sub-libp2p", "Libp2p => ExpiredListenAddr({})", addr), - Poll::Ready(SwarmEvent::UnreachableAddr { peer_id, address, error }) => - trace!(target: "sub-libp2p", "Libp2p => Failed to reach {:?} through {:?}: {}", peer_id, address, error), + Poll::Ready(SwarmEvent::UnreachableAddr { peer_id, address, error }) => { + let error = error.to_string(); + + trace!( + target: "sub-libp2p", "Libp2p => Failed to reach {:?} through {:?}: {}", + peer_id, + address, + error, + ); + + if let Some(peer_id) = peer_id { + if this.boot_node_ids.contains(&peer_id) + && error.contains("Peer ID mismatch") + { + error!( + "Connecting to bootnode with peer id `{}` and address `{}` failed \ + because it returned a different peer id!", + peer_id, + address, + ); + } + } + }, Poll::Ready(SwarmEvent::StartConnect(peer_id)) => trace!(target: "sub-libp2p", "Libp2p => StartConnect({:?})", peer_id), };