discv5_cli/request_enr/
mod.rs

1use discv5::{enr, ListenConfig};
2use libp2p_core::Multiaddr;
3
4mod enr_ext;
5use enr_ext::EnrExt;
6use std::net::Ipv4Addr;
7
8/// The [clap] cli command arguments for the request-enr service.
9pub mod command;
10pub use command::*;
11
12/// Runs the request ENR command.
13pub async fn run(req: &RequestEnr) {
14    // Obtain the multiaddr
15    let multiaddr = req
16        .multiaddr
17        .parse::<Multiaddr>()
18        .expect("Invalid Multiaddr provided");
19
20    // Set up a server to receive the response
21    let listen_address = req
22        .listen_address
23        .parse::<Ipv4Addr>()
24        .expect("Invalid listening address");
25
26    let listen_port = req.listen_port;
27    let listen_config = ListenConfig::from_ip(listen_address.into(), listen_port);
28    let enr_key = enr::CombinedKey::generate_secp256k1();
29
30    // Build a local ENR
31    let enr = enr::Builder::default()
32        .ip4(listen_address)
33        .udp4(listen_port)
34        .build(&enr_key)
35        .unwrap();
36
37    // Construct the discv5 service
38    let config = discv5::ConfigBuilder::new(listen_config).build();
39    let mut discv5: discv5::Discv5 = discv5::Discv5::new(enr, enr_key, config).unwrap();
40
41    // Start the server
42    discv5.start().await.unwrap();
43
44    // Request the ENR
45    log::info!("Requesting ENR for: {}", multiaddr);
46    match discv5.request_enr(multiaddr.to_string()).await {
47        Ok(enr) => print_enr(enr),
48        Err(e) => log::error!("Failed to obtain ENR. Error: {}", e),
49    }
50}
51
52// Print various information about the obtained ENR.
53fn print_enr(enr: enr::Enr<enr::CombinedKey>) {
54    log::info!("ENR Found:");
55    log::info!("Sequence No:{}", enr.seq());
56    log::info!("NodeId:{}", enr.node_id());
57    log::info!("Libp2p PeerId:{}", enr.peer_id());
58    if let Some(ip) = enr.ip4() {
59        log::info!("IP:{:?}", ip);
60    }
61    if let Some(tcp) = enr.tcp4() {
62        log::info!("TCP Port:{}", tcp);
63    }
64    if let Some(udp) = enr.udp4() {
65        log::info!("UDP Port:{}", udp);
66    }
67
68    let multiaddrs = enr.multiaddr();
69    if !multiaddrs.is_empty() {
70        log::info!("Known multiaddrs:");
71        for multiaddr in multiaddrs {
72            log::info!("{}", multiaddr);
73        }
74    }
75}