Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Add Experimental QUIC support #4577

Closed
wants to merge 88 commits into from
Closed
Show file tree
Hide file tree
Changes from 78 commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
61d4ae1
Initial quic support
AgeManning Aug 2, 2023
3eb4937
enable Quic transport on libp2p
jxs Aug 2, 2023
0ebdc79
allow support for the two different UDP ports,
jxs Aug 2, 2023
1344786
Merge pull request #5 from jxs/quic
AgeManning Aug 3, 2023
29db04d
Add ENR structure for quick and specify listening criteria
AgeManning Aug 3, 2023
5261b86
discovery: append quic multiaddrs along with tcp,
jxs Aug 4, 2023
7305595
Add some documentation for protocol developers
AgeManning Aug 7, 2023
6c97c5a
discovery return Enr's instead of PeerId's
jxs Aug 7, 2023
cd66aee
isolate multiaddresses gathering to dial on PeerManager
jxs Aug 7, 2023
f98f143
Merge pull request #6 from jxs/quic
AgeManning Aug 8, 2023
d8bb593
Small logging and comment changes
AgeManning Aug 8, 2023
d931d2a
Merge latest unstable
AgeManning Aug 8, 2023
4c9159c
Correct line spacing in book docs
AgeManning Aug 8, 2023
3492646
Appease the all-wise all-knowing clippy
AgeManning Aug 8, 2023
c4f0a38
fmt
AgeManning Aug 8, 2023
583c233
Correct quic port and improve logs
AgeManning Aug 8, 2023
1821941
Network: cleanup remove no longer required fn
jxs Aug 8, 2023
ae54809
Discovery:
jxs Aug 8, 2023
191e0ae
PeerManager: move should_dial() logic to dial_peer()
jxs Aug 8, 2023
31f45b7
cargo fmt
jxs Aug 8, 2023
d3953e0
fmt
AgeManning Aug 9, 2023
dcc78cc
Remove unused var
AgeManning Aug 9, 2023
c7c1749
Can't change a single line without fmt complaining
AgeManning Aug 9, 2023
14b42c1
Add QUIC to default ENR builder and fight tests
AgeManning Aug 10, 2023
0ff3c92
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Aug 10, 2023
632a57b
cargo fmt
jxs Aug 10, 2023
2def400
remove leftover println's
jxs Aug 10, 2023
7de61b5
fix benchmarks
jxs Aug 10, 2023
4771634
fix debug tests
jxs Aug 10, 2023
8858f0e
Correct port mapping bug
AgeManning Aug 11, 2023
8dfeb3c
Merge latest unstable
AgeManning Aug 11, 2023
5b5b262
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Aug 11, 2023
2fbd384
Merge pull request #7 from jxs/quic
AgeManning Aug 11, 2023
ee67351
fix enr-quic6-port test
jxs Aug 11, 2023
4c5cffc
update libp2p-quic to 0.9.2
jxs Aug 12, 2023
68d3a84
cargo clippy
jxs Aug 12, 2023
fbdd015
EnrExt: rename quic to quic4 for consistency
jxs Aug 12, 2023
a10019a
increase quic port on dht persistance test
jxs Aug 12, 2023
28b4e06
Merge branch 'unstable' of https://github.com/sigp/lighthouse into quic
jxs Aug 14, 2023
6498908
fix quic port on unused_v6_ports test
jxs Aug 14, 2023
91c4fad
make rpc tests use tcp multiaddr,
jxs Aug 14, 2023
ce67467
fix network_port_discovery_quic_port_flags_over_ipv4_and_ipv6 test
jxs Aug 14, 2023
3527d91
fix test
jxs Aug 16, 2023
137bb89
add quic to initialized ENR log
jxs Aug 16, 2023
99f72d0
add quic to ENR echo logs
jxs Aug 16, 2023
adfb7db
fix simulations by incrementing quic port by 1000
jxs Aug 17, 2023
ec31927
Merge branch 'unstable' of https://github.com/sigp/lighthouse into quic
jxs Aug 17, 2023
4adc916
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Aug 17, 2023
3d3d8c8
add quic rpc tests.
jxs Aug 20, 2023
1bb942b
put quic transport in the dns transport
jxs Aug 23, 2023
5c29f83
add multiaddress to connection established logging
jxs Aug 23, 2023
262b1e5
update local test net scripts for quic
jxs Aug 24, 2023
3cd11e6
Merge branch 'unstable' of https://github.com/sigp/lighthouse into quic
jxs Aug 25, 2023
ac83825
update libp2p-quic to stable
jxs Aug 25, 2023
9247496
add connected TCP and QUIC peers to prometheus metrics
jxs Aug 25, 2023
6236391
Differentiate the metrics in prometheus
AgeManning Aug 28, 2023
19f5e7e
Merge branch 'unstable' of https://github.com/sigp/lighthouse into quic
jxs Aug 28, 2023
13355bc
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Aug 28, 2023
e6294c5
cargo fmt
jxs Aug 28, 2023
96a3810
remove unrequired features section
jxs Aug 28, 2023
a8ab8c7
move parse_listening_addresses for better reviewing
jxs Aug 28, 2023
82f13bc
improve doc wording
jxs Aug 28, 2023
36a044a
fix metrics protocol identification
jxs Aug 28, 2023
9f74dd9
update socket address for quic connections,
jxs Aug 30, 2023
c14b845
address review
jxs Aug 31, 2023
b90e969
Remove references and assumptions to TCP based libp2p port
AgeManning Sep 4, 2023
aaced27
fmt
AgeManning Sep 4, 2023
f2cd1b1
Merge branch 'unstable' of https://github.com/sigp/lighthouse into quic
jxs Sep 4, 2023
5d0dee5
Clippy lints
AgeManning Sep 5, 2023
1e838a1
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Sep 5, 2023
655a757
Improve inbound connection log
AgeManning Sep 5, 2023
ed3dfb6
Update QUIC ports on UPnP mapping changes
AgeManning Sep 6, 2023
61715fe
Merge latest unstable
AgeManning Sep 7, 2023
19f3c46
fix quic metric protocol on connection close
jxs Sep 7, 2023
84cff62
Merge branch 'quic' of github.com:AgeManning/lighthouse into quic
jxs Sep 7, 2023
28d81d6
fix doppelganger_protection script
jxs Sep 7, 2023
e230a57
fix ports for doppelganger protection test on ci
jxs Sep 7, 2023
dd44476
fix missing port for last validator client
jxs Sep 7, 2023
bba8220
fix last two ports in doppelganger protection test
jxs Sep 8, 2023
df64302
fix port order on start_local_testnet.sh
jxs Sep 8, 2023
2be25d4
Hopefully improve port management in rpc tests
AgeManning Sep 11, 2023
d01b2e1
fmt
AgeManning Sep 11, 2023
3ac2513
Merge latest unstable
AgeManning Sep 11, 2023
74f0375
Update tests due to unstable merge
AgeManning Sep 11, 2023
fa11ff9
Small test changes
AgeManning Sep 12, 2023
231e7db
Nuke windows self-hosted runner
AgeManning Sep 13, 2023
a4faad5
Revert "Nuke windows self-hosted runner"
AgeManning Sep 13, 2023
41c8207
beacon node: move connected peer metrics,
jxs Sep 13, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
351 changes: 144 additions & 207 deletions Cargo.lock

Large diffs are not rendered by default.

14 changes: 0 additions & 14 deletions beacon_node/client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,20 +46,6 @@ impl<T: BeaconChainTypes> Client<T> {
self.http_metrics_listen_addr
}

/// Returns the ipv4 port of the client's libp2p stack, if it was started.
pub fn libp2p_listen_ipv4_port(&self) -> Option<u16> {
self.network_globals
.as_ref()
.and_then(|n| n.listen_port_tcp4())
}

/// Returns the ipv6 port of the client's libp2p stack, if it was started.
pub fn libp2p_listen_ipv6_port(&self) -> Option<u16> {
self.network_globals
.as_ref()
.and_then(|n| n.listen_port_tcp6())
}

/// Returns the list of libp2p addresses the client is listening to.
pub fn libp2p_listen_addresses(&self) -> Option<Vec<Multiaddr>> {
self.network_globals.as_ref().map(|n| n.listen_multiaddrs())
Expand Down
17 changes: 4 additions & 13 deletions beacon_node/http_api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2825,12 +2825,8 @@ pub fn serve<T: BeaconChainTypes>(
})?;

if let Some(peer_info) = network_globals.peers.read().peer_info(&peer_id) {
let address = if let Some(socket_addr) = peer_info.seen_addresses().next() {
let mut addr = lighthouse_network::Multiaddr::from(socket_addr.ip());
addr.push(lighthouse_network::multiaddr::Protocol::Tcp(
socket_addr.port(),
));
addr.to_string()
let address = if let Some(multiaddr) = peer_info.seen_multiaddrs().next() {
multiaddr.to_string()
} else if let Some(addr) = peer_info.listening_addresses().first() {
addr.to_string()
} else {
Expand Down Expand Up @@ -2878,13 +2874,8 @@ pub fn serve<T: BeaconChainTypes>(
.peers()
.for_each(|(peer_id, peer_info)| {
let address =
if let Some(socket_addr) = peer_info.seen_addresses().next() {
let mut addr =
lighthouse_network::Multiaddr::from(socket_addr.ip());
addr.push(lighthouse_network::multiaddr::Protocol::Tcp(
socket_addr.port(),
));
addr.to_string()
if let Some(multiaddr) = peer_info.seen_multiaddrs().next() {
multiaddr.to_string()
} else if let Some(addr) = peer_info.listening_addresses().first() {
addr.to_string()
} else {
Expand Down
2 changes: 0 additions & 2 deletions beacon_node/http_api/src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,6 @@ pub async fn create_api_server_on_port<T: BeaconChainTypes>(
let enr = EnrBuilder::new("v4").build(&enr_key).unwrap();
let network_globals = Arc::new(NetworkGlobals::new(
enr.clone(),
Some(TCP_PORT),
None,
meta_data,
vec![],
false,
Expand Down
6 changes: 2 additions & 4 deletions beacon_node/lighthouse_network/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,13 @@ prometheus-client = "0.21.0"
unused_port = { path = "../../common/unused_port" }
delay_map = "0.3.0"
void = "1"
libp2p-quic= { version = "0.9.2", features=["tokio"]}
libp2p-mplex = "0.40.0"

[dependencies.libp2p]
version = "0.52"
default-features = false
features = ["websocket", "identify", "yamux", "noise", "gossipsub", "dns", "tcp", "tokio", "plaintext", "secp256k1", "macros", "ecdsa"]
features = ["identify", "yamux", "noise", "gossipsub", "dns", "tcp", "tokio", "plaintext", "secp256k1", "macros", "ecdsa"]

[dev-dependencies]
slog-term = "2.6.0"
Expand All @@ -59,6 +60,3 @@ exit-future = "0.2.0"
void = "1"
quickcheck = "0.9.2"
quickcheck_macros = "0.9.1"

[features]
libp2p-websocket = []
86 changes: 61 additions & 25 deletions beacon_node/lighthouse_network/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,24 @@ pub struct Config {
/// that no discovery address has been set in the CLI args.
pub enr_address: (Option<Ipv4Addr>, Option<Ipv6Addr>),

/// The udp4 port to broadcast to peers in order to reach back for discovery.
/// The udp ipv4 port to broadcast to peers in order to reach back for discovery.
pub enr_udp4_port: Option<u16>,

/// The tcp4 port to broadcast to peers in order to reach back for libp2p services.
/// The quic ipv4 port to broadcast to peers in order to reach back for libp2p services.
pub enr_quic4_port: Option<u16>,

/// The tcp ipv4 port to broadcast to peers in order to reach back for libp2p services.
pub enr_tcp4_port: Option<u16>,

/// The udp6 port to broadcast to peers in order to reach back for discovery.
/// The udp ipv6 port to broadcast to peers in order to reach back for discovery.
pub enr_udp6_port: Option<u16>,

/// The tcp6 port to broadcast to peers in order to reach back for libp2p services.
/// The tcp ipv6 port to broadcast to peers in order to reach back for libp2p services.
pub enr_tcp6_port: Option<u16>,

/// The quic ipv6 port to broadcast to peers in order to reach back for libp2p services.
pub enr_quic6_port: Option<u16>,

/// Target number of connected peers.
pub target_peers: usize,

Expand Down Expand Up @@ -102,6 +108,9 @@ pub struct Config {
/// Disables the discovery protocol from starting.
pub disable_discovery: bool,

/// Disables quic support.
pub disable_quic_support: bool,

/// Attempt to construct external port mappings with UPnP.
pub upnp_enabled: bool,

Expand Down Expand Up @@ -149,57 +158,76 @@ impl Config {
/// Sets the listening address to use an ipv4 address. The discv5 ip_mode and table filter are
/// adjusted accordingly to ensure addresses that are present in the enr are globally
/// reachable.
pub fn set_ipv4_listening_address(&mut self, addr: Ipv4Addr, tcp_port: u16, udp_port: u16) {
pub fn set_ipv4_listening_address(
&mut self,
addr: Ipv4Addr,
tcp_port: u16,
disc_port: u16,
quic_port: u16,
) {
self.listen_addresses = ListenAddress::V4(ListenAddr {
addr,
udp_port,
disc_port,
quic_port,
tcp_port,
});
self.discv5_config.listen_config = discv5::ListenConfig::from_ip(addr.into(), udp_port);
self.discv5_config.listen_config = discv5::ListenConfig::from_ip(addr.into(), disc_port);
self.discv5_config.table_filter = |enr| enr.ip4().as_ref().map_or(false, is_global_ipv4)
}

/// Sets the listening address to use an ipv6 address. The discv5 ip_mode and table filter is
/// adjusted accordingly to ensure addresses that are present in the enr are globally
/// reachable.
pub fn set_ipv6_listening_address(&mut self, addr: Ipv6Addr, tcp_port: u16, udp_port: u16) {
pub fn set_ipv6_listening_address(
&mut self,
addr: Ipv6Addr,
tcp_port: u16,
disc_port: u16,
quic_port: u16,
) {
self.listen_addresses = ListenAddress::V6(ListenAddr {
addr,
udp_port,
disc_port,
quic_port,
tcp_port,
});

self.discv5_config.listen_config = discv5::ListenConfig::from_ip(addr.into(), udp_port);
self.discv5_config.listen_config = discv5::ListenConfig::from_ip(addr.into(), disc_port);
self.discv5_config.table_filter = |enr| enr.ip6().as_ref().map_or(false, is_global_ipv6)
}

/// Sets the listening address to use both an ipv4 and ipv6 address. The discv5 ip_mode and
/// table filter is adjusted accordingly to ensure addresses that are present in the enr are
/// globally reachable.
#[allow(clippy::too_many_arguments)]
pub fn set_ipv4_ipv6_listening_addresses(
&mut self,
v4_addr: Ipv4Addr,
tcp4_port: u16,
udp4_port: u16,
disc4_port: u16,
quic4_port: u16,
v6_addr: Ipv6Addr,
tcp6_port: u16,
udp6_port: u16,
disc6_port: u16,
quic6_port: u16,
) {
self.listen_addresses = ListenAddress::DualStack(
ListenAddr {
addr: v4_addr,
udp_port: udp4_port,
disc_port: disc4_port,
quic_port: quic4_port,
tcp_port: tcp4_port,
},
ListenAddr {
addr: v6_addr,
udp_port: udp6_port,
disc_port: disc6_port,
quic_port: quic6_port,
tcp_port: tcp6_port,
},
);
self.discv5_config.listen_config = discv5::ListenConfig::default()
.with_ipv4(v4_addr, udp4_port)
.with_ipv6(v6_addr, udp6_port);
.with_ipv4(v4_addr, disc4_port)
.with_ipv6(v6_addr, disc6_port);

self.discv5_config.table_filter = |enr| match (&enr.ip4(), &enr.ip6()) {
(None, None) => false,
Expand All @@ -213,27 +241,32 @@ impl Config {
match listen_addr {
ListenAddress::V4(ListenAddr {
addr,
udp_port,
disc_port,
quic_port,
tcp_port,
}) => self.set_ipv4_listening_address(addr, tcp_port, udp_port),
}) => self.set_ipv4_listening_address(addr, tcp_port, disc_port, quic_port),
ListenAddress::V6(ListenAddr {
addr,
udp_port,
disc_port,
quic_port,
tcp_port,
}) => self.set_ipv6_listening_address(addr, tcp_port, udp_port),
}) => self.set_ipv6_listening_address(addr, tcp_port, disc_port, quic_port),
ListenAddress::DualStack(
ListenAddr {
addr: ip4addr,
udp_port: udp4_port,
disc_port: disc4_port,
quic_port: quic4_port,
tcp_port: tcp4_port,
},
ListenAddr {
addr: ip6addr,
udp_port: udp6_port,
disc_port: disc6_port,
quic_port: quic6_port,
tcp_port: tcp6_port,
},
) => self.set_ipv4_ipv6_listening_addresses(
ip4addr, tcp4_port, udp4_port, ip6addr, tcp6_port, udp6_port,
ip4addr, tcp4_port, disc4_port, quic4_port, ip6addr, tcp6_port, disc6_port,
quic6_port,
),
}
}
Expand Down Expand Up @@ -272,7 +305,8 @@ impl Default for Config {
);
let listen_addresses = ListenAddress::V4(ListenAddr {
addr: Ipv4Addr::UNSPECIFIED,
udp_port: 9000,
disc_port: 9000,
quic_port: 9001,
tcp_port: 9000,
});

Expand Down Expand Up @@ -305,10 +339,11 @@ impl Default for Config {
network_dir,
listen_addresses,
enr_address: (None, None),

enr_udp4_port: None,
enr_quic4_port: None,
enr_tcp4_port: None,
enr_udp6_port: None,
enr_quic6_port: None,
enr_tcp6_port: None,
target_peers: 50,
gs_config,
Expand All @@ -320,6 +355,7 @@ impl Default for Config {
disable_peer_scoring: false,
client_version: lighthouse_version::version_with_platform(),
disable_discovery: false,
disable_quic_support: false,
upnp_enabled: true,
network_load: 3,
private: false,
Expand Down
30 changes: 28 additions & 2 deletions beacon_node/lighthouse_network/src/discovery/enr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ use std::path::Path;
use std::str::FromStr;
use types::{EnrForkId, EthSpec};

use super::enr_ext::{EnrExt, QUIC6_ENR_KEY, QUIC_ENR_KEY};

/// The ENR field specifying the fork id.
pub const ETH2_ENR_KEY: &str = "eth2";
/// The ENR field specifying the attestation subnet bitfield.
Expand Down Expand Up @@ -142,7 +144,7 @@ pub fn build_or_load_enr<T: EthSpec>(

pub fn create_enr_builder_from_config<T: EnrKey>(
config: &NetworkConfig,
enable_tcp: bool,
enable_libp2p: bool,
) -> EnrBuilder<T> {
let mut builder = EnrBuilder::new("v4");
let (maybe_ipv4_address, maybe_ipv6_address) = &config.enr_address;
Expand All @@ -163,7 +165,28 @@ pub fn create_enr_builder_from_config<T: EnrKey>(
builder.udp6(udp6_port);
}

if enable_tcp {
if enable_libp2p {
// Add QUIC fields to the ENR.
// Since QUIC is used as an alternative transport for the libp2p protocols,
// the related fields should only be added when both QUIC and libp2p are enabled
if !config.disable_quic_support {
// If we are listening on ipv4, add the quic ipv4 port.
if let Some(quic4_port) = config
.enr_quic4_port
.or_else(|| config.listen_addrs().v4().map(|v4_addr| v4_addr.quic_port))
{
builder.add_value(QUIC_ENR_KEY, &quic4_port);
}

// If we are listening on ipv6, add the quic ipv6 port.
if let Some(quic6_port) = config
.enr_quic6_port
.or_else(|| config.listen_addrs().v6().map(|v6_addr| v6_addr.quic_port))
{
builder.add_value(QUIC6_ENR_KEY, &quic6_port);
}
}

// If the ENR port is not set, and we are listening over that ip version, use the listening port instead.
let tcp4_port = config
.enr_tcp4_port
Expand Down Expand Up @@ -218,6 +241,9 @@ fn compare_enr(local_enr: &Enr, disk_enr: &Enr) -> bool {
// tcp ports must match
&& local_enr.tcp4() == disk_enr.tcp4()
&& local_enr.tcp6() == disk_enr.tcp6()
// quic ports must match
&& local_enr.quic4() == disk_enr.quic4()
&& local_enr.quic6() == disk_enr.quic6()
// must match on the same fork
&& local_enr.get(ETH2_ENR_KEY) == disk_enr.get(ETH2_ENR_KEY)
// take preference over disk udp port if one is not specified
Expand Down
Loading
Loading