diff --git a/crates/common/src/pbs/error.rs b/crates/common/src/pbs/error.rs index 83ea4b6b..763bfd62 100644 --- a/crates/common/src/pbs/error.rs +++ b/crates/common/src/pbs/error.rs @@ -20,6 +20,9 @@ pub enum PbsError { #[error("relay response error. Code: {code}, err: {error_msg}")] RelayResponse { error_msg: String, code: u16 }, + #[error("Response size exceeds 10MB! Got: {payload_size}")] + PayloadTooLarge { payload_size: usize }, + #[error("failed validating relay response: {0}")] Validation(#[from] ValidationError), diff --git a/crates/common/src/pbs/relay.rs b/crates/common/src/pbs/relay.rs index 903277b0..6802890d 100644 --- a/crates/common/src/pbs/relay.rs +++ b/crates/common/src/pbs/relay.rs @@ -15,6 +15,9 @@ use super::{ HEADER_VERSION_KEY, HEADER_VERSION_VALUE, }; use crate::{config::RelayConfig, DEFAULT_REQUEST_TIMEOUT}; + +pub const MAX_SIZE: usize = 10 * 1024 * 1024; + /// A parsed entry of the relay url in the format: scheme://pubkey@host #[derive(Debug, Clone)] pub struct RelayEntry { diff --git a/crates/pbs/Cargo.toml b/crates/pbs/Cargo.toml index 34d659e3..7d6809b1 100644 --- a/crates/pbs/Cargo.toml +++ b/crates/pbs/Cargo.toml @@ -37,4 +37,4 @@ thiserror.workspace = true eyre.workspace = true url.workspace = true uuid.workspace = true -lazy_static.workspace = true +lazy_static.workspace = true \ No newline at end of file diff --git a/crates/pbs/src/mev_boost/get_header.rs b/crates/pbs/src/mev_boost/get_header.rs index e98b3e49..ee5fa339 100644 --- a/crates/pbs/src/mev_boost/get_header.rs +++ b/crates/pbs/src/mev_boost/get_header.rs @@ -11,7 +11,7 @@ use cb_common::{ pbs::{ error::{PbsError, ValidationError}, GetHeaderParams, GetHeaderResponse, RelayClient, SignedExecutionPayloadHeader, - EMPTY_TX_ROOT_HASH, HEADER_SLOT_UUID_KEY, HEADER_START_TIME_UNIX_MS, + EMPTY_TX_ROOT_HASH, HEADER_SLOT_UUID_KEY, HEADER_START_TIME_UNIX_MS, MAX_SIZE, }, signature::verify_signed_message, types::Chain, @@ -244,13 +244,16 @@ async fn send_one_get_header( RELAY_STATUS_CODE.with_label_values(&[code.as_str(), GET_HEADER_ENDPOINT_TAG, &relay.id]).inc(); let response_bytes = res.bytes().await?; + if response_bytes.len() > MAX_SIZE { + return Err(PbsError::PayloadTooLarge { payload_size: response_bytes.len() }); + } + if !code.is_success() { return Err(PbsError::RelayResponse { error_msg: String::from_utf8_lossy(&response_bytes).into_owned(), code: code.as_u16(), }); }; - if code == StatusCode::NO_CONTENT { debug!( ?code, diff --git a/crates/pbs/src/mev_boost/register_validator.rs b/crates/pbs/src/mev_boost/register_validator.rs index d44ca2d3..5fcfc991 100644 --- a/crates/pbs/src/mev_boost/register_validator.rs +++ b/crates/pbs/src/mev_boost/register_validator.rs @@ -3,7 +3,7 @@ use std::time::{Duration, Instant}; use alloy::rpc::types::beacon::relay::ValidatorRegistration; use axum::http::{HeaderMap, HeaderValue}; use cb_common::{ - pbs::{error::PbsError, RelayClient, HEADER_START_TIME_UNIX_MS}, + pbs::{error::PbsError, RelayClient, HEADER_START_TIME_UNIX_MS, MAX_SIZE}, utils::{get_user_agent_with_version, utcnow_ms}, }; use eyre::bail; @@ -92,6 +92,9 @@ async fn send_register_validator( .inc(); let response_bytes = res.bytes().await?; + if response_bytes.len() > MAX_SIZE { + return Err(PbsError::PayloadTooLarge { payload_size: response_bytes.len() }); + } if !code.is_success() { let err = PbsError::RelayResponse { error_msg: String::from_utf8_lossy(&response_bytes).into_owned(), diff --git a/crates/pbs/src/mev_boost/status.rs b/crates/pbs/src/mev_boost/status.rs index 13b29035..514ef860 100644 --- a/crates/pbs/src/mev_boost/status.rs +++ b/crates/pbs/src/mev_boost/status.rs @@ -2,7 +2,7 @@ use std::time::{Duration, Instant}; use axum::http::HeaderMap; use cb_common::{ - pbs::{error::PbsError, RelayClient}, + pbs::{error::PbsError, RelayClient, MAX_SIZE}, utils::get_user_agent_with_version, }; use futures::future::select_ok; @@ -75,6 +75,9 @@ async fn send_relay_check(relay: &RelayClient, headers: HeaderMap) -> Result<(), RELAY_STATUS_CODE.with_label_values(&[code.as_str(), STATUS_ENDPOINT_TAG, &relay.id]).inc(); let response_bytes = res.bytes().await?; + if response_bytes.len() > MAX_SIZE { + return Err(PbsError::PayloadTooLarge { payload_size: response_bytes.len() }); + } if !code.is_success() { let err = PbsError::RelayResponse { error_msg: String::from_utf8_lossy(&response_bytes).into_owned(), diff --git a/crates/pbs/src/mev_boost/submit_block.rs b/crates/pbs/src/mev_boost/submit_block.rs index 9ae83df0..e430ca32 100644 --- a/crates/pbs/src/mev_boost/submit_block.rs +++ b/crates/pbs/src/mev_boost/submit_block.rs @@ -5,7 +5,7 @@ use cb_common::{ pbs::{ error::{PbsError, ValidationError}, RelayClient, SignedBlindedBeaconBlock, SubmitBlindedBlockResponse, HEADER_SLOT_UUID_KEY, - HEADER_START_TIME_UNIX_MS, + HEADER_START_TIME_UNIX_MS, MAX_SIZE, }, utils::{get_user_agent_with_version, utcnow_ms}, }; @@ -95,6 +95,10 @@ async fn send_submit_block( .inc(); let response_bytes = res.bytes().await?; + + if response_bytes.len() > MAX_SIZE { + return Err(PbsError::PayloadTooLarge { payload_size: response_bytes.len() }); + } if !code.is_success() { let err = PbsError::RelayResponse { error_msg: String::from_utf8_lossy(&response_bytes).into_owned(),