mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-20 21:34:46 +00:00
Merge branch 'eip4844' into deneb-free-blobs
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
#![recursion_limit = "256"]
|
||||
extern crate proc_macro;
|
||||
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
@@ -921,6 +921,8 @@ pub struct SseExtendedPayloadAttributesGeneric<T> {
|
||||
#[serde(with = "eth2_serde_utils::quoted_u64")]
|
||||
pub proposer_index: u64,
|
||||
pub parent_block_root: Hash256,
|
||||
#[serde(with = "eth2_serde_utils::quoted_u64")]
|
||||
pub parent_block_number: u64,
|
||||
pub parent_block_hash: ExecutionBlockHash,
|
||||
pub payload_attributes: T,
|
||||
}
|
||||
@@ -958,6 +960,7 @@ impl ForkVersionDeserialize for SseExtendedPayloadAttributes {
|
||||
proposal_slot: helper.proposal_slot,
|
||||
proposer_index: helper.proposer_index,
|
||||
parent_block_root: helper.parent_block_root,
|
||||
parent_block_number: helper.parent_block_number,
|
||||
parent_block_hash: helper.parent_block_hash,
|
||||
payload_attributes: SsePayloadAttributes::deserialize_by_fork::<D>(
|
||||
helper.payload_attributes,
|
||||
|
||||
@@ -6,14 +6,30 @@ pub enum Transport {
|
||||
Udp,
|
||||
}
|
||||
|
||||
/// A convenience function for `unused_port(Transport::Tcp)`.
|
||||
pub fn unused_tcp_port() -> Result<u16, String> {
|
||||
unused_port(Transport::Tcp)
|
||||
#[derive(Copy, Clone)]
|
||||
pub enum IpVersion {
|
||||
Ipv4,
|
||||
Ipv6,
|
||||
}
|
||||
|
||||
/// A convenience function for `unused_port(Transport::Tcp)`.
|
||||
pub fn unused_udp_port() -> Result<u16, String> {
|
||||
unused_port(Transport::Udp)
|
||||
/// A convenience wrapper over [`zero_port`].
|
||||
pub fn unused_tcp4_port() -> Result<u16, String> {
|
||||
zero_port(Transport::Tcp, IpVersion::Ipv4)
|
||||
}
|
||||
|
||||
/// A convenience wrapper over [`zero_port`].
|
||||
pub fn unused_udp4_port() -> Result<u16, String> {
|
||||
zero_port(Transport::Udp, IpVersion::Ipv4)
|
||||
}
|
||||
|
||||
/// A convenience wrapper over [`zero_port`].
|
||||
pub fn unused_tcp6_port() -> Result<u16, String> {
|
||||
zero_port(Transport::Tcp, IpVersion::Ipv6)
|
||||
}
|
||||
|
||||
/// A convenience wrapper over [`zero_port`].
|
||||
pub fn unused_udp6_port() -> Result<u16, String> {
|
||||
zero_port(Transport::Udp, IpVersion::Ipv6)
|
||||
}
|
||||
|
||||
/// A bit of hack to find an unused port.
|
||||
@@ -26,10 +42,15 @@ pub fn unused_udp_port() -> Result<u16, String> {
|
||||
/// It is possible that users are unable to bind to the ports returned by this function as the OS
|
||||
/// has a buffer period where it doesn't allow binding to the same port even after the socket is
|
||||
/// closed. We might have to use SO_REUSEADDR socket option from `std::net2` crate in that case.
|
||||
pub fn unused_port(transport: Transport) -> Result<u16, String> {
|
||||
pub fn zero_port(transport: Transport, ipv: IpVersion) -> Result<u16, String> {
|
||||
let localhost = match ipv {
|
||||
IpVersion::Ipv4 => std::net::Ipv4Addr::LOCALHOST.into(),
|
||||
IpVersion::Ipv6 => std::net::Ipv6Addr::LOCALHOST.into(),
|
||||
};
|
||||
let socket_addr = std::net::SocketAddr::new(localhost, 0);
|
||||
let local_addr = match transport {
|
||||
Transport::Tcp => {
|
||||
let listener = TcpListener::bind("127.0.0.1:0").map_err(|e| {
|
||||
let listener = TcpListener::bind(socket_addr).map_err(|e| {
|
||||
format!("Failed to create TCP listener to find unused port: {:?}", e)
|
||||
})?;
|
||||
listener.local_addr().map_err(|e| {
|
||||
@@ -40,7 +61,7 @@ pub fn unused_port(transport: Transport) -> Result<u16, String> {
|
||||
})?
|
||||
}
|
||||
Transport::Udp => {
|
||||
let socket = UdpSocket::bind("127.0.0.1:0")
|
||||
let socket = UdpSocket::bind(socket_addr)
|
||||
.map_err(|e| format!("Failed to create UDP socket to find unused port: {:?}", e))?;
|
||||
socket.local_addr().map_err(|e| {
|
||||
format!(
|
||||
|
||||
@@ -6,3 +6,4 @@ pub mod metrics;
|
||||
pub mod query;
|
||||
pub mod reject;
|
||||
pub mod task;
|
||||
pub mod uor;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use serde::Serialize;
|
||||
use warp::reply::{Reply, Response};
|
||||
|
||||
/// A convenience wrapper around `blocking_task`.
|
||||
pub async fn blocking_task<F, T>(func: F) -> Result<T, warp::Rejection>
|
||||
@@ -8,16 +9,29 @@ where
|
||||
{
|
||||
tokio::task::spawn_blocking(func)
|
||||
.await
|
||||
.unwrap_or_else(|_| Err(warp::reject::reject())) // This should really be a 500
|
||||
.unwrap_or_else(|_| Err(warp::reject::reject()))
|
||||
}
|
||||
|
||||
/// A convenience wrapper around `blocking_task` that returns a `warp::reply::Response`.
|
||||
///
|
||||
/// Using this method consistently makes it possible to simplify types using `.unify()` or `.uor()`.
|
||||
pub async fn blocking_response_task<F, T>(func: F) -> Result<Response, warp::Rejection>
|
||||
where
|
||||
F: FnOnce() -> Result<T, warp::Rejection> + Send + 'static,
|
||||
T: Reply + Send + 'static,
|
||||
{
|
||||
blocking_task(func).await.map(Reply::into_response)
|
||||
}
|
||||
|
||||
/// A convenience wrapper around `blocking_task` for use with `warp` JSON responses.
|
||||
pub async fn blocking_json_task<F, T>(func: F) -> Result<warp::reply::Json, warp::Rejection>
|
||||
pub async fn blocking_json_task<F, T>(func: F) -> Result<Response, warp::Rejection>
|
||||
where
|
||||
F: FnOnce() -> Result<T, warp::Rejection> + Send + 'static,
|
||||
T: Serialize + Send + 'static,
|
||||
{
|
||||
blocking_task(func)
|
||||
.await
|
||||
.map(|resp| warp::reply::json(&resp))
|
||||
blocking_response_task(|| {
|
||||
let response = func()?;
|
||||
Ok(warp::reply::json(&response))
|
||||
})
|
||||
.await
|
||||
}
|
||||
|
||||
25
common/warp_utils/src/uor.rs
Normal file
25
common/warp_utils/src/uor.rs
Normal file
@@ -0,0 +1,25 @@
|
||||
use warp::{filters::BoxedFilter, Filter, Rejection};
|
||||
|
||||
/// Mixin trait for `Filter` providing the unifying-or method.
|
||||
pub trait UnifyingOrFilter: Filter<Error = Rejection> + Sized + Send + Sync + 'static
|
||||
where
|
||||
Self::Extract: Send,
|
||||
{
|
||||
/// Unifying `or`.
|
||||
///
|
||||
/// This is a shorthand for `self.or(other).unify().boxed()`, which is useful because it keeps
|
||||
/// the filter type simple and prevents type-checker explosions.
|
||||
fn uor<F>(self, other: F) -> BoxedFilter<Self::Extract>
|
||||
where
|
||||
F: Filter<Extract = Self::Extract, Error = Rejection> + Clone + Send + Sync + 'static,
|
||||
{
|
||||
self.or(other).unify().boxed()
|
||||
}
|
||||
}
|
||||
|
||||
impl<F> UnifyingOrFilter for F
|
||||
where
|
||||
F: Filter<Error = Rejection> + Sized + Send + Sync + 'static,
|
||||
F::Extract: Send,
|
||||
{
|
||||
}
|
||||
Reference in New Issue
Block a user