From 47c7be1df87323ec4a1de4f7e8ccb9c4f9792eac Mon Sep 17 00:00:00 2001 From: Max Inden Date: Thu, 18 Jun 2020 19:21:12 +0200 Subject: [PATCH] client/authority-discovery: Compare PeerIds and not Multihashes In order to tell whether an address is the local nodes address the authority discovery module previously compared the Multihash within the `p2p` Multiaddr protocol. rust-libp2p recently switched to a new PeerId representation (see [1]). Multihashes of the same PeerId in the new and the old format don't equal. Instead of comparing the Multihashes, this patch ensures the module compares the PeerIds [1] https://github.com/libp2p/rust-libp2p/issues/555 --- client/authority-discovery/src/lib.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/client/authority-discovery/src/lib.rs b/client/authority-discovery/src/lib.rs index e816600b7cde5..ba1c9f0fa8dce 100644 --- a/client/authority-discovery/src/lib.rs +++ b/client/authority-discovery/src/lib.rs @@ -72,6 +72,7 @@ use sc_network::{ ExHashT, Multiaddr, NetworkStateInfo, + PeerId, }; use sp_authority_discovery::{AuthorityDiscoveryApi, AuthorityId, AuthoritySignature, AuthorityPair}; use sp_core::crypto::{key_types, Pair}; @@ -430,7 +431,7 @@ where .get(&remote_key) .ok_or(Error::MatchingHashedAuthorityIdWithAuthorityId)?; - let local_peer_id = multiaddr::Protocol::P2p(self.network.local_peer_id().into()); + let local_peer_id = self.network.local_peer_id(); let remote_addresses: Vec = values.into_iter() .map(|(_k, v)| { @@ -459,9 +460,23 @@ where .into_iter() .flatten() // Ignore own addresses. - .filter(|addr| !addr.iter().any(|protocol| - protocol == local_peer_id - )) + .filter(|addr| !addr.iter().any(|protocol| { + // Parse to PeerId first as Multihashes of old and new PeerId + // representation don't equal. + // + // See https://github.com/libp2p/rust-libp2p/issues/555 for + // details. + if let multiaddr::Protocol::P2p(hash) = protocol { + let peer_id = match PeerId::from_multihash(hash) { + Ok(peer_id) => peer_id, + Err(_) => return true, // Discard address. + }; + + return peer_id == local_peer_id; + } + + false // Multiaddr does not contain a PeerId. + })) .collect(); if !remote_addresses.is_empty() {