Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(kad): emit ToSwarm::NewExternalAddrOfPeer #5549

Merged
2 changes: 2 additions & 0 deletions protocols/kad/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
## 0.46.1

- Emit `ToSwarm::NewExternalAddrOfPeer`.
See [PR 5549](https://github.com/libp2p/rust-libp2p/pull/5549)
dariusc93 marked this conversation as resolved.
Show resolved Hide resolved
- Use new provider record update strategy to prevent Sybil attack.
See [PR 5536](https://github.com/libp2p/rust-libp2p/pull/5536).

Expand Down
8 changes: 7 additions & 1 deletion protocols/kad/src/behaviour.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2562,13 +2562,19 @@ where
// Drain applied pending entries from the routing table.
if let Some(entry) = self.kbuckets.take_applied_pending() {
let kbucket::Node { key, value } = entry.inserted;
let peer_id = key.into_preimage();
self.queued_events
.push_back(ToSwarm::NewExternalAddrOfPeer {
peer_id,
address: value.first().clone(),
});
let event = Event::RoutingUpdated {
bucket_range: self
.kbuckets
.bucket(&key)
.map(|b| b.range())
.expect("Self to never be applied from pending."),
peer: key.into_preimage(),
peer: peer_id,
is_new_peer: true,
addresses: value,
old_peer: entry.evicted.map(|n| n.key.into_preimage()),
Expand Down
18 changes: 16 additions & 2 deletions protocols/kad/tests/client_mode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,21 @@ async fn server_gets_added_to_routing_table_by_client() {
let server_peer_id = *server.local_peer_id();
async_std::task::spawn(server.loop_on_next());

let peer = client
let external_event_peer = client
.wait(|e| match e {
SwarmEvent::NewExternalAddrOfPeer { peer_id, .. } => Some(peer_id),
_ => None,
})
.await;
let routing_updated_peer = client
.wait(|e| match e {
SwarmEvent::Behaviour(Kad(RoutingUpdated { peer, .. })) => Some(peer),
_ => None,
})
.await;

assert_eq!(peer, server_peer_id);
assert_eq!(external_event_peer, server_peer_id);
assert_eq!(routing_updated_peer, server_peer_id);
}

#[async_std::test]
Expand Down Expand Up @@ -126,6 +133,12 @@ async fn set_client_to_server_mode() {

let server_peer_id = *server.local_peer_id();

let peer_id = client
.wait(|e| match e {
SwarmEvent::NewExternalAddrOfPeer { peer_id, .. } => Some(peer_id),
_ => None,
})
.await;
let client_event = client.wait(|e| match e {
SwarmEvent::Behaviour(Kad(RoutingUpdated { peer, .. })) => Some(peer),
_ => None,
Expand All @@ -138,6 +151,7 @@ async fn set_client_to_server_mode() {
let (peer, info) = futures::future::join(client_event, server_event).await;

assert_eq!(peer, server_peer_id);
assert_eq!(peer_id, server_peer_id);
assert!(info
.protocols
.iter()
Expand Down
Loading