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
This commit is contained in:
Max Inden
2020-06-19 16:01:16 +02:00
committed by GitHub
parent 7858828d98
commit cbfbad6fbb
@@ -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() {