Skip to content

Commit 43d2d16

Browse files
committed
feat(peer_manager): integrate peer blocking functionality into modular peer manager (sigp#432)
1 parent 267145d commit 43d2d16

File tree

9 files changed

+565
-34
lines changed

9 files changed

+565
-34
lines changed

anchor/network/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,5 @@ version = { workspace = true }
4444
[dev-dependencies]
4545
libp2p-swarm-test = "0.5.0"
4646
message_receiver = { workspace = true }
47-
tokio = { workspace = true, features = ["rt", "macros", "time"] }
47+
tokio = { workspace = true, features = ["rt", "macros", "time", "test-util"] }
4848
tracing-subscriber = { workspace = true }

anchor/network/src/behaviour.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ impl AnchorBehaviour {
129129
discovery
130130
};
131131

132-
let peer_manager = PeerManager::new(network_config);
132+
let peer_manager = {
133+
let slots_per_epoch = E::slots_per_epoch();
134+
let slot_duration = Duration::from_secs(spec.seconds_per_slot);
135+
let one_epoch_duration = slot_duration * slots_per_epoch as u32;
136+
PeerManager::new(network_config, one_epoch_duration)
137+
};
133138

134139
let handshake = handshake::create_behaviour(local_keypair);
135140

anchor/network/src/network.rs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,13 @@ impl<R: MessageReceiver> Network<R> {
201201
self.handle_handshake_result(result);
202202
}
203203
}
204-
AnchorBehaviourEvent::PeerManager(peer_manager::Event::ConnectActions(actions)) => {
205-
self.handle_connect_actions(actions);
204+
AnchorBehaviourEvent::PeerManager(peer_manager::Event::Heartbeat(heartbeat)) => {
205+
if let Some(actions) = heartbeat.connect_actions {
206+
self.handle_connect_actions(actions);
207+
}
208+
if heartbeat.check_peer_scores {
209+
self.check_and_block_peers_by_score();
210+
}
206211
}
207212
_ => {
208213
trace!(event = ?behaviour_event, "Unhandled behaviour event");
@@ -413,6 +418,40 @@ impl<R: MessageReceiver> Network<R> {
413418
}
414419
}
415420
}
421+
422+
/// Get the list of currently blocked peers.
423+
pub fn blocked_peers(&self) -> &std::collections::HashSet<PeerId> {
424+
self.swarm.behaviour().peer_manager.blocked_peers()
425+
}
426+
427+
/// Check gossipsub peer scores and block peers with scores below graylist threshold
428+
pub fn check_and_block_peers_by_score(&mut self) {
429+
use crate::scoring::peer_score_config::GRAYLIST_THRESHOLD;
430+
431+
let gossipsub = &self.swarm.behaviour().gossipsub;
432+
433+
// Get all peers with poor scores that should be blocked
434+
let peers_to_block: Vec<PeerId> = self
435+
.swarm
436+
.connected_peers()
437+
.filter_map(|peer_id| {
438+
if let Some(score) = gossipsub.peer_score(peer_id) {
439+
if score < GRAYLIST_THRESHOLD {
440+
Some(*peer_id)
441+
} else {
442+
None
443+
}
444+
} else {
445+
None
446+
}
447+
})
448+
.collect();
449+
450+
// Block the peers (connections will be closed automatically)
451+
for peer_id in peers_to_block {
452+
self.swarm.behaviour_mut().peer_manager.block_peer(peer_id);
453+
}
454+
}
416455
}
417456

418457
fn build_swarm(

0 commit comments

Comments
 (0)