use discv5::{enr, enr::CombinedKey, ConfigBuilder, Discv5, Event, ListenConfig};
use std::net::Ipv4Addr;
fn main() {
let filter_layer = tracing_subscriber::EnvFilter::try_from_default_env()
.or_else(|_| tracing_subscriber::EnvFilter::try_new("info"))
.unwrap();
let _ = tracing_subscriber::fmt()
.with_env_filter(filter_layer)
.try_init();
let listen_config = ListenConfig::Ipv4 {
ip: Ipv4Addr::UNSPECIFIED,
port: 9000,
};
let enr_key = CombinedKey::generate_secp256k1();
let enr = enr::Enr::empty(&enr_key).unwrap();
let runtime = tokio::runtime::Builder::new_multi_thread()
.thread_name("Discv5-example")
.enable_all()
.build()
.unwrap();
let config = ConfigBuilder::new(listen_config).build();
let mut discv5: Discv5 = Discv5::new(enr, enr_key, config).unwrap();
if let Some(base64_enr) = std::env::args().nth(1) {
match base64_enr.parse::<enr::Enr<CombinedKey>>() {
Ok(enr) => {
println!(
"ENR Read. ip: {:?}, udp_port {:?}, tcp_port: {:?}",
enr.ip4(),
enr.udp4(),
enr.tcp4()
);
if let Err(e) = discv5.add_enr(enr) {
println!("ENR was not added: {e}");
}
}
Err(e) => panic!("Decoding ENR failed: {}", e),
}
}
runtime.block_on(async {
discv5.start().await.unwrap();
println!("Server started");
let mut event_stream = discv5.event_stream().await.unwrap();
loop {
match event_stream.recv().await {
Some(Event::SocketUpdated(addr)) => {
println!("Nodes ENR socket address has been updated to: {addr:?}");
}
Some(Event::Discovered(enr)) => {
println!("A peer has been discovered: {}", enr.node_id());
}
_ => {}
}
}
})
}