Skip to content

Commit

Permalink
Avoid self-lookups in Authority Discovery (paritytech#6317)
Browse files Browse the repository at this point in the history
* Ensure authority discovery avoids self-lookups.

Thereby additionally guard the `NetworkService` against
adding the local peer to the PSM or registering a
"known address" for the local peer.

* Clarify comments.

* See if returning errors is ok.
  • Loading branch information
romanb authored Jun 10, 2020
1 parent 8aeda51 commit 70cfeff
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 8 deletions.
23 changes: 18 additions & 5 deletions client/authority-discovery/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -294,13 +294,26 @@ where
.authorities(&id)
.map_err(Error::CallingRuntime)?;

let local_keys = match &self.role {
Role::Authority(key_store) => {
key_store.read()
.sr25519_public_keys(key_types::AUTHORITY_DISCOVERY)
.into_iter()
.collect::<HashSet<_>>()
},
Role::Sentry => HashSet::new(),
};

for authority_id in authorities.iter() {
if let Some(metrics) = &self.metrics {
metrics.request.inc();
}
// Make sure we don't look up our own keys.
if !local_keys.contains(authority_id.as_ref()) {
if let Some(metrics) = &self.metrics {
metrics.request.inc();
}

self.network
.get_value(&hash_authority_id(authority_id.as_ref()));
self.network
.get_value(&hash_authority_id(authority_id.as_ref()));
}
}

Ok(())
Expand Down
27 changes: 24 additions & 3 deletions client/network/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -672,8 +672,15 @@ impl<B: BlockT + 'static, H: ExHashT> NetworkService<B, H> {

/// Adds a `PeerId` and its address as reserved. The string should encode the address
/// and peer ID of the remote node.
///
/// Returns an `Err` if the given string is not a valid multiaddress
/// or contains an invalid peer ID (which includes the local peer ID).
pub fn add_reserved_peer(&self, peer: String) -> Result<(), String> {
let (peer_id, addr) = parse_str_addr(&peer).map_err(|e| format!("{:?}", e))?;
// Make sure the local peer ID is never added to the PSM.
if peer_id == self.local_peer_id {
return Err("Local peer ID cannot be added as a reserved peer.".to_string())
}
self.peerset.add_reserved_peer(peer_id.clone());
let _ = self
.to_worker
Expand All @@ -694,12 +701,26 @@ impl<B: BlockT + 'static, H: ExHashT> NetworkService<B, H> {
}

/// Modify a peerset priority group.
///
/// Returns an `Err` if one of the given addresses contains an invalid
/// peer ID (which includes the local peer ID).
pub fn set_priority_group(&self, group_id: String, peers: HashSet<Multiaddr>) -> Result<(), String> {
let peers = peers.into_iter().map(|p| {
parse_addr(p).map_err(|e| format!("{:?}", e))
}).collect::<Result<Vec<(PeerId, Multiaddr)>, String>>()?;
let peers = peers.into_iter()
.map(|p| match parse_addr(p) {
Err(e) => Err(format!("{:?}", e)),
Ok((peer, addr)) =>
// Make sure the local peer ID is never added to the PSM
// or added as a "known address", even if given.
if peer == self.local_peer_id {
Err("Local peer ID in priority group.".to_string())
} else {
Ok((peer, addr))
}
})
.collect::<Result<Vec<(PeerId, Multiaddr)>, String>>()?;

let peer_ids = peers.iter().map(|(peer_id, _addr)| peer_id.clone()).collect();

self.peerset.set_priority_group(group_id, peer_ids);

for (peer_id, addr) in peers.into_iter() {
Expand Down

0 comments on commit 70cfeff

Please sign in to comment.