discv5_cli/request_enr/
mod.rs1use discv5::{enr, ListenConfig};
2use libp2p_core::Multiaddr;
3
4mod enr_ext;
5use enr_ext::EnrExt;
6use std::net::Ipv4Addr;
7
8pub mod command;
10pub use command::*;
11
12pub async fn run(req: &RequestEnr) {
14 let multiaddr = req
16 .multiaddr
17 .parse::<Multiaddr>()
18 .expect("Invalid Multiaddr provided");
19
20 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 let enr = enr::Builder::default()
32 .ip4(listen_address)
33 .udp4(listen_port)
34 .build(&enr_key)
35 .unwrap();
36
37 let config = discv5::ConfigBuilder::new(listen_config).build();
39 let mut discv5: discv5::Discv5 = discv5::Discv5::new(enr, enr_key, config).unwrap();
40
41 discv5.start().await.unwrap();
43
44 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
52fn 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}