diff --git a/Cargo.lock b/Cargo.lock index 99a6d8f71..e99c4753c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6631,6 +6631,7 @@ dependencies = [ name = "reth-network-api" version = "0.2.0-beta.5" dependencies = [ + "enr", "reth-discv4", "reth-eth-wire", "reth-primitives", diff --git a/crates/net/network-api/Cargo.toml b/crates/net/network-api/Cargo.toml index 002dd6c2f..dcf4089cd 100644 --- a/crates/net/network-api/Cargo.toml +++ b/crates/net/network-api/Cargo.toml @@ -17,11 +17,13 @@ reth-primitives.workspace = true reth-eth-wire.workspace = true reth-rpc-types.workspace = true reth-discv4.workspace = true -# io -serde = { workspace = true, features = ["derive"], optional = true } + +# eth +enr = { workspace = true, default-features = false, features = ["rust-secp256k1"] } # misc thiserror.workspace = true +serde = { workspace = true, features = ["derive"], optional = true } tokio = { workspace = true, features = ["sync"] } [features] diff --git a/crates/net/network-api/src/lib.rs b/crates/net/network-api/src/lib.rs index 28de2eca7..0c43273cd 100644 --- a/crates/net/network-api/src/lib.rs +++ b/crates/net/network-api/src/lib.rs @@ -57,6 +57,9 @@ pub trait PeersInfo: Send + Sync { /// Returns the Ethereum Node Record of the node. fn local_node_record(&self) -> NodeRecord; + + /// Returns the local ENR of the node. + fn local_enr(&self) -> enr::Enr; } /// Provides an API for managing the peers of the network. diff --git a/crates/net/network-api/src/noop.rs b/crates/net/network-api/src/noop.rs index b27680f69..b6a0fa846 100644 --- a/crates/net/network-api/src/noop.rs +++ b/crates/net/network-api/src/noop.rs @@ -7,6 +7,7 @@ use crate::{ NetworkError, NetworkInfo, PeerInfo, PeerKind, Peers, PeersInfo, Reputation, ReputationChangeKind, }; +use enr::{secp256k1::SecretKey, Enr}; use reth_discv4::DEFAULT_DISCOVERY_PORT; use reth_eth_wire::{DisconnectReason, ProtocolVersion}; use reth_primitives::{Chain, NodeRecord, PeerId}; @@ -60,6 +61,11 @@ impl PeersInfo for NoopNetwork { fn local_node_record(&self) -> NodeRecord { NodeRecord::new(self.local_addr(), PeerId::random()) } + + fn local_enr(&self) -> Enr { + let sk = SecretKey::from_slice(&[0xcd; 32]).unwrap(); + Enr::builder().build(&sk).unwrap() + } } impl Peers for NoopNetwork { diff --git a/crates/net/network/src/network.rs b/crates/net/network/src/network.rs index 324b81811..7104e442e 100644 --- a/crates/net/network/src/network.rs +++ b/crates/net/network/src/network.rs @@ -3,6 +3,7 @@ use crate::{ peers::PeersHandle, protocol::RlpxSubProtocol, swarm::NetworkConnectionState, transactions::TransactionsHandle, FetchClient, }; +use enr::Enr; use parking_lot::Mutex; use reth_discv4::Discv4; use reth_eth_wire::{DisconnectReason, NewBlock, NewPooledTransactionHashes, SharedTransactions}; @@ -237,6 +238,20 @@ impl PeersInfo for NetworkHandle { NodeRecord::new(socket_addr, id) } } + + fn local_enr(&self) -> Enr { + let local_node_record = self.local_node_record(); + let mut builder = Enr::builder(); + builder.ip(local_node_record.address); + if local_node_record.address.is_ipv4() { + builder.udp4(local_node_record.udp_port); + builder.tcp4(local_node_record.tcp_port); + } else { + builder.udp6(local_node_record.udp_port); + builder.tcp6(local_node_record.tcp_port); + } + builder.build(&self.inner.secret_key).expect("valid enr") + } } impl Peers for NetworkHandle {