From cbfbad6fbba6d02b4467198fa813eceb98034181 Mon Sep 17 00:00:00 2001
From: Max Inden <mail@max-inden.de>
Date: Fri, 19 Jun 2020 16:01:16 +0200
Subject: [PATCH] client/authority-discovery: Compare PeerIds and not
 Multihashes (#6414)

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/substrate/client/authority-discovery/src/lib.rs b/substrate/client/authority-discovery/src/lib.rs
index e816600b7cd..ba1c9f0fa8d 100644
--- a/substrate/client/authority-discovery/src/lib.rs
+++ b/substrate/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<Multiaddr> = 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() {
-- 
GitLab