mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 18:32:42 +00:00
Merge unstable 20230925 into deneb-free-blobs.
This commit is contained in:
@@ -13,7 +13,6 @@ use tokio::runtime::Runtime;
|
||||
use types::{
|
||||
ChainSpec, EnrForkId, Epoch, EthSpec, ForkContext, ForkName, Hash256, MinimalEthSpec, Slot,
|
||||
};
|
||||
use unused_port::unused_tcp4_port;
|
||||
|
||||
type E = MinimalEthSpec;
|
||||
type ReqId = usize;
|
||||
@@ -71,15 +70,19 @@ pub fn build_log(level: slog::Level, enabled: bool) -> slog::Logger {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build_config(port: u16, mut boot_nodes: Vec<Enr>) -> NetworkConfig {
|
||||
pub fn build_config(mut boot_nodes: Vec<Enr>) -> NetworkConfig {
|
||||
let mut config = NetworkConfig::default();
|
||||
|
||||
// Find unused ports by using the 0 port.
|
||||
let port = 0;
|
||||
|
||||
let random_path: u16 = rand::random();
|
||||
let path = TempBuilder::new()
|
||||
.prefix(&format!("libp2p_test{}", port))
|
||||
.prefix(&format!("libp2p_test_{}", random_path))
|
||||
.tempdir()
|
||||
.unwrap();
|
||||
|
||||
config.set_ipv4_listening_address(std::net::Ipv4Addr::UNSPECIFIED, port, port);
|
||||
config.enr_udp4_port = Some(port);
|
||||
config.set_ipv4_listening_address(std::net::Ipv4Addr::UNSPECIFIED, port, port, port);
|
||||
config.enr_address = (Some(std::net::Ipv4Addr::LOCALHOST), None);
|
||||
config.boot_nodes_enr.append(&mut boot_nodes);
|
||||
config.network_dir = path.into_path();
|
||||
@@ -99,8 +102,7 @@ pub async fn build_libp2p_instance(
|
||||
fork_name: ForkName,
|
||||
spec: &ChainSpec,
|
||||
) -> Libp2pInstance {
|
||||
let port = unused_tcp4_port().unwrap();
|
||||
let config = build_config(port, boot_nodes);
|
||||
let config = build_config(boot_nodes);
|
||||
// launch libp2p service
|
||||
|
||||
let (signal, exit) = exit_future::signal();
|
||||
@@ -127,6 +129,12 @@ pub fn get_enr(node: &LibP2PService<ReqId, E>) -> Enr {
|
||||
node.local_enr()
|
||||
}
|
||||
|
||||
// Protocol for the node pair connection.
|
||||
pub enum Protocol {
|
||||
Tcp,
|
||||
Quic,
|
||||
}
|
||||
|
||||
// Constructs a pair of nodes with separate loggers. The sender dials the receiver.
|
||||
// This returns a (sender, receiver) pair.
|
||||
#[allow(dead_code)]
|
||||
@@ -135,6 +143,7 @@ pub async fn build_node_pair(
|
||||
log: &slog::Logger,
|
||||
fork_name: ForkName,
|
||||
spec: &ChainSpec,
|
||||
protocol: Protocol,
|
||||
) -> (Libp2pInstance, Libp2pInstance) {
|
||||
let sender_log = log.new(o!("who" => "sender"));
|
||||
let receiver_log = log.new(o!("who" => "receiver"));
|
||||
@@ -142,33 +151,57 @@ pub async fn build_node_pair(
|
||||
let mut sender = build_libp2p_instance(rt.clone(), vec![], sender_log, fork_name, spec).await;
|
||||
let mut receiver = build_libp2p_instance(rt, vec![], receiver_log, fork_name, spec).await;
|
||||
|
||||
let receiver_multiaddr = receiver.local_enr().multiaddr()[1].clone();
|
||||
|
||||
// let the two nodes set up listeners
|
||||
let sender_fut = async {
|
||||
loop {
|
||||
if let NetworkEvent::NewListenAddr(_) = sender.next_event().await {
|
||||
return;
|
||||
if let NetworkEvent::NewListenAddr(addr) = sender.next_event().await {
|
||||
// Only end once we've listened on the protocol we care about
|
||||
match protocol {
|
||||
Protocol::Tcp => {
|
||||
if addr.iter().any(|multiaddr_proto| {
|
||||
matches!(multiaddr_proto, libp2p::multiaddr::Protocol::Tcp(_))
|
||||
}) {
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
Protocol::Quic => {
|
||||
if addr.iter().any(|multiaddr_proto| {
|
||||
matches!(multiaddr_proto, libp2p::multiaddr::Protocol::QuicV1)
|
||||
}) {
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
let receiver_fut = async {
|
||||
loop {
|
||||
if let NetworkEvent::NewListenAddr(_) = receiver.next_event().await {
|
||||
return;
|
||||
if let NetworkEvent::NewListenAddr(addr) = receiver.next_event().await {
|
||||
match protocol {
|
||||
Protocol::Tcp => {
|
||||
if addr.iter().any(|multiaddr_proto| {
|
||||
matches!(multiaddr_proto, libp2p::multiaddr::Protocol::Tcp(_))
|
||||
}) {
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
Protocol::Quic => {
|
||||
if addr.iter().any(|multiaddr_proto| {
|
||||
matches!(multiaddr_proto, libp2p::multiaddr::Protocol::QuicV1)
|
||||
}) {
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let joined = futures::future::join(sender_fut, receiver_fut);
|
||||
|
||||
// wait for either both nodes to listen or a timeout
|
||||
tokio::select! {
|
||||
_ = tokio::time::sleep(Duration::from_millis(500)) => {}
|
||||
_ = joined => {}
|
||||
}
|
||||
let receiver_multiaddr = joined.await.1;
|
||||
|
||||
// sender.dial_peer(peer_id);
|
||||
match sender.testing_dial(receiver_multiaddr.clone()) {
|
||||
Ok(()) => {
|
||||
debug!(log, "Sender dialed receiver"; "address" => format!("{:?}", receiver_multiaddr))
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
#![cfg(test)]
|
||||
|
||||
mod common;
|
||||
|
||||
use common::Protocol;
|
||||
use lighthouse_network::rpc::methods::*;
|
||||
use lighthouse_network::{rpc::max_rpc_size, NetworkEvent, ReportSource, Request, Response};
|
||||
use slog::{debug, warn, Level};
|
||||
@@ -14,8 +18,6 @@ use types::{
|
||||
SignedBeaconBlock, Slot,
|
||||
};
|
||||
|
||||
mod common;
|
||||
|
||||
type E = MinimalEthSpec;
|
||||
|
||||
/// Merge block with length < max_rpc_size.
|
||||
@@ -49,7 +51,7 @@ fn merge_block_large(fork_context: &ForkContext, spec: &ChainSpec) -> BeaconBloc
|
||||
// Tests the STATUS RPC message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_status_rpc() {
|
||||
fn test_tcp_status_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -62,8 +64,14 @@ fn test_status_rpc() {
|
||||
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Base,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// Dummy STATUS RPC message
|
||||
let rpc_request = Request::Status(StatusMessage {
|
||||
@@ -141,7 +149,7 @@ fn test_status_rpc() {
|
||||
// Tests a streamed BlocksByRange RPC Message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_blocks_by_range_chunked_rpc() {
|
||||
fn test_tcp_blocks_by_range_chunked_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -156,8 +164,14 @@ fn test_blocks_by_range_chunked_rpc() {
|
||||
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Merge, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Merge,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRange Request
|
||||
let rpc_request = Request::BlocksByRange(BlocksByRangeRequest::new(0, messages_to_send));
|
||||
@@ -282,8 +296,14 @@ fn test_blobs_by_range_chunked_rpc() {
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let spec = E::default_spec();
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Deneb, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Deneb,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlobsByRange Request
|
||||
let rpc_request = Request::BlobsByRange(BlobsByRangeRequest {
|
||||
@@ -373,7 +393,7 @@ fn test_blobs_by_range_chunked_rpc() {
|
||||
// Tests rejection of blocks over `MAX_RPC_SIZE`.
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_blocks_by_range_over_limit() {
|
||||
fn test_tcp_blocks_by_range_over_limit() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -388,8 +408,14 @@ fn test_blocks_by_range_over_limit() {
|
||||
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Merge, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Merge,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRange Request
|
||||
let rpc_request = Request::BlocksByRange(BlocksByRangeRequest::new(0, messages_to_send));
|
||||
@@ -456,7 +482,7 @@ fn test_blocks_by_range_over_limit() {
|
||||
|
||||
// Tests that a streamed BlocksByRange RPC Message terminates when all expected chunks were received
|
||||
#[test]
|
||||
fn test_blocks_by_range_chunked_rpc_terminates_correctly() {
|
||||
fn test_tcp_blocks_by_range_chunked_rpc_terminates_correctly() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -472,8 +498,14 @@ fn test_blocks_by_range_chunked_rpc_terminates_correctly() {
|
||||
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Base,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRange Request
|
||||
let rpc_request = Request::BlocksByRange(BlocksByRangeRequest::new(0, messages_to_send));
|
||||
@@ -582,7 +614,7 @@ fn test_blocks_by_range_chunked_rpc_terminates_correctly() {
|
||||
// Tests an empty response to a BlocksByRange RPC Message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_blocks_by_range_single_empty_rpc() {
|
||||
fn test_tcp_blocks_by_range_single_empty_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Trace;
|
||||
let enable_logging = false;
|
||||
@@ -594,8 +626,14 @@ fn test_blocks_by_range_single_empty_rpc() {
|
||||
|
||||
rt.block_on(async {
|
||||
// get sender/receiver
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Base,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRange Request
|
||||
let rpc_request = Request::BlocksByRange(BlocksByRangeRequest::new(0, 10));
|
||||
@@ -682,7 +720,7 @@ fn test_blocks_by_range_single_empty_rpc() {
|
||||
// serves to test the snappy framing format as well.
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_blocks_by_root_chunked_rpc() {
|
||||
fn test_tcp_blocks_by_root_chunked_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -695,8 +733,14 @@ fn test_blocks_by_root_chunked_rpc() {
|
||||
let rt = Arc::new(Runtime::new().unwrap());
|
||||
// get sender/receiver
|
||||
rt.block_on(async {
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Merge, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Merge,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRoot Request
|
||||
let rpc_request =
|
||||
@@ -808,7 +852,7 @@ fn test_blocks_by_root_chunked_rpc() {
|
||||
|
||||
// Tests a streamed, chunked BlocksByRoot RPC Message terminates when all expected reponses have been received
|
||||
#[test]
|
||||
fn test_blocks_by_root_chunked_rpc_terminates_correctly() {
|
||||
fn test_tcp_blocks_by_root_chunked_rpc_terminates_correctly() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = false;
|
||||
@@ -822,8 +866,14 @@ fn test_blocks_by_root_chunked_rpc_terminates_correctly() {
|
||||
let rt = Arc::new(Runtime::new().unwrap());
|
||||
// get sender/receiver
|
||||
rt.block_on(async {
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec).await;
|
||||
let (mut sender, mut receiver) = common::build_node_pair(
|
||||
Arc::downgrade(&rt),
|
||||
&log,
|
||||
ForkName::Base,
|
||||
&spec,
|
||||
Protocol::Tcp,
|
||||
)
|
||||
.await;
|
||||
|
||||
// BlocksByRoot Request
|
||||
let rpc_request =
|
||||
@@ -939,14 +989,9 @@ fn test_blocks_by_root_chunked_rpc_terminates_correctly() {
|
||||
})
|
||||
}
|
||||
|
||||
// Tests a Goodbye RPC message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn test_goodbye_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Trace;
|
||||
let enable_logging = false;
|
||||
|
||||
/// Establishes a pair of nodes and disconnects the pair based on the selected protocol via an RPC
|
||||
/// Goodbye message.
|
||||
fn goodbye_test(log_level: Level, enable_logging: bool, protocol: Protocol) {
|
||||
let log = common::build_log(log_level, enable_logging);
|
||||
|
||||
let rt = Arc::new(Runtime::new().unwrap());
|
||||
@@ -956,7 +1001,8 @@ fn test_goodbye_rpc() {
|
||||
// get sender/receiver
|
||||
rt.block_on(async {
|
||||
let (mut sender, mut receiver) =
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec).await;
|
||||
common::build_node_pair(Arc::downgrade(&rt), &log, ForkName::Base, &spec, protocol)
|
||||
.await;
|
||||
|
||||
// build the sender future
|
||||
let sender_future = async {
|
||||
@@ -982,12 +1028,9 @@ fn test_goodbye_rpc() {
|
||||
// build the receiver future
|
||||
let receiver_future = async {
|
||||
loop {
|
||||
match receiver.next_event().await {
|
||||
NetworkEvent::PeerDisconnected(_) => {
|
||||
// Should receive sent RPC request
|
||||
return;
|
||||
}
|
||||
_ => {} // Ignore other events
|
||||
if let NetworkEvent::PeerDisconnected(_) = receiver.next_event().await {
|
||||
// Should receive sent RPC request
|
||||
return;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1002,3 +1045,23 @@ fn test_goodbye_rpc() {
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Tests a Goodbye RPC message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn tcp_test_goodbye_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = true;
|
||||
goodbye_test(log_level, enable_logging, Protocol::Tcp);
|
||||
}
|
||||
|
||||
// Tests a Goodbye RPC message
|
||||
#[test]
|
||||
#[allow(clippy::single_match)]
|
||||
fn quic_test_goodbye_rpc() {
|
||||
// set up the logging. The level and enabled logging or not
|
||||
let log_level = Level::Debug;
|
||||
let enable_logging = true;
|
||||
goodbye_test(log_level, enable_logging, Protocol::Quic);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user