From 7cd963e6bb7ad35458defc94f3c6a24eb24f249c Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Thu, 15 Aug 2019 18:48:39 +1000 Subject: [PATCH] Update bootstrapper libp2p address finding --- beacon_node/client/src/bootstrapper.rs | 31 +++++++++++++++++++++++++- beacon_node/client/src/config.rs | 26 +++++++++------------ beacon_node/src/main.rs | 5 +++++ beacon_node/src/run.rs | 7 +----- 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/beacon_node/client/src/bootstrapper.rs b/beacon_node/client/src/bootstrapper.rs index 1fd8f16592..2c8cf6afc2 100644 --- a/beacon_node/client/src/bootstrapper.rs +++ b/beacon_node/client/src/bootstrapper.rs @@ -1,5 +1,9 @@ -use eth2_libp2p::{Enr, Multiaddr}; +use eth2_libp2p::{ + multiaddr::{Multiaddr, Protocol}, + Enr, +}; use reqwest::{Error as HttpError, Url}; +use std::borrow::Cow; use std::net::Ipv4Addr; use types::{BeaconBlock, BeaconState, Checkpoint, EthSpec, Slot}; use url::Host; @@ -27,6 +31,31 @@ impl Bootstrapper { }) } + pub fn best_effort_multiaddr(&self) -> Option { + let tcp_port = self.first_listening_tcp_port()?; + + let mut multiaddr = Multiaddr::with_capacity(2); + + match self.url.host()? { + Host::Ipv4(addr) => multiaddr.push(Protocol::Ip4(addr)), + Host::Domain(s) => multiaddr.push(Protocol::Dns4(Cow::Borrowed(s))), + _ => return None, + }; + + multiaddr.push(Protocol::Tcp(tcp_port)); + + Some(multiaddr) + } + + fn first_listening_tcp_port(&self) -> Option { + self.listen_addresses().ok()?.iter().find_map(|multiaddr| { + multiaddr.iter().find_map(|protocol| match protocol { + Protocol::Tcp(port) => Some(port), + _ => None, + }) + }) + } + pub fn server_ipv4_addr(&self) -> Option { match self.url.host()? { Host::Ipv4(addr) => Some(addr), diff --git a/beacon_node/client/src/config.rs b/beacon_node/client/src/config.rs index 5dd0eef52f..1a985fb4af 100644 --- a/beacon_node/client/src/config.rs +++ b/beacon_node/client/src/config.rs @@ -1,6 +1,5 @@ use crate::{Bootstrapper, Eth2Config}; use clap::ArgMatches; -use eth2_libp2p::multiaddr::{Multiaddr, Protocol}; use network::NetworkConfig; use serde_derive::{Deserialize, Serialize}; use slog::{info, o, warn, Drain}; @@ -169,23 +168,18 @@ fn do_bootstrapping(config: &mut Config, server: String, log: &slog::Logger) -> config.network.boot_nodes.push(bootstrapper.enr()?); - if let Some(server_ip) = bootstrapper.server_ipv4_addr() { - let server_multiaddr: Multiaddr = bootstrapper - .listen_addresses()? - .first() - .ok_or_else(|| "Bootstrap peer returned an empty list of listen addresses")? - // Iterate through the components of the Multiaddr, replacing any Ipv4 address with the - // server address. - .iter() - .map(|protocol| match protocol { - Protocol::Ip4(_) => Protocol::Ip4(server_ip), - _ => protocol, - }) - .collect::(); - + if let Some(server_multiaddr) = bootstrapper.best_effort_multiaddr() { + info!( + log, + "Estimated bootstrapper libp2p address"; + "multiaddr" => format!("{:?}", server_multiaddr) + ); config.network.libp2p_nodes.push(server_multiaddr); } else { - warn!(log, "Unable to determine bootstrap server Ipv4 address. Unable to add server as libp2p peer."); + warn!( + log, + "Unable to estimate a bootstrapper libp2p address, this node may not find any peers." + ); } Ok(()) diff --git a/beacon_node/src/main.rs b/beacon_node/src/main.rs index ae48f692b6..04366baa7a 100644 --- a/beacon_node/src/main.rs +++ b/beacon_node/src/main.rs @@ -237,6 +237,11 @@ fn main() { let mut log = slog::Logger::root(drain.fuse(), o!()); + warn!( + log, + "Ethereum 2.0 is pre-release. This software is experimental." + ); + let data_dir = match matches .value_of("datadir") .and_then(|v| Some(PathBuf::from(v))) diff --git a/beacon_node/src/run.rs b/beacon_node/src/run.rs index c16d23e5f1..5066231d55 100644 --- a/beacon_node/src/run.rs +++ b/beacon_node/src/run.rs @@ -4,7 +4,7 @@ use client::{ }; use futures::sync::oneshot; use futures::Future; -use slog::{error, info, warn}; +use slog::{error, info}; use std::cell::RefCell; use std::path::Path; use std::path::PathBuf; @@ -42,11 +42,6 @@ pub fn run_beacon_node( let other_client_config = client_config.clone(); - warn!( - log, - "Ethereum 2.0 is pre-release. This software is experimental." - ); - info!( log, "BeaconNode init";