Skip to content

Commit

Permalink
fix: use default angelfood bootnodes if network is selected (ethereum…
Browse files Browse the repository at this point in the history
…#1463)

* fix: use default angelfood bootnodes if network is selected
  • Loading branch information
njgheorghita authored Sep 24, 2024
1 parent 3152246 commit 4ca6370
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 50 deletions.
94 changes: 70 additions & 24 deletions ethportal-api/src/types/bootnodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,26 @@ use std::str::FromStr;

use anyhow::anyhow;

use crate::types::enr::Enr;
use crate::types::{enr::Enr, network::Network};

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Bootnode {
pub enr: Enr,
pub alias: String,
}

impl From<Enr> for Bootnode {
fn from(enr: Enr) -> Self {
Iterator::chain(DEFAULT_BOOTNODES.iter(), ANGELFOOD_BOOTNODES.iter())
.find(|bootnode| bootnode.enr == enr)
.cloned()
.unwrap_or_else(|| Self {
enr,
alias: "custom".to_string(),
})
}
}

lazy_static! {
pub static ref DEFAULT_BOOTNODES: Vec<Bootnode> = vec![
// https://github.com/ethereum/portal-network-specs/blob/master/bootnodes.md
Expand Down Expand Up @@ -70,6 +82,13 @@ lazy_static! {
Enr::from_str("enr:-IS4QA5hpJikeDFf1DD1_Le6_ylgrLGpdwn3SRaneGu9hY2HUI7peHep0f28UUMzbC0PvlWjN8zSfnqMG07WVcCyBhADgmlkgnY0gmlwhKRc9-KJc2VjcDI1NmsxoQJMpHmGj1xSP1O-Mffk_jYIHVcg6tY5_CjmWVg1gJEsPIN1ZHCCE4o").expect("Parsing static bootnode enr to work"),
alias: "ultralight-4".to_string()
}];

// AngelFood bootstrap nodes
pub static ref ANGELFOOD_BOOTNODES: Vec<Bootnode> = vec![
Bootnode{
enr: Enr::from_str("enr:-LC4QMnoW2m4YYQRPjZhJ5hEpcA6a3V7iQs3slQ1TepzKBIVWQtjpcHsPINc0TcheMCbx6I2n5aax8M3AtUObt74ySUCY6p0IDVhYzI2NzViNGRmMjNhNmEwOWVjNDFkZTRlYTQ2ODQxNjk2ZTQ1YzSCaWSCdjSCaXCEQONKaYlzZWNwMjU2azGhAvZgYbpA9G8NQ6X4agu-R7Ymtu0hcX6xBQ--UEel_b6Pg3VkcIIjKA").expect("Parsing static bootnode enr to work"),
alias: "angelfood-trin-1".to_string()
}];
}

#[derive(Clone, Debug, Default, Eq, PartialEq)]
Expand All @@ -82,26 +101,20 @@ pub enum Bootnodes {
Custom(Vec<Bootnode>),
}

impl From<Enr> for Bootnode {
fn from(enr: Enr) -> Self {
for bootnode in DEFAULT_BOOTNODES.clone().into_iter() {
if bootnode.enr == enr {
return bootnode;
impl Bootnodes {
pub fn to_enrs(&self, network: Network) -> Vec<Enr> {
match (self, network) {
(Bootnodes::Default, Network::Mainnet) => {
DEFAULT_BOOTNODES.iter().map(|bn| bn.enr.clone()).collect()
}
(Bootnodes::Default, Network::Angelfood) => ANGELFOOD_BOOTNODES
.iter()
.map(|bn| bn.enr.clone())
.collect(),
(Bootnodes::None, _) => vec![],
(Bootnodes::Custom(bootnodes), _) => {
bootnodes.iter().map(|bn| bn.enr.clone()).collect()
}
}
Bootnode {
enr,
alias: "custom".to_string(),
}
}
}

impl From<Bootnodes> for Vec<Enr> {
fn from(bootnodes: Bootnodes) -> Self {
match bootnodes {
Bootnodes::Default => DEFAULT_BOOTNODES.iter().map(|bn| bn.enr.clone()).collect(),
Bootnodes::None => vec![],
Bootnodes::Custom(bootnodes) => bootnodes.iter().map(|bn| bn.enr.clone()).collect(),
}
}
}
Expand Down Expand Up @@ -135,18 +148,26 @@ mod test {
use rstest::rstest;

#[test_log::test]
fn test_bootnodes_default_with_angelfood_bootnodes() {
fn test_bootnodes_default_with_default_bootnodes() {
let config = TrinConfig::new_from(["trin"].iter()).unwrap();
assert_eq!(config.bootnodes, Bootnodes::Default);
let bootnodes: Vec<Enr> = config.bootnodes.into();
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Mainnet);
assert_eq!(bootnodes.len(), 11);
}

#[test_log::test]
fn test_bootnodes_default_with_explicit_default_bootnodes() {
let config = TrinConfig::new_from(["trin", "--bootnodes", "default"].iter()).unwrap();
assert_eq!(config.bootnodes, Bootnodes::Default);
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Mainnet);
assert_eq!(bootnodes.len(), 11);
}

#[test_log::test]
fn test_bootnodes_default_with_no_bootnodes() {
let config = TrinConfig::new_from(["trin", "--bootnodes", "none"].iter()).unwrap();
assert_eq!(config.bootnodes, Bootnodes::None);
let bootnodes: Vec<Enr> = config.bootnodes.into();
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Mainnet);
assert_eq!(bootnodes.len(), 0);
}

Expand All @@ -170,7 +191,32 @@ mod test {
}
_ => panic!("Bootnodes should be custom"),
};
let bootnodes: Vec<Enr> = config.bootnodes.into();
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Mainnet);
assert_eq!(bootnodes.len(), expected_length);
}

#[rstest]
fn test_angelfood_network_defaults_to_correct_bootnodes() {
let config = TrinConfig::new_from(["trin", "--network", "angelfood"].iter()).unwrap();
assert_eq!(config.bootnodes, Bootnodes::Default);
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Angelfood);
assert_eq!(bootnodes.len(), 1);
}

#[rstest]
fn test_custom_bootnodes_override_angelfood_default() {
let enr = "enr:-IS4QBISSFfBzsBrjq61iSIxPMfp5ShBTW6KQUglzH_tj8_SJaehXdlnZI-NAkTGeoclwnTB-pU544BQA44BiDZ2rkMBgmlkgnY0gmlwhKEjVaWJc2VjcDI1NmsxoQOSGugH1jSdiE_fRK1FIBe9oLxaWH8D_7xXSnaOVBe-SYN1ZHCCIyg";
let config =
TrinConfig::new_from(["trin", "--network", "angelfood", "--bootnodes", enr].iter())
.unwrap();
assert_eq!(
config.bootnodes,
Bootnodes::Custom(vec![Bootnode {
enr: Enr::from_str(enr).unwrap(),
alias: "custom".to_string(),
}])
);
let bootnodes: Vec<Enr> = config.bootnodes.to_enrs(Network::Angelfood);
assert_eq!(bootnodes.len(), 1);
}
}
13 changes: 7 additions & 6 deletions portalnet/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ use alloy_primitives::B256;
use ethportal_api::types::{
bootnodes::Bootnodes,
cli::{TrinConfig, DEFAULT_UTP_TRANSFER_LIMIT},
enr::Enr,
network::Network,
};

/// Capacity of the cache for observed `NodeAddress` values.
Expand All @@ -16,8 +18,7 @@ pub struct PortalnetConfig {
pub external_addr: Option<SocketAddr>,
pub private_key: B256,
pub listen_port: u16,
pub bootnodes: Bootnodes,
pub internal_ip: bool,
pub bootnodes: Vec<Enr>,
pub no_stun: bool,
pub no_upnp: bool,
pub node_addr_cache_capacity: usize,
Expand All @@ -27,14 +28,14 @@ pub struct PortalnetConfig {
pub utp_transfer_limit: usize,
}

// to be used inside test code only
impl Default for PortalnetConfig {
fn default() -> Self {
Self {
external_addr: None,
private_key: B256::random(),
listen_port: 4242,
bootnodes: Bootnodes::default(),
internal_ip: false,
bootnodes: Bootnodes::default().to_enrs(Network::Mainnet),
no_stun: false,
no_upnp: false,
node_addr_cache_capacity: NODE_ADDR_CACHE_CAPACITY,
Expand All @@ -51,13 +52,13 @@ impl PortalnetConfig {
external_addr: trin_config.external_addr,
private_key,
listen_port: trin_config.discovery_port,
bootnodes: trin_config.bootnodes.to_enrs(trin_config.network.network()),
no_stun: trin_config.no_stun,
no_upnp: trin_config.no_upnp,
bootnodes: trin_config.bootnodes.clone(),
node_addr_cache_capacity: NODE_ADDR_CACHE_CAPACITY,
disable_poke: trin_config.disable_poke,
trusted_block_root: trin_config.trusted_block_root,
utp_transfer_limit: trin_config.utp_transfer_limit,
..Default::default()
}
}
}
7 changes: 3 additions & 4 deletions portalnet/src/discovery.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,7 @@ impl Discovery {
let discv5 = Discv5::new(enr, enr_key, discv5_config)
.map_err(|e| format!("Failed to create discv5 instance: {e}"))?;

let bootnode_enrs: Vec<Enr> = portal_config.bootnodes.into();
for enr in bootnode_enrs {
for enr in portal_config.bootnodes {
if enr.node_id() == discv5.local_enr().node_id() {
warn!("Bootnode ENR is the same as the local ENR. Skipping.");
continue;
Expand Down Expand Up @@ -523,7 +522,7 @@ impl AsyncUdpSocket<UtpEnr> for Discv5UdpSocket {
mod tests {
use super::*;
use crate::utils::db::configure_node_data_dir;
use ethportal_api::types::{bootnodes::Bootnodes, portal_wire::MAINNET};
use ethportal_api::types::portal_wire::MAINNET;
use trin_utils::dir::create_temp_test_dir;

#[test]
Expand All @@ -537,7 +536,7 @@ mod tests {

let mut portalnet_config = PortalnetConfig {
private_key,
bootnodes: Bootnodes::None,
bootnodes: vec![],
..Default::default()
};

Expand Down
5 changes: 2 additions & 3 deletions trin-beacon/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use tracing::info;
use utp_rs::socket::UtpSocket;

use crate::{events::BeaconEvents, jsonrpc::BeaconRequestHandler, network::BeaconNetwork};
use ethportal_api::types::{enr::Enr, jsonrpc::request::BeaconJsonRpcRequest};
use ethportal_api::types::jsonrpc::request::BeaconJsonRpcRequest;
use portalnet::{
config::PortalnetConfig,
discovery::{Discovery, UtpEnr},
Expand Down Expand Up @@ -82,10 +82,9 @@ pub fn spawn_beacon_network(
portalnet_config: PortalnetConfig,
beacon_message_rx: mpsc::UnboundedReceiver<OverlayRequest>,
) -> JoinHandle<()> {
let bootnode_enrs: Vec<Enr> = portalnet_config.bootnodes.into();
info!(
"About to spawn Beacon Network with {} boot nodes.",
bootnode_enrs.len()
portalnet_config.bootnodes.len()
);

tokio::spawn(async move {
Expand Down
5 changes: 2 additions & 3 deletions trin-beacon/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use utp_rs::socket::UtpSocket;

use crate::{storage::BeaconStorage, sync::BeaconSync, validation::BeaconValidator};
use ethportal_api::{
types::{distance::XorMetric, enr::Enr, network::Subnetwork},
types::{distance::XorMetric, network::Subnetwork},
BeaconContentKey,
};
use light_client::{consensus::rpc::portal_rpc::PortalRpc, database::FileDB, Client};
Expand Down Expand Up @@ -39,9 +39,8 @@ impl BeaconNetwork {
portal_config: PortalnetConfig,
header_oracle: Arc<RwLock<HeaderOracle>>,
) -> anyhow::Result<Self> {
let bootnode_enrs: Vec<Enr> = portal_config.bootnodes.into();
let config = OverlayConfig {
bootnode_enrs,
bootnode_enrs: portal_config.bootnodes,
utp_transfer_limit: portal_config.utp_transfer_limit,
gossip_dropped: GOSSIP_DROPPED,
..Default::default()
Expand Down
5 changes: 2 additions & 3 deletions trin-history/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use tracing::info;
use utp_rs::socket::UtpSocket;

use crate::{events::HistoryEvents, jsonrpc::HistoryRequestHandler};
use ethportal_api::types::{enr::Enr, jsonrpc::request::HistoryJsonRpcRequest};
use ethportal_api::types::jsonrpc::request::HistoryJsonRpcRequest;
use portalnet::{
config::PortalnetConfig,
discovery::{Discovery, UtpEnr},
Expand Down Expand Up @@ -83,10 +83,9 @@ pub fn spawn_history_network(
portalnet_config: PortalnetConfig,
history_message_rx: mpsc::UnboundedReceiver<OverlayRequest>,
) -> JoinHandle<()> {
let bootnode_enrs: Vec<Enr> = portalnet_config.bootnodes.into();
info!(
"About to spawn History Network with {} boot nodes",
bootnode_enrs.len()
portalnet_config.bootnodes.len()
);

tokio::spawn(async move {
Expand Down
5 changes: 2 additions & 3 deletions trin-history/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use utp_rs::socket::UtpSocket;

use crate::storage::HistoryStorage;
use ethportal_api::{
types::{distance::XorMetric, enr::Enr, network::Subnetwork},
types::{distance::XorMetric, network::Subnetwork},
HistoryContentKey,
};
use portalnet::{
Expand Down Expand Up @@ -39,9 +39,8 @@ impl HistoryNetwork {
portal_config: PortalnetConfig,
header_oracle: Arc<RwLock<HeaderOracle>>,
) -> anyhow::Result<Self> {
let bootnode_enrs: Vec<Enr> = portal_config.bootnodes.into();
let config = OverlayConfig {
bootnode_enrs,
bootnode_enrs: portal_config.bootnodes,
disable_poke: portal_config.disable_poke,
gossip_dropped: GOSSIP_DROPPED,
utp_transfer_limit: portal_config.utp_transfer_limit,
Expand Down
5 changes: 2 additions & 3 deletions trin-state/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use tracing::info;
use utp_rs::socket::UtpSocket;

use crate::{events::StateEvents, jsonrpc::StateRequestHandler};
use ethportal_api::types::{enr::Enr, jsonrpc::request::StateJsonRpcRequest};
use ethportal_api::types::jsonrpc::request::StateJsonRpcRequest;
use portalnet::{
config::PortalnetConfig,
discovery::{Discovery, UtpEnr},
Expand Down Expand Up @@ -85,10 +85,9 @@ pub fn spawn_state_network(
portalnet_config: PortalnetConfig,
state_message_rx: mpsc::UnboundedReceiver<OverlayRequest>,
) -> JoinHandle<()> {
let bootnode_enrs: Vec<Enr> = portalnet_config.bootnodes.into();
info!(
"About to spawn State Network with {} boot nodes.",
bootnode_enrs.len()
portalnet_config.bootnodes.len()
);

tokio::spawn(async move {
Expand Down
2 changes: 1 addition & 1 deletion trin-state/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ impl StateNetwork {
debug!("Poke is not supported by the State Network")
}
let config = OverlayConfig {
bootnode_enrs: portal_config.bootnodes.into(),
bootnode_enrs: portal_config.bootnodes,
disable_poke: DISABLE_POKE,
gossip_dropped: GOSSIP_DROPPED,
utp_transfer_limit: portal_config.utp_transfer_limit,
Expand Down

0 comments on commit 4ca6370

Please sign in to comment.