11//! Libp2p node that can be used to broadcast and receive arbitrary messages using floodsub and a
22//! peer whitelist.
33
4+ use crate :: signer:: threshold_signer:: metrics:: Metrics ;
45use futures_util:: StreamExt ;
56use libp2p:: allow_block_list:: AllowedPeers ;
67use libp2p:: floodsub:: { FloodsubEvent , FloodsubMessage } ;
@@ -10,6 +11,7 @@ use libp2p::{
1011 Multiaddr , PeerId , Swarm , allow_block_list, floodsub, noise, swarm:: SwarmEvent , tcp, yamux,
1112} ;
1213use std:: collections:: HashMap ;
14+ use std:: num:: NonZeroU32 ;
1315use std:: time:: Duration ;
1416use thiserror:: Error ;
1517use tokio:: sync:: mpsc:: { UnboundedReceiver , UnboundedSender } ;
@@ -223,14 +225,40 @@ impl LibP2PNode {
223225 peer_id,
224226 topic,
225227 } ) ) => {
226- tracing:: debug!( %peer_id, ?topic, "Peer listening to topic" ) ;
228+ let short_id = peer_id_to_short_id. get ( & peer_id) . or_else ( || {
229+ tracing:: error!(
230+ incoming_peer_id = %peer_id,
231+ "Failed to convert peer_id to short_id"
232+ ) ;
233+ None
234+ } ) ;
235+
236+ tracing:: info!( %peer_id, ?short_id, ?topic, "Peer subscribed to topic" ) ;
227237 // Once we've received at least one topic subscription from a remote peer, we should
228238 // be able to send messages.
229239 * ready_send_messages = true ;
230240 }
231241
242+ SwarmEvent :: Behaviour ( BehaviourEvent :: Floodsub ( FloodsubEvent :: Unsubscribed {
243+ peer_id,
244+ topic,
245+ } ) ) => {
246+ let short_id = peer_id_to_short_id. get ( & peer_id) . or_else ( || {
247+ tracing:: error!(
248+ incoming_peer_id = %peer_id,
249+ "Failed to convert peer_id to short_id"
250+ ) ;
251+ None
252+ } ) ;
253+
254+ tracing:: info!( %peer_id, ?short_id, ?topic, "Peer unsubscribed to topic" ) ;
255+ }
256+
232257 SwarmEvent :: ConnectionEstablished {
233- peer_id, endpoint, ..
258+ peer_id,
259+ endpoint,
260+ num_established,
261+ ..
234262 } => {
235263 let short_id = peer_id_to_short_id. get ( & peer_id) . or_else ( || {
236264 tracing:: error!(
@@ -241,14 +269,51 @@ impl LibP2PNode {
241269 None
242270 } ) ;
243271
272+ if num_established == const { NonZeroU32 :: new ( 1 ) . unwrap ( ) } {
273+ // First connection established, report new peer connected
274+ Metrics :: report_peer_connected ( ) ;
275+ }
276+
244277 tracing:: info!(
245278 incoming_peer_id = %peer_id,
246279 incoming_short_id = ?short_id,
247280 incoming_remote_addr = %endpoint. get_remote_address( ) ,
281+ num_established,
248282 "Libp2p node established connection with peer"
249283 ) ;
250284 }
251285
286+ SwarmEvent :: ConnectionClosed {
287+ peer_id,
288+ endpoint,
289+ num_established,
290+ cause,
291+ ..
292+ } => {
293+ let short_id = peer_id_to_short_id. get ( & peer_id) . or_else ( || {
294+ tracing:: error!(
295+ incoming_peer_id = %peer_id,
296+ incoming_remote_addr = %endpoint. get_remote_address( ) ,
297+ "Libp2p node closed connection with an unknown peer"
298+ ) ;
299+ None
300+ } ) ;
301+
302+ if num_established == 0 {
303+ // No more connections, report disconnect
304+ Metrics :: report_peer_disconnected ( ) ;
305+ }
306+
307+ tracing:: info!(
308+ incoming_peer_id = %peer_id,
309+ incoming_short_id = ?short_id,
310+ incoming_remote_addr = %endpoint. get_remote_address( ) ,
311+ remaining_connections = num_established,
312+ ?cause,
313+ "Libp2p node closed connection to peer"
314+ ) ;
315+ }
316+
252317 SwarmEvent :: NewListenAddr { address, .. } => {
253318 tracing:: info!(
254319 "Local node is listening on {}" ,
0 commit comments