From 4ac8def1ac146a7605f36c387d7564a8429e2de3 Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Thu, 25 Jun 2026 13:05:37 +0200 Subject: [PATCH 1/9] Add engine_getBlobsV4 support --- .../fetch_blobs/fetch_blobs_beacon_adapter.rs | 35 ++- .../beacon_chain/src/fetch_blobs/mod.rs | 268 +++++++++++++++++- .../beacon_chain/src/fetch_blobs/tests.rs | 19 +- beacon_node/beacon_chain/src/metrics.rs | 32 +++ beacon_node/execution_layer/src/engine_api.rs | 18 +- .../execution_layer/src/engine_api/http.rs | 18 ++ .../src/engine_api/json_structures.rs | 145 +++++++++- beacon_node/execution_layer/src/lib.rs | 24 +- .../execution_layer/src/test_utils/mod.rs | 1 + 9 files changed, 533 insertions(+), 27 deletions(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs b/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs index 16d6e6dd63f..b2bbe2debd4 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs @@ -3,7 +3,9 @@ use crate::fetch_blobs::FetchEngineBlobError; use crate::observed_data_sidecars::ObservationKey; use crate::partial_data_column_assembler::PartialDataColumnAssembler; use crate::{AvailabilityProcessingStatus, BeaconChain, BeaconChainTypes}; -use execution_layer::json_structures::{BlobAndProofV2, BlobAndProofV3}; +use execution_layer::json_structures::{ + BlobAndProofV2, BlobAndProofV3, BlobCellsAndProofsV1, CustodyColumnsBitArray, +}; use kzg::Kzg; #[cfg(test)] use mockall::automock; @@ -76,6 +78,23 @@ impl FetchBlobsBeaconAdapter { .map_err(FetchEngineBlobError::RequestFailed) } + pub(crate) async fn get_blobs_v4( + &self, + versioned_hashes: Vec, + custody_columns: CustodyColumnsBitArray, + ) -> Result>>, FetchEngineBlobError> { + let execution_layer = self + .chain + .execution_layer + .as_ref() + .ok_or(FetchEngineBlobError::ExecutionLayerMissing)?; + + execution_layer + .get_blobs_v4(versioned_hashes, custody_columns) + .await + .map_err(FetchEngineBlobError::RequestFailed) + } + pub(crate) fn data_column_known_for_observation_key( &self, observation_key: ObservationKey, @@ -128,4 +147,18 @@ impl FetchBlobsBeaconAdapter { .map_err(FetchEngineBlobError::RequestFailed) .map(|caps| caps.get_blobs_v3) } + + pub(crate) async fn supports_get_blobs_v4(&self) -> Result { + let execution_layer = self + .chain + .execution_layer + .as_ref() + .ok_or(FetchEngineBlobError::ExecutionLayerMissing)?; + + execution_layer + .get_engine_capabilities(None) + .await + .map_err(FetchEngineBlobError::RequestFailed) + .map(|caps| caps.get_blobs_v4) + } } diff --git a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs index 158cef00039..1b3a6101b17 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs @@ -24,14 +24,21 @@ use crate::{ metrics, }; use execution_layer::Error as ExecutionLayerError; -use execution_layer::json_structures::{BlobAndProofV2, BlobAndProofV3}; +use execution_layer::json_structures::{ + BlobAndProofV2, BlobAndProofV3, BlobCellsAndProofsV1, ColumnIndexTooHighError, + CustodyColumnsBitArray, +}; use metrics::{TryExt, inc_counter}; #[cfg(test)] use mockall_double::double; +use ssz_types::VariableList; use state_processing::per_block_processing::deneb::kzg_commitment_to_versioned_hash; use std::sync::Arc; use tracing::{debug, instrument, warn}; -use types::data::{BlobSidecarError, ColumnIndex, DataColumnSidecarError, PartialDataColumnHeader}; +use types::data::{ + BlobSidecarError, CellBitmap, ColumnIndex, DataColumnSidecarError, PartialDataColumn, + PartialDataColumnHeader, PartialDataColumnSidecar, +}; use types::{BeaconStateError, EthSpec, Hash256, VersionedHash}; #[derive(Debug)] @@ -97,15 +104,27 @@ async fn fetch_and_process_engine_blobs_inner( .spec() .is_peer_das_enabled_for_epoch(header.slot().epoch(T::EthSpec::slots_per_epoch())) { - fetch_and_process_blobs_v2_or_v3( - chain_adapter, - block_root, - header, - versioned_hashes, - custody_columns, - publish_fn, - ) - .await + if chain_adapter.supports_get_blobs_v4().await? { + fetch_and_process_blobs_v4( + chain_adapter, + block_root, + header, + versioned_hashes, + custody_columns, + publish_fn, + ) + .await + } else { + fetch_and_process_blobs_v2_or_v3( + chain_adapter, + block_root, + header, + versioned_hashes, + custody_columns, + publish_fn, + ) + .await + } } else { Err(FetchEngineBlobError::InternalError( "fetch blobs v1 no longer supported".to_owned(), @@ -267,6 +286,233 @@ async fn fetch_and_process_blobs_v2_or_v3( Ok(Some(availability_processing_status)) } +/// EIP-8070 `engine_getBlobsV4` path: request only the columns we custody from +/// the EL and assemble `PartialDataColumn`s directly from the cells it returns, +/// skipping the local KZG-cell derivation that V2/V3 require. +#[instrument(skip_all, level = "debug")] +async fn fetch_and_process_blobs_v4( + chain_adapter: FetchBlobsBeaconAdapter, + block_root: Hash256, + header: Arc>, + versioned_hashes: Vec, + custody_columns_indices: &[ColumnIndex], + publish_fn: impl Fn(Vec>) + Send + 'static, +) -> Result, FetchEngineBlobError> { + let num_expected_blobs = versioned_hashes.len(); + let slot = header.slot(); + + metrics::observe(&metrics::BLOBS_FROM_EL_EXPECTED, num_expected_blobs as f64); + inc_counter(&metrics::BEACON_ENGINE_GET_BLOBS_V4_REQUESTS_TOTAL); + let _timer = + metrics::start_timer(&metrics::BEACON_ENGINE_GET_BLOBS_V4_REQUEST_DURATION_SECONDS); + + let bitarray = CustodyColumnsBitArray::try_from(custody_columns_indices).map_err( + |ColumnIndexTooHighError(idx)| { + FetchEngineBlobError::InternalError(format!( + "Column index {} is too high for the getBlobsV4 bitmap", + idx + )) + }, + )?; + + debug!( + num_expected_blobs, + num_columns = custody_columns_indices.len(), + "Fetching blob cells from the EL via V4" + ); + + let response = chain_adapter + .get_blobs_v4(versioned_hashes, bitarray) + .await + .inspect_err(|_| { + inc_counter(&metrics::BLOBS_FROM_EL_ERROR_TOTAL); + })?; + + if response.len() != num_expected_blobs { + warn!( + response_len = response.len(), + num_expected_blobs, "engine_getBlobsV4 returned the wrong number of blob entries" + ); + inc_counter(&metrics::BLOBS_FROM_EL_ERROR_TOTAL); + return Ok(None); + } + + // Count present (non-null) cells across the response. + let total_cells_expected = num_expected_blobs.saturating_mul(custody_columns_indices.len()); + let total_cells_present: usize = response + .iter() + .flatten() + .flat_map(|cells_and_proofs| cells_and_proofs.blob_cells.iter()) + .filter(|c| c.is_some()) + .count(); + + if total_cells_present == 0 { + debug!(num_expected_blobs, "No cells fetched from the EL"); + inc_counter(&metrics::BLOBS_FROM_EL_MISS_TOTAL); + return Ok(None); + } else if total_cells_present == total_cells_expected { + debug!(total_cells_present, "All requested cells received from EL"); + inc_counter(&metrics::BLOBS_FROM_EL_HIT_TOTAL); + inc_counter(&metrics::BEACON_ENGINE_GET_BLOBS_V4_COMPLETE_RESPONSES_TOTAL); + } else { + debug!( + total_cells_present, + total_cells_expected, "Cells partially received from the EL" + ); + inc_counter(&metrics::BEACON_ENGINE_GET_BLOBS_V4_PARTIAL_RESPONSES_TOTAL); + } + + if chain_adapter.fork_choice_contains_block(&block_root) { + debug!( + info = "block has already been imported", + "Ignoring EL blobs response" + ); + return Ok(None); + } + + let chain_adapter = Arc::new(chain_adapter); + let custody_columns_to_import = build_partial_columns_from_v4_response( + &chain_adapter, + block_root, + &header, + response, + custody_columns_indices, + ) + .await?; + + if custody_columns_to_import.is_empty() { + debug!( + info = "No new data columns to import", + "Ignoring EL blobs response" + ); + return Ok(None); + } + + // TODO(gloas): support partials here + let full_columns = match chain_adapter.partial_assembler() { + Some(assembler) => { + assembler + .merge_partials(block_root, custody_columns_to_import, header) + .ok_or_else(|| { + FetchEngineBlobError::InternalError( + "Failed to merge partials into assembler".to_string(), + ) + })? + .full_columns + } + None => custody_columns_to_import + .into_iter() + .filter_map(|col| col.try_into_full(&header)) + .collect(), + }; + + if !full_columns.is_empty() { + publish_fn(full_columns.clone()); + } + + let availability_processing_status = if !full_columns.is_empty() { + chain_adapter + .process_engine_blobs(slot, block_root, full_columns) + .await? + } else { + AvailabilityProcessingStatus::MissingComponents(slot, block_root) + }; + + Ok(Some(availability_processing_status)) +} + +/// Group the per-blob cells/proofs returned by `engine_getBlobsV4` into one +/// `PartialDataColumn` per custody column index. +async fn build_partial_columns_from_v4_response( + chain_adapter: &Arc>, + block_root: Hash256, + header: &PartialDataColumnHeader, + response: Vec>>, + custody_columns_indices: &[ColumnIndex], +) -> Result>, FetchEngineBlobError> { + let num_blobs = response.len(); + let num_columns = custody_columns_indices.len(); + let mut sorted_column_indices: Vec<_> = custody_columns_indices.iter().copied().collect(); + sorted_column_indices.sort_unstable(); + + let mut custody_columns: Vec> = + Vec::with_capacity(num_columns); + for (col_pos, &column_index) in sorted_column_indices.iter().enumerate() { + let mut bitmap = CellBitmap::::with_capacity(num_blobs).map_err(|_| { + FetchEngineBlobError::InternalError("failed to allocate cell bitmap".to_string()) + })?; + let mut cells = Vec::with_capacity(num_blobs); + let mut proofs = Vec::with_capacity(num_blobs); + + for (blob_idx, blob) in response.iter().enumerate() { + let Some(blob) = blob else { + continue; + }; + let cell = blob.blob_cells.get(col_pos).and_then(|c| c.as_ref()); + let proof = blob.proofs.get(col_pos).and_then(|p| p.as_ref()); + + match (cell, proof) { + (Some(cell), Some(proof)) => { + bitmap.set(blob_idx, true).map_err(|_| { + FetchEngineBlobError::InternalError("unexpected oob bitmap set".to_string()) + })?; + cells.push(cell.0.clone()); + proofs.push(*proof); + } + (Some(_), None) => { + return Err(FetchEngineBlobError::InternalError( + "engine_getBlobsV4 entry has a cell but no proof".to_string(), + )); + } + (None, Some(_)) => { + return Err(FetchEngineBlobError::InternalError( + "engine_getBlobsV4 entry has a proof but no cell".to_string(), + )); + } + (None, None) => {} + } + } + if cells.is_empty() { + continue; + } + let partial = PartialDataColumn { + block_root, + index: column_index, + sidecar: PartialDataColumnSidecar:: { + cells_present_bitmap: bitmap, + column: VariableList::try_from(cells).map_err(|_| { + FetchEngineBlobError::InternalError("unexpectedly many cells".to_string()) + })?, + kzg_proofs: VariableList::try_from(proofs).map_err(|_| { + FetchEngineBlobError::InternalError("unexpectedly many proofs".to_string()) + })?, + header: None.into(), + }, + }; + custody_columns.push(KzgVerifiedCustodyPartialDataColumn::from_asserted_custody( + KzgVerifiedPartialDataColumn::from_execution_verified(Arc::new(partial)), + )); + } + + // Dedupe against gossip-observed columns. + let observation_key = + ObservationKey::from_partial_column_header(header, block_root, chain_adapter.spec()); + if let Some(observed_columns) = + chain_adapter.data_column_known_for_observation_key(observation_key) + { + custody_columns.retain(|col| !observed_columns.contains(&col.index())); + } + + // Dedupe against DA-checker-cached columns. + if let Some(known_columns) = + chain_adapter.cached_data_column_indexes(&block_root, header.slot()) + { + custody_columns.retain(|col| !known_columns.contains(&col.index())); + } + + Ok(custody_columns) +} + /// Offload the data column computation to a blocking task to avoid holding up the async runtime. async fn compute_custody_columns_to_import( chain_adapter: &Arc>, diff --git a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs index 8b805a8da3b..3251321f131 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs @@ -25,7 +25,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_no_blobs_in_block() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, _s) = mock_publish_fn(); let block = SignedBeaconBlock::::Fulu(SignedBeaconBlockFulu { message: BeaconBlockFulu::empty(mock_adapter.spec()), @@ -53,7 +53,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_no_blobs_returned() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, _) = mock_publish_fn(); let (block, _blobs_and_proofs) = create_test_block_and_blobs(&mock_adapter, 2); let block_root = block.canonical_root(); @@ -78,7 +78,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_partial_blobs_returned() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, publish_fn_args) = mock_publish_fn(); let (block, mut blobs_and_proofs) = create_test_block_and_blobs(&mock_adapter, 2); let block_root = block.canonical_root(); @@ -111,7 +111,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_block_imported_after_el_response() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, publish_fn_args) = mock_publish_fn(); let (block, blobs_and_proofs) = create_test_block_and_blobs(&mock_adapter, 2); let block_root = block.canonical_root(); @@ -144,7 +144,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_no_new_columns_to_import() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, publish_fn_args) = mock_publish_fn(); let (block, blobs_and_proofs) = create_test_block_and_blobs(&mock_adapter, 2); let block_root = block.canonical_root(); @@ -184,7 +184,7 @@ mod get_blobs_v2 { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn test_fetch_blobs_v2_success() { - let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu, false); + let mut mock_adapter = mock_beacon_adapter(ForkName::Fulu); let (publish_fn, publish_fn_args) = mock_publish_fn(); let (block, blobs_and_proofs) = create_test_block_and_blobs(&mock_adapter, 2); let block_root = block.canonical_root(); @@ -340,7 +340,7 @@ fn mock_publish_fn() -> ( (publish_fn, captured_args) } -fn mock_beacon_adapter(fork_name: ForkName, get_blobs_v3: bool) -> MockFetchBlobsBeaconAdapter { +fn mock_beacon_adapter(fork_name: ForkName) -> MockFetchBlobsBeaconAdapter { let test_runtime = TestRuntime::default(); let spec = Arc::new(fork_name.make_genesis_spec(E::default_spec())); let kzg = get_kzg(&spec); @@ -354,7 +354,10 @@ fn mock_beacon_adapter(fork_name: ForkName, get_blobs_v3: bool) -> MockFetchBlob .return_const(test_runtime.task_executor.clone()); mock_adapter .expect_supports_get_blobs_v3() - .returning(move || Ok(get_blobs_v3)); + .returning(move || Ok(false)); + mock_adapter + .expect_supports_get_blobs_v4() + .returning(move || Ok(false)); mock_adapter .expect_partial_assembler() .return_const(Some(Arc::new(partial_assembler))); diff --git a/beacon_node/beacon_chain/src/metrics.rs b/beacon_node/beacon_chain/src/metrics.rs index 4f7bdbbb52c..718e6c6f54e 100644 --- a/beacon_node/beacon_chain/src/metrics.rs +++ b/beacon_node/beacon_chain/src/metrics.rs @@ -1860,6 +1860,38 @@ pub static BEACON_ENGINE_GET_BLOBS_V3_REQUEST_DURATION_SECONDS: LazyLock> = + LazyLock::new(|| { + try_create_int_counter( + "beacon_engine_getBlobsV4_requests_total", + "Total number of engine_getBlobsV4 requests made to the execution layer", + ) + }); + +pub static BEACON_ENGINE_GET_BLOBS_V4_COMPLETE_RESPONSES_TOTAL: LazyLock> = + LazyLock::new(|| { + try_create_int_counter( + "beacon_engine_getBlobsV4_complete_responses_total", + "Total number of engine_getBlobsV4 responses with all requested cells present", + ) + }); + +pub static BEACON_ENGINE_GET_BLOBS_V4_PARTIAL_RESPONSES_TOTAL: LazyLock> = + LazyLock::new(|| { + try_create_int_counter( + "beacon_engine_getBlobsV4_partial_responses_total", + "Total number of engine_getBlobsV4 responses with at least one missing cell", + ) + }); + +pub static BEACON_ENGINE_GET_BLOBS_V4_REQUEST_DURATION_SECONDS: LazyLock> = + LazyLock::new(|| { + try_create_histogram( + "beacon_engine_getBlobsV4_request_duration_seconds", + "Duration of engine_getBlobsV4 requests to the execution layer in seconds", + ) + }); + /* * Standardized metrics for partial column efficiency */ diff --git a/beacon_node/execution_layer/src/engine_api.rs b/beacon_node/execution_layer/src/engine_api.rs index 9f32bfdfeba..82fa264e962 100644 --- a/beacon_node/execution_layer/src/engine_api.rs +++ b/beacon_node/execution_layer/src/engine_api.rs @@ -1,11 +1,12 @@ use crate::engines::ForkchoiceState; use crate::http::{ ENGINE_FORKCHOICE_UPDATED_V1, ENGINE_FORKCHOICE_UPDATED_V2, ENGINE_FORKCHOICE_UPDATED_V3, - ENGINE_FORKCHOICE_UPDATED_V4, ENGINE_GET_BLOBS_V2, ENGINE_GET_CLIENT_VERSION_V1, - ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1, ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1, - ENGINE_GET_PAYLOAD_V1, ENGINE_GET_PAYLOAD_V2, ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, - ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V6, ENGINE_NEW_PAYLOAD_V1, ENGINE_NEW_PAYLOAD_V2, - ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4, ENGINE_NEW_PAYLOAD_V5, + ENGINE_FORKCHOICE_UPDATED_V4, ENGINE_GET_BLOBS_V2, ENGINE_GET_BLOBS_V3, ENGINE_GET_BLOBS_V4, + ENGINE_GET_CLIENT_VERSION_V1, ENGINE_GET_PAYLOAD_BODIES_BY_HASH_V1, + ENGINE_GET_PAYLOAD_BODIES_BY_RANGE_V1, ENGINE_GET_PAYLOAD_V1, ENGINE_GET_PAYLOAD_V2, + ENGINE_GET_PAYLOAD_V3, ENGINE_GET_PAYLOAD_V4, ENGINE_GET_PAYLOAD_V5, ENGINE_GET_PAYLOAD_V6, + ENGINE_NEW_PAYLOAD_V1, ENGINE_NEW_PAYLOAD_V2, ENGINE_NEW_PAYLOAD_V3, ENGINE_NEW_PAYLOAD_V4, + ENGINE_NEW_PAYLOAD_V5, }; use eth2::types::{ BlobsBundle, SsePayloadAttributes, SsePayloadAttributesV1, SsePayloadAttributesV2, @@ -613,6 +614,7 @@ pub struct EngineCapabilities { pub get_client_version_v1: bool, pub get_blobs_v2: bool, pub get_blobs_v3: bool, + pub get_blobs_v4: bool, } impl EngineCapabilities { @@ -675,6 +677,12 @@ impl EngineCapabilities { if self.get_blobs_v2 { response.push(ENGINE_GET_BLOBS_V2); } + if self.get_blobs_v3 { + response.push(ENGINE_GET_BLOBS_V3); + } + if self.get_blobs_v4 { + response.push(ENGINE_GET_BLOBS_V4); + } response } diff --git a/beacon_node/execution_layer/src/engine_api/http.rs b/beacon_node/execution_layer/src/engine_api/http.rs index cb5168b6f81..73873e49016 100644 --- a/beacon_node/execution_layer/src/engine_api/http.rs +++ b/beacon_node/execution_layer/src/engine_api/http.rs @@ -64,6 +64,7 @@ pub const ENGINE_GET_CLIENT_VERSION_TIMEOUT: Duration = Duration::from_secs(1); pub const ENGINE_GET_BLOBS_V2: &str = "engine_getBlobsV2"; pub const ENGINE_GET_BLOBS_V3: &str = "engine_getBlobsV3"; +pub const ENGINE_GET_BLOBS_V4: &str = "engine_getBlobsV4"; pub const ENGINE_GET_BLOBS_TIMEOUT: Duration = Duration::from_secs(1); /// This error is returned during a `chainId` call by Geth. @@ -93,6 +94,7 @@ pub static LIGHTHOUSE_CAPABILITIES: &[&str] = &[ ENGINE_GET_CLIENT_VERSION_V1, ENGINE_GET_BLOBS_V2, ENGINE_GET_BLOBS_V3, + ENGINE_GET_BLOBS_V4, ]; /// We opt to initialize the JsonClientVersionV1 rather than the ClientVersionV1 @@ -743,6 +745,21 @@ impl HttpJsonRpc { .await } + pub async fn get_blobs_v4( + &self, + versioned_hashes: Vec, + indices_bitarray: CustodyColumnsBitArray, + ) -> Result>>, Error> { + let params = json!([versioned_hashes, indices_bitarray]); + + self.rpc_request( + ENGINE_GET_BLOBS_V4, + params, + ENGINE_GET_BLOBS_TIMEOUT * self.execution_timeout_multiplier, + ) + .await + } + pub async fn get_block_by_number( &self, query: BlockByNumberQuery<'_>, @@ -1255,6 +1272,7 @@ impl HttpJsonRpc { get_client_version_v1: capabilities.contains(ENGINE_GET_CLIENT_VERSION_V1), get_blobs_v2: capabilities.contains(ENGINE_GET_BLOBS_V2), get_blobs_v3: capabilities.contains(ENGINE_GET_BLOBS_V3), + get_blobs_v4: capabilities.contains(ENGINE_GET_BLOBS_V4), }) } diff --git a/beacon_node/execution_layer/src/engine_api/json_structures.rs b/beacon_node/execution_layer/src/engine_api/json_structures.rs index dfa1c25282f..5b402eb007d 100644 --- a/beacon_node/execution_layer/src/engine_api/json_structures.rs +++ b/beacon_node/execution_layer/src/engine_api/json_structures.rs @@ -5,7 +5,7 @@ use ssz::{Decode, TryFromIter}; use ssz_types::{FixedVector, VariableList, typenum::Unsigned}; use strum::EnumString; use superstruct::superstruct; -use types::data::BlobsList; +use types::data::{BlobsList, Cell, ColumnIndex}; use types::execution::{ BuilderDepositRequests, BuilderExitRequests, ConsolidationRequests, DepositRequests, ExecutionRequestsElectra, ExecutionRequestsGloas, RequestType, WithdrawalRequests, @@ -962,6 +962,105 @@ pub struct BlobAndProof { /// A BlobAndProofV3 is just a BlobAndProofV2 that may also be `null` if unknown by the EL. pub type BlobAndProofV3 = Option>; +/// CELLS_PER_EXT_BLOB per EIP-7594; the `custodyColumns` and `indices_bitarray` +/// EIP-8070 parameters are 128-bit bitarrays (=16 bytes). +pub const CUSTODY_COLUMNS_BITARRAY_BYTES: usize = 16; + +// TODO(dknopik): use updated ethereum_serde_utils instead +mod bytes_16_hex { + use serde::{Deserializer, Serializer}; + use serde_utils::hex::PrefixedHexVisitor; + + const BYTES_LEN: usize = super::CUSTODY_COLUMNS_BITARRAY_BYTES; + + pub fn serialize(bytes: &[u8; BYTES_LEN], serializer: S) -> Result + where + S: Serializer, + { + let mut s = String::with_capacity(2 + BYTES_LEN * 2); + s.push_str("0x"); + s.push_str(&hex::encode(bytes)); + serializer.serialize_str(&s) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result<[u8; BYTES_LEN], D::Error> + where + D: Deserializer<'de>, + { + use serde::de::Error; + let decoded = deserializer.deserialize_str(PrefixedHexVisitor)?; + if decoded.len() != BYTES_LEN { + return Err(D::Error::custom(format!( + "expected {} bytes for custody bitarray, got {}", + BYTES_LEN, + decoded.len() + ))); + } + let mut array = [0u8; BYTES_LEN]; + array.copy_from_slice(&decoded); + Ok(array) + } +} + +/// EIP-8070 - bitarray of length `CELLS_PER_EXT_BLOB` (=128). Bit `i` of +/// byte `i / 8` (LSB-first within each byte) indicates column `i`. Used as +/// the `indices_bitarray` parameter of `engine_getBlobsV4` and the +/// `custodyColumns` parameter of `engine_forkchoiceUpdatedV4`. +/// The TryFrom impl safeguards against invalid input. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(transparent)] +pub struct CustodyColumnsBitArray( + #[serde(with = "bytes_16_hex")] [u8; CUSTODY_COLUMNS_BITARRAY_BYTES], +); + +impl CustodyColumnsBitArray { + pub fn iter_set_bits(&self) -> impl Iterator + '_ { + (0..CUSTODY_COLUMNS_BITARRAY_BYTES * 8).filter_map(move |i| { + let byte = self.0[i / 8]; + ((byte >> (i % 8)) & 1 == 1).then_some(i as ColumnIndex) + }) + } +} + +#[derive(Debug, Clone, Copy)] +pub struct ColumnIndexTooHighError(pub ColumnIndex); + +impl TryFrom<&[ColumnIndex]> for CustodyColumnsBitArray { + type Error = ColumnIndexTooHighError; + + fn try_from(indices: &[ColumnIndex]) -> Result { + let mut buf = [0u8; CUSTODY_COLUMNS_BITARRAY_BYTES]; + for i in indices { + let byte_idx = *i as usize / 8; + let bit_idx = i % 8; + if byte_idx < CUSTODY_COLUMNS_BITARRAY_BYTES { + buf[byte_idx] |= 1u8 << bit_idx; + } else { + return Err(ColumnIndexTooHighError(*i)); + } + } + Ok(Self(buf)) + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(bound = "E: EthSpec", transparent)] +pub struct JsonCell( + #[serde(with = "ssz_types::serde_utils::hex_fixed_vec")] pub Cell, +); + +/// `blob_cells` is the partial column matrix slice for one blob, indexed +/// positionally over the bits set in the request's `indices_bitarray` +/// (lowest set bit first). An entry is `null` when the EL doesn't have +/// that cell. `proofs[i]` is the KZG cell proof for `blob_cells[i]` and +/// is only meaningful when the matching cell is `Some`. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(bound = "E: EthSpec")] +pub struct BlobCellsAndProofsV1 { + pub blob_cells: Vec>>, + pub proofs: Vec>, +} + #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct JsonForkchoiceStateV1 { @@ -1548,4 +1647,48 @@ mod tests { RequestsError::EmptyRequest(0) )); } + + #[test] + fn custody_columns_bitarray_from_indices_round_trip() { + // Set bits 0, 7, 8, 64, 127. These touch every byte boundary case. + let indices: Vec = vec![0, 7, 8, 64, 127]; + let bitarray = CustodyColumnsBitArray::try_from(indices.as_slice()).unwrap(); + + // Check raw bytes: + // bit 0 -> byte 0 bit 0 (0x01) | bit 7 -> byte 0 bit 7 (0x80) => byte 0 = 0x81 + // bit 8 -> byte 1 bit 0 (0x01) => byte 1 = 0x01 + // bit 64 -> byte 8 bit 0 (0x01) => byte 8 = 0x01 + // bit 127 -> byte 15 bit 7 (0x80) => byte 15 = 0x80 + assert_eq!(bitarray.0[0], 0x81); + assert_eq!(bitarray.0[1], 0x01); + assert_eq!(bitarray.0[8], 0x01); + assert_eq!(bitarray.0[15], 0x80); + + // iter_set_bits round-trip + let round_tripped: Vec = bitarray.iter_set_bits().collect(); + assert_eq!(round_tripped, indices); + + // Out-of-range indices cause an error. + let too_high = CustodyColumnsBitArray::try_from([42, 128, 200].as_slice()).unwrap_err(); + assert_eq!(too_high.0, 128); + + // Empty input is zero. + let empty = CustodyColumnsBitArray::try_from([].as_slice()).unwrap(); + assert_eq!(empty.0, [0u8; 16]); + } + + #[test] + fn custody_columns_bitarray_hex_serde() { + // Set just bit 0 -> first byte 0x01, rest zeros. + let bitarray = CustodyColumnsBitArray::try_from([0].as_slice()).unwrap(); + let json = serde_json::to_string(&bitarray).unwrap(); + assert_eq!(json, "\"0x01000000000000000000000000000000\""); + let parsed: CustodyColumnsBitArray = serde_json::from_str(&json).unwrap(); + assert_eq!(parsed, bitarray); + + // Null-equivalent (zero bitarray) still serializes as hex (not null). + let zero = CustodyColumnsBitArray::try_from([].as_slice()).unwrap(); + let zero_json = serde_json::to_string(&zero).unwrap(); + assert_eq!(zero_json, "\"0x00000000000000000000000000000000\""); + } } diff --git a/beacon_node/execution_layer/src/lib.rs b/beacon_node/execution_layer/src/lib.rs index b255e1b75d0..8ae66eedb8f 100644 --- a/beacon_node/execution_layer/src/lib.rs +++ b/beacon_node/execution_layer/src/lib.rs @@ -4,7 +4,9 @@ //! This crate only provides useful functionality for "The Merge", it does not provide any of the //! deposit-contract functionality that the `beacon_node/eth1` crate already provides. -use crate::json_structures::{BlobAndProofV2, BlobAndProofV3}; +use crate::json_structures::{ + BlobAndProofV2, BlobAndProofV3, BlobCellsAndProofsV1, CustodyColumnsBitArray, +}; use crate::payload_cache::PayloadCache; use arc_swap::ArcSwapOption; use auth::{Auth, JwtKey, strip_prefix}; @@ -1756,6 +1758,26 @@ impl ExecutionLayer { } } + pub async fn get_blobs_v4( + &self, + query: Vec, + custody_columns: CustodyColumnsBitArray, + ) -> Result>>, Error> { + let capabilities = self.get_engine_capabilities(None).await?; + + if capabilities.get_blobs_v4 { + self.engine() + .request( + |engine| async move { engine.api.get_blobs_v4(query, custody_columns).await }, + ) + .await + .map_err(Box::new) + .map_err(Error::EngineError) + } else { + Err(Error::GetBlobsNotSupported) + } + } + pub async fn get_block_by_number( &self, query: BlockByNumberQuery<'_>, diff --git a/beacon_node/execution_layer/src/test_utils/mod.rs b/beacon_node/execution_layer/src/test_utils/mod.rs index 9317e0f3652..a02de9af7a1 100644 --- a/beacon_node/execution_layer/src/test_utils/mod.rs +++ b/beacon_node/execution_layer/src/test_utils/mod.rs @@ -59,6 +59,7 @@ pub const DEFAULT_ENGINE_CAPABILITIES: EngineCapabilities = EngineCapabilities { get_client_version_v1: true, get_blobs_v2: true, get_blobs_v3: true, + get_blobs_v4: true, }; pub static DEFAULT_CLIENT_VERSION: LazyLock = From 1f83b7b40811d30ea242aa822379e71dd423663e Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Fri, 26 Jun 2026 14:26:58 +0200 Subject: [PATCH 2/9] fix clippy --- beacon_node/beacon_chain/src/fetch_blobs/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs index 1b3a6101b17..c7bd46381ce 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs @@ -432,7 +432,7 @@ async fn build_partial_columns_from_v4_response( ) -> Result>, FetchEngineBlobError> { let num_blobs = response.len(); let num_columns = custody_columns_indices.len(); - let mut sorted_column_indices: Vec<_> = custody_columns_indices.iter().copied().collect(); + let mut sorted_column_indices = custody_columns_indices.to_vec(); sorted_column_indices.sort_unstable(); let mut custody_columns: Vec> = From 07a267ad5a5d2bdef91cd52deda7db31a9ee03cd Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Thu, 2 Jul 2026 10:49:06 +0200 Subject: [PATCH 3/9] cleanup --- Cargo.lock | 20 +++++----- .../src/engine_api/json_structures.rs | 39 +------------------ 2 files changed, 12 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9cb2617310c..4a20cb7bb96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -683,7 +683,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -694,7 +694,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3203,7 +3203,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3357,9 +3357,9 @@ dependencies = [ [[package]] name = "ethereum_serde_utils" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" +checksum = "38df44a7a271ab43835678f9215b53cc2523e4714a215da6643d83dc110245da" dependencies = [ "alloy-primitives", "hex", @@ -6322,7 +6322,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -7829,7 +7829,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -8544,7 +8544,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -8889,7 +8889,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -10245,7 +10245,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/beacon_node/execution_layer/src/engine_api/json_structures.rs b/beacon_node/execution_layer/src/engine_api/json_structures.rs index 5b402eb007d..75cbb26290b 100644 --- a/beacon_node/execution_layer/src/engine_api/json_structures.rs +++ b/beacon_node/execution_layer/src/engine_api/json_structures.rs @@ -966,42 +966,6 @@ pub type BlobAndProofV3 = Option>; /// EIP-8070 parameters are 128-bit bitarrays (=16 bytes). pub const CUSTODY_COLUMNS_BITARRAY_BYTES: usize = 16; -// TODO(dknopik): use updated ethereum_serde_utils instead -mod bytes_16_hex { - use serde::{Deserializer, Serializer}; - use serde_utils::hex::PrefixedHexVisitor; - - const BYTES_LEN: usize = super::CUSTODY_COLUMNS_BITARRAY_BYTES; - - pub fn serialize(bytes: &[u8; BYTES_LEN], serializer: S) -> Result - where - S: Serializer, - { - let mut s = String::with_capacity(2 + BYTES_LEN * 2); - s.push_str("0x"); - s.push_str(&hex::encode(bytes)); - serializer.serialize_str(&s) - } - - pub fn deserialize<'de, D>(deserializer: D) -> Result<[u8; BYTES_LEN], D::Error> - where - D: Deserializer<'de>, - { - use serde::de::Error; - let decoded = deserializer.deserialize_str(PrefixedHexVisitor)?; - if decoded.len() != BYTES_LEN { - return Err(D::Error::custom(format!( - "expected {} bytes for custody bitarray, got {}", - BYTES_LEN, - decoded.len() - ))); - } - let mut array = [0u8; BYTES_LEN]; - array.copy_from_slice(&decoded); - Ok(array) - } -} - /// EIP-8070 - bitarray of length `CELLS_PER_EXT_BLOB` (=128). Bit `i` of /// byte `i / 8` (LSB-first within each byte) indicates column `i`. Used as /// the `indices_bitarray` parameter of `engine_getBlobsV4` and the @@ -1010,7 +974,8 @@ mod bytes_16_hex { #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(transparent)] pub struct CustodyColumnsBitArray( - #[serde(with = "bytes_16_hex")] [u8; CUSTODY_COLUMNS_BITARRAY_BYTES], + #[serde(with = "serde_utils::fixed_bytes_hex::bytes_16_hex")] + [u8; CUSTODY_COLUMNS_BITARRAY_BYTES], ); impl CustodyColumnsBitArray { From 77a6c6028a3652203d088b7252822acf183fd273 Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Fri, 26 Jun 2026 15:02:48 +0200 Subject: [PATCH 4/9] getblobsv4 for gloas --- .../beacon_chain/src/fetch_blobs/mod.rs | 234 ++++++------ .../beacon_chain/src/fetch_blobs/tests.rs | 338 +++++++++++++++++- 2 files changed, 471 insertions(+), 101 deletions(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs index af42e607acd..8f0d581f01d 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs @@ -13,8 +13,7 @@ mod fetch_blobs_beacon_adapter; mod tests; use crate::data_column_verification::{ - KzgVerifiedCustodyDataColumn, KzgVerifiedCustodyPartialDataColumn, - KzgVerifiedCustodyPartialDataColumnFulu, KzgVerifiedPartialDataColumn, + KzgVerifiedCustodyDataColumn, KzgVerifiedCustodyPartialDataColumn, KzgVerifiedPartialDataColumn, }; #[cfg_attr(test, double)] use crate::fetch_blobs::fetch_blobs_beacon_adapter::FetchBlobsBeaconAdapter; @@ -32,13 +31,14 @@ use execution_layer::json_structures::{ use metrics::{TryExt, inc_counter}; #[cfg(test)] use mockall_double::double; -use ssz_types::VariableList; +use ssz_types::{ProgressiveVariableList, VariableList}; use state_processing::per_block_processing::deneb::kzg_commitment_to_versioned_hash; use std::sync::Arc; use tracing::{debug, instrument, warn}; use types::data::{ BlobSidecarError, CellBitmap, ColumnIndex, DataColumnSidecarError, PartialDataColumn, - PartialDataColumnFulu, PartialDataColumnHeader, PartialDataColumnSidecarFulu, + PartialDataColumnFulu, PartialDataColumnGloas, PartialDataColumnHeader, + PartialDataColumnSidecarFulu, PartialDataColumnSidecarGloas, }; use types::{ AbstractExecPayload, BeaconStateError, EthSpec, Hash256, KzgCommitment, ListRef, @@ -151,32 +151,29 @@ async fn fetch_and_process_engine_blobs_inner( .spec() .is_peer_das_enabled_for_epoch(header_or_bid.slot().epoch(T::EthSpec::slots_per_epoch())) { - // `engine_getBlobsV4` only supports the Fulu partial-header path; the Gloas bid path - // falls back to V2/V3 until V4 support for partials is implemented. - let supports_v4 = chain_adapter.supports_get_blobs_v4().await?; - match header_or_bid { - PartialHeaderOrBid::PartialHeader(header) if supports_v4 => { - fetch_and_process_blobs_v4( - chain_adapter, - block_root, - header, - versioned_hashes, - custody_columns, - publish_fn, - ) - .await - } - header_or_bid => { - fetch_and_process_blobs_v2_or_v3( - chain_adapter, - block_root, - header_or_bid, - versioned_hashes, - custody_columns, - publish_fn, - ) - .await - } + // `engine_getBlobsV4` lets us request only the columns we custody and assemble partial + // columns directly from the cells the EL returns. It supports both the Fulu partial-header + // path and the Gloas bid path; we fall back to V2/V3 only when the EL lacks the capability. + if chain_adapter.supports_get_blobs_v4().await? { + fetch_and_process_blobs_v4( + chain_adapter, + block_root, + header_or_bid, + versioned_hashes, + custody_columns, + publish_fn, + ) + .await + } else { + fetch_and_process_blobs_v2_or_v3( + chain_adapter, + block_root, + header_or_bid, + versioned_hashes, + custody_columns, + publish_fn, + ) + .await } } else { Err(FetchEngineBlobError::InternalError( @@ -195,7 +192,6 @@ async fn fetch_and_process_blobs_v2_or_v3( publish_fn: impl Fn(Vec>) + Send + 'static, ) -> Result, FetchEngineBlobError> { let num_expected_blobs = versioned_hashes.len(); - let slot = header_or_bid.slot(); metrics::observe(&metrics::BLOBS_FROM_EL_EXPECTED, num_expected_blobs as f64); @@ -296,7 +292,33 @@ async fn fetch_and_process_blobs_v2_or_v3( return Ok(None); } - let availability_processing_status = match &header_or_bid { + let availability_processing_status = import_custody_partial_columns( + &chain_adapter, + block_root, + &header_or_bid, + custody_columns_to_import, + publish_fn, + ) + .await?; + + Ok(Some(availability_processing_status)) +} + +/// Merge the deduplicated custody partial columns into the appropriate fork-specific cache, publish +/// any newly-completed columns, and return the resulting availability status. +/// +/// This is the shared tail for both the V2/V3 and V4 fetch-blobs paths. The Fulu (partial-header) +/// path goes through the [`PartialDataColumnAssembler`](crate::partial_data_column_assembler), while +/// the Gloas (bid) path goes through the [`PendingPayloadCache`](crate::pending_payload_cache). +async fn import_custody_partial_columns( + chain_adapter: &Arc>, + block_root: Hash256, + header_or_bid: &PartialHeaderOrBid, + custody_columns_to_import: Vec>, + publish_fn: impl Fn(Vec>) + Send + 'static, +) -> Result { + let slot = header_or_bid.slot(); + match header_or_bid { PartialHeaderOrBid::PartialHeader(header) => { let custody_columns_to_import: Vec<_> = custody_columns_to_import .into_iter() @@ -333,9 +355,11 @@ async fn fetch_and_process_blobs_v2_or_v3( chain_adapter .process_engine_blobs_fulu(slot, block_root, full_columns) - .await? + .await } else { - AvailabilityProcessingStatus::MissingComponents(slot, block_root) + Ok(AvailabilityProcessingStatus::MissingComponents( + slot, block_root, + )) } } PartialHeaderOrBid::Bid(bid) => { @@ -366,27 +390,27 @@ async fn fetch_and_process_blobs_v2_or_v3( chain_adapter .process_payload_envelope_availability(slot, availability) - .await? + .await } - }; - - Ok(Some(availability_processing_status)) + } } /// EIP-8070 `engine_getBlobsV4` path: request only the columns we custody from /// the EL and assemble `PartialDataColumn`s directly from the cells it returns, /// skipping the local KZG-cell derivation that V2/V3 require. +/// +/// Works for both the Fulu (partial-header) and Gloas (bid) paths; the fork-specific assembly and +/// import happen in [`build_partial_columns_from_v4_response`] and [`import_custody_partial_columns`]. #[instrument(skip_all, level = "debug")] async fn fetch_and_process_blobs_v4( chain_adapter: FetchBlobsBeaconAdapter, block_root: Hash256, - header: Arc>, + header_or_bid: PartialHeaderOrBid, versioned_hashes: Vec, custody_columns_indices: &[ColumnIndex], publish_fn: impl Fn(Vec>) + Send + 'static, ) -> Result, FetchEngineBlobError> { let num_expected_blobs = versioned_hashes.len(); - let slot = header.slot(); metrics::observe(&metrics::BLOBS_FROM_EL_EXPECTED, num_expected_blobs as f64); inc_counter(&metrics::BEACON_ENGINE_GET_BLOBS_V4_REQUESTS_TOTAL); @@ -461,7 +485,7 @@ async fn fetch_and_process_blobs_v4( let custody_columns_to_import = build_partial_columns_from_v4_response( &chain_adapter, block_root, - &header, + &header_or_bid, response, custody_columns_indices, ) @@ -475,54 +499,40 @@ async fn fetch_and_process_blobs_v4( return Ok(None); } - // TODO(gloas): support partials here - let full_columns = match chain_adapter.partial_assembler() { - Some(assembler) => { - assembler - .merge_partials(block_root, custody_columns_to_import, header) - .ok_or_else(|| { - FetchEngineBlobError::InternalError( - "Failed to merge partials into assembler".to_string(), - ) - })? - .full_columns - } - None => custody_columns_to_import - .into_iter() - .filter_map(|col| col.try_into_full(&header)) - .collect(), - }; - - if !full_columns.is_empty() { - publish_fn(full_columns.clone()); - } - - let availability_processing_status = if !full_columns.is_empty() { - chain_adapter - .process_engine_blobs_fulu(slot, block_root, full_columns) - .await? - } else { - AvailabilityProcessingStatus::MissingComponents(slot, block_root) - }; + let availability_processing_status = import_custody_partial_columns( + &chain_adapter, + block_root, + &header_or_bid, + custody_columns_to_import, + publish_fn, + ) + .await?; Ok(Some(availability_processing_status)) } -/// Group the per-blob cells/proofs returned by `engine_getBlobsV4` into one -/// `PartialDataColumn` per custody column index. +/// Group the per-blob cells/proofs returned by `engine_getBlobsV4` into one `PartialDataColumn` per +/// custody column index. +/// +/// Builds the Fulu or Gloas partial-column variant depending on `header_or_bid`, then dedupes +/// against columns we've already observed on gossip or cached in the data availability checker. The +/// returned columns are known to be custody columns (we only request custody indices from the EL), +/// but are wrapped in [`KzgVerifiedPartialDataColumn`] so the shared +/// [`import_custody_partial_columns`] tail can assert custody and split by fork. async fn build_partial_columns_from_v4_response( chain_adapter: &Arc>, block_root: Hash256, - header: &PartialDataColumnHeader, + header_or_bid: &PartialHeaderOrBid, response: Vec>>, custody_columns_indices: &[ColumnIndex], -) -> Result>, FetchEngineBlobError> { +) -> Result>, FetchEngineBlobError> { let num_blobs = response.len(); let num_columns = custody_columns_indices.len(); + let slot = header_or_bid.slot(); let mut sorted_column_indices = custody_columns_indices.to_vec(); sorted_column_indices.sort_unstable(); - let mut custody_columns: Vec> = + let mut custody_columns: Vec> = Vec::with_capacity(num_columns); for (col_pos, &column_index) in sorted_column_indices.iter().enumerate() { let mut bitmap = CellBitmap::::with_capacity(num_blobs).map_err(|_| { @@ -562,34 +572,60 @@ async fn build_partial_columns_from_v4_response( if cells.is_empty() { continue; } - let partial = PartialDataColumnFulu { - block_root, - index: column_index, - sidecar: PartialDataColumnSidecarFulu:: { - cells_present_bitmap: bitmap, - column: VariableList::try_from(cells).map_err(|_| { + + // The cells and proofs are fork-independent; only the wrapping partial-column variant + // differs (Gloas carries the slot in the partial and omits the inline header). + let partial = match header_or_bid { + PartialHeaderOrBid::PartialHeader(_) => { + let column = VariableList::try_from(cells).map_err(|_| { FetchEngineBlobError::InternalError("unexpectedly many cells".to_string()) - })?, - kzg_proofs: VariableList::try_from(proofs).map_err(|_| { + })?; + let kzg_proofs = VariableList::try_from(proofs).map_err(|_| { FetchEngineBlobError::InternalError("unexpectedly many proofs".to_string()) - })?, - header: None.into(), - }, + })?; + + PartialDataColumn::Fulu(PartialDataColumnFulu { + block_root, + index: column_index, + sidecar: PartialDataColumnSidecarFulu:: { + cells_present_bitmap: bitmap, + column, + kzg_proofs, + header: None.into(), + }, + }) + } + PartialHeaderOrBid::Bid(_) => { + let column = ProgressiveVariableList::new(cells); + let kzg_proofs = ProgressiveVariableList::new(proofs); + + PartialDataColumn::Gloas(PartialDataColumnGloas { + block_root, + slot, + index: column_index, + sidecar: PartialDataColumnSidecarGloas:: { + cells_present_bitmap: bitmap, + column, + kzg_proofs, + }, + }) + } }; - if let Some(custody_column) = KzgVerifiedCustodyPartialDataColumn::from_asserted_custody( - KzgVerifiedPartialDataColumn::from_execution_verified(PartialDataColumn::Fulu(partial)), - ) - .into_fulu() - { - custody_columns.push(custody_column); - } + custody_columns.push(KzgVerifiedPartialDataColumn::from_execution_verified( + partial, + )); } // Dedupe against gossip-observed columns. - let observation_key = ObservationKey::new_proposer_key( - header.signed_block_header.message.proposer_index, - header.slot(), - ); + let observation_key = match header_or_bid { + PartialHeaderOrBid::PartialHeader(header) => ObservationKey::new_proposer_key( + header.signed_block_header.message.proposer_index, + header.slot(), + ), + PartialHeaderOrBid::Bid(bid) => { + ObservationKey::new_block_root_key(block_root, bid.message.slot) + } + }; if let Some(observed_columns) = chain_adapter.data_column_known_for_observation_key(observation_key) { @@ -597,9 +633,7 @@ async fn build_partial_columns_from_v4_response( } // Dedupe against DA-checker-cached columns. - if let Some(known_columns) = - chain_adapter.cached_data_column_indexes(&block_root, header.slot()) - { + if let Some(known_columns) = chain_adapter.cached_data_column_indexes(&block_root, slot) { custody_columns.retain(|col| !known_columns.contains(&col.index())); } diff --git a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs index dc108a212b0..249fe29f9c7 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs @@ -267,6 +267,329 @@ mod get_blobs_v2 { } } +mod get_blobs_v4 { + use super::*; + use crate::custody_context::{CustodyContext, NodeCustodyType}; + use crate::pending_payload_cache::PendingPayloadCache; + use crate::test_utils::{ + NumBlobs, generate_data_column_indices_rand_order, generate_rand_block_and_blobs, + }; + use execution_layer::json_structures::{BlobCellsAndProofsV1, JsonCell}; + use kzg::KzgProof; + use slot_clock::{SlotClock, TestingSlotClock}; + use std::time::Duration; + use types::test_utils::test_unstructured; + use types::{Cell, ColumnIndex, PartialDataColumnHeader, Slot}; + + const CUSTODY_COLUMNS: [ColumnIndex; 3] = [0, 1, 2]; + + /// Build an `engine_getBlobsV4` response for `num_blobs` blobs, with one entry per requested + /// custody column (positionally, lowest column index first). `present(blob_idx, col_pos)` + /// decides whether that cell/proof is present. Cell contents are irrelevant: the V4 path trusts + /// the EL and never re-verifies the returned cells. + fn make_v4_response( + num_blobs: usize, + num_custody_cols: usize, + present: impl Fn(usize, usize) -> bool, + ) -> Vec>> { + (0..num_blobs) + .map(|blob_idx| { + let blob_cells = (0..num_custody_cols) + .map(|col_pos| { + present(blob_idx, col_pos).then(|| JsonCell(Cell::::default())) + }) + .collect(); + let proofs = (0..num_custody_cols) + .map(|col_pos| present(blob_idx, col_pos).then(KzgProof::empty)) + .collect(); + Some(BlobCellsAndProofsV1 { blob_cells, proofs }) + }) + .collect() + } + + fn fulu_header(block: &SignedBeaconBlock) -> PartialHeaderOrBid { + PartialHeaderOrBid::PartialHeader(Arc::new( + PartialDataColumnHeader::try_from(block).unwrap(), + )) + } + + /// A complete V4 response assembles into full columns that are published and imported. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_fulu_success() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Fulu); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + let (block, _blobs) = create_test_block_and_blobs(&mock_adapter, 2); + let block_root = block.canonical_root(); + + let response = make_v4_response(2, CUSTODY_COLUMNS.len(), |_, _| true); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_fork_choice_contains_block(&mut mock_adapter, vec![]); + mock_adapter + .expect_data_column_known_for_observation_key() + .returning(|_| None); + mock_adapter + .expect_cached_data_column_indexes() + .returning(|_, _| None); + mock_process_engine_blobs_result( + &mut mock_adapter, + Ok(AvailabilityProcessingStatus::Imported( + block.slot(), + block_root, + )), + ); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + fulu_header(block.as_ref()), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert_eq!( + processing_status, + Some(AvailabilityProcessingStatus::Imported( + block.slot(), + block_root + )) + ); + assert_eq!( + extract_published_blobs(publish_fn_args).len(), + CUSTODY_COLUMNS.len(), + "all custody columns should be published" + ); + } + + /// A partial V4 response that leaves every column short of a cell yields no full columns: nothing + /// is published or imported, and we report missing components. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_fulu_partial_response_completes_nothing() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Fulu); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + let (block, _blobs) = create_test_block_and_blobs(&mock_adapter, 2); + let block_root = block.canonical_root(); + + // Only the first blob's cells are present, so each column is missing blob 1's cell. + let response = make_v4_response(2, CUSTODY_COLUMNS.len(), |blob_idx, _| blob_idx == 0); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_fork_choice_contains_block(&mut mock_adapter, vec![]); + mock_adapter + .expect_data_column_known_for_observation_key() + .returning(|_| None); + mock_adapter + .expect_cached_data_column_indexes() + .returning(|_, _| None); + mock_adapter.expect_process_engine_blobs_fulu().times(0); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + fulu_header(block.as_ref()), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert_eq!( + processing_status, + Some(AvailabilityProcessingStatus::MissingComponents( + block.slot(), + block_root + )) + ); + assert_eq!( + publish_fn_args.lock().unwrap().len(), + 0, + "no columns should be published" + ); + } + + /// An empty (all-null) V4 response is treated as a miss: nothing imported or published. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_no_cells_returned() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Fulu); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + let (block, _blobs) = create_test_block_and_blobs(&mock_adapter, 2); + let block_root = block.canonical_root(); + + let response = make_v4_response(2, CUSTODY_COLUMNS.len(), |_, _| false); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_adapter.expect_process_engine_blobs_fulu().times(0); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + fulu_header(block.as_ref()), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert_eq!(processing_status, None); + assert_eq!(publish_fn_args.lock().unwrap().len(), 0); + } + + /// A response whose blob count disagrees with the block's commitment count is rejected. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_wrong_response_length() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Fulu); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + let (block, _blobs) = create_test_block_and_blobs(&mock_adapter, 2); + let block_root = block.canonical_root(); + + // The block expects 2 blobs, but the EL returns only 1 entry. + let response = make_v4_response(1, CUSTODY_COLUMNS.len(), |_, _| true); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_adapter.expect_process_engine_blobs_fulu().times(0); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + fulu_header(block.as_ref()), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert_eq!(processing_status, None); + assert_eq!(publish_fn_args.lock().unwrap().len(), 0); + } + + /// Columns already observed on gossip are deduped away, leaving nothing to import. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_all_columns_already_observed() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Fulu); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + let (block, _blobs) = create_test_block_and_blobs(&mock_adapter, 2); + let block_root = block.canonical_root(); + + let response = make_v4_response(2, CUSTODY_COLUMNS.len(), |_, _| true); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_fork_choice_contains_block(&mut mock_adapter, vec![]); + mock_adapter + .expect_data_column_known_for_observation_key() + .returning(|_| Some(hashset![0, 1, 2])); + mock_adapter + .expect_cached_data_column_indexes() + .returning(|_, _| None); + mock_adapter.expect_process_engine_blobs_fulu().times(0); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + fulu_header(block.as_ref()), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert_eq!(processing_status, None); + assert_eq!(publish_fn_args.lock().unwrap().len(), 0); + } + + /// The Gloas (bid) path also flows through V4: a complete response merges into the pending + /// payload cache, publishes the completed columns, and processes envelope availability. This is + /// the regression test for the previously-missing Gloas support in the V4 path. + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] + async fn test_fetch_blobs_v4_gloas_success() { + let mut mock_adapter = mock_beacon_adapter_v4(ForkName::Gloas); + let spec = mock_adapter.spec().clone(); + let (publish_fn, publish_fn_args) = mock_publish_fn(); + + // A Gloas block carries its blob commitments in the execution payload bid. + let mut u = test_unstructured(); + let (block, _blobs) = + generate_rand_block_and_blobs::(ForkName::Gloas, NumBlobs::Number(2), &mut u) + .expect("generate gloas block"); + let block_root = block.canonical_root(); + let bid = Arc::new( + block + .message() + .body() + .signed_execution_payload_bid() + .expect("gloas block has a bid") + .clone(), + ); + + // Real pending payload cache: the Gloas path inserts the bid and merges partial columns into + // it, so a mock would not exercise the actual merge/availability logic. + let slot_clock = TestingSlotClock::new( + Slot::new(0), + Duration::from_secs(0), + spec.get_slot_duration(), + ); + let custody_context = Arc::new(CustodyContext::::new( + NodeCustodyType::Supernode, + generate_data_column_indices_rand_order::(), + slot_clock, + false, + spec.clone(), + )); + let cache = Arc::new( + PendingPayloadCache::::new(get_kzg(&spec), custody_context, spec.clone()) + .expect("create pending payload cache"), + ); + mock_adapter + .expect_pending_payload_cache() + .return_const(cache); + + let response = make_v4_response(2, CUSTODY_COLUMNS.len(), |_, _| true); + mock_adapter + .expect_get_blobs_v4() + .return_once(move |_, _| Ok(response)); + mock_fork_choice_contains_block(&mut mock_adapter, vec![]); + mock_adapter + .expect_data_column_known_for_observation_key() + .returning(|_| None); + mock_adapter + .expect_cached_data_column_indexes() + .returning(|_, _| None); + mock_adapter + .expect_process_payload_envelope_availability() + .return_once(move |slot, _availability| { + Ok(AvailabilityProcessingStatus::MissingComponents( + slot, block_root, + )) + }); + + let processing_status = fetch_and_process_engine_blobs_inner( + mock_adapter, + block_root, + PartialHeaderOrBid::Bid(bid), + &CUSTODY_COLUMNS, + publish_fn, + ) + .await + .expect("fetch blobs should succeed"); + + assert!( + processing_status.is_some(), + "the gloas path should return an availability status" + ); + assert_eq!( + extract_published_blobs(publish_fn_args).len(), + CUSTODY_COLUMNS.len(), + "all three custody columns should complete and be published" + ); + } +} + /// Extract the `Vec>` passed to the `publish_fn`. fn extract_published_blobs( publish_fn_args: Arc>>>>, @@ -353,6 +676,19 @@ fn mock_publish_fn() -> ( } fn mock_beacon_adapter(fork_name: ForkName) -> MockFetchBlobsBeaconAdapter { + mock_beacon_adapter_with_capabilities(fork_name, false) +} + +/// Like [`mock_beacon_adapter`], but advertises `engine_getBlobsV4` support so the V4 fetch path is +/// exercised instead of V2/V3. +fn mock_beacon_adapter_v4(fork_name: ForkName) -> MockFetchBlobsBeaconAdapter { + mock_beacon_adapter_with_capabilities(fork_name, true) +} + +fn mock_beacon_adapter_with_capabilities( + fork_name: ForkName, + supports_get_blobs_v4: bool, +) -> MockFetchBlobsBeaconAdapter { let test_runtime = TestRuntime::default(); let spec = Arc::new(fork_name.make_genesis_spec(E::default_spec())); let kzg = get_kzg(&spec); @@ -369,7 +705,7 @@ fn mock_beacon_adapter(fork_name: ForkName) -> MockFetchBlobsBeaconAdapter { .returning(move || Ok(false)); mock_adapter .expect_supports_get_blobs_v4() - .returning(move || Ok(false)); + .returning(move || Ok(supports_get_blobs_v4)); mock_adapter .expect_partial_assembler() .return_const(Some(Arc::new(partial_assembler))); From 279b66427ae82bcf5883ea7c54e81f14e4d2d27c Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Tue, 25 Aug 2026 16:40:23 +0200 Subject: [PATCH 5/9] fix tests --- beacon_node/beacon_chain/src/fetch_blobs/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs index 249fe29f9c7..54f5f372b14 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs @@ -542,7 +542,7 @@ mod get_blobs_v4 { spec.clone(), )); let cache = Arc::new( - PendingPayloadCache::::new(get_kzg(&spec), custody_context, spec.clone()) + PendingPayloadCache::::new(get_kzg(&spec), custody_context, false, spec.clone()) .expect("create pending payload cache"), ); mock_adapter From 40d170897f5ed67875b20723829674e6af385c71 Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Thu, 27 Aug 2026 09:03:39 +0200 Subject: [PATCH 6/9] implement mock EL handler for getblobsv4 --- .../test_utils/execution_block_generator.rs | 123 +++++++++++++++--- .../mainnet/test_blobs_bundle_v2_cells.ssz | Bin 0 -> 262144 bytes .../src/test_utils/handle_rpc.rs | 35 +++++ .../execution_layer/src/test_utils/mod.rs | 4 +- 4 files changed, 140 insertions(+), 22 deletions(-) create mode 100644 beacon_node/execution_layer/src/test_utils/fixtures/mainnet/test_blobs_bundle_v2_cells.ssz diff --git a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs index 1fcff6806f2..5edaa7da635 100644 --- a/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs +++ b/beacon_node/execution_layer/src/test_utils/execution_block_generator.rs @@ -15,7 +15,7 @@ use parking_lot::Mutex; use rand::{Rng, SeedableRng, rngs::StdRng}; use serde::{Deserialize, Serialize}; use ssz::Decode; -use ssz_types::{ProgressiveVariableList, VariableList}; +use ssz_types::{FixedVector, ProgressiveVariableList, VariableList}; use state_processing::per_block_processing::deneb::kzg_commitment_to_versioned_hash; use std::cmp::max; use std::collections::HashMap; @@ -23,6 +23,7 @@ use std::sync::Arc; use tracing::warn; use tree_hash::TreeHash; use tree_hash_derive::TreeHash; +use types::data::Cell; use types::{ Blob, ChainSpec, EthSpec, ExecutionBlockHash, ExecutionPayload, ExecutionPayloadBellatrix, ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadElectra, ExecutionPayloadFulu, @@ -32,6 +33,9 @@ use types::{ const TEST_BLOB_BUNDLE: &[u8] = include_bytes!("fixtures/mainnet/test_blobs_bundle.ssz"); const TEST_BLOB_BUNDLE_V2: &[u8] = include_bytes!("fixtures/mainnet/test_blobs_bundle_v2.ssz"); +/// The cells of the (single) blob in `TEST_BLOB_BUNDLE_V2`, as an SSZ-encoded +/// `FixedVector, E::CellsPerExtBlob>`. +const TEST_BLOB_CELLS: &[u8] = include_bytes!("fixtures/mainnet/test_blobs_bundle_v2_cells.ssz"); pub const DEFAULT_GAS_LIMIT: u64 = 60_000_000; const GAS_USED: u64 = DEFAULT_GAS_LIMIT - 1; @@ -167,6 +171,9 @@ pub struct ExecutionBlockGenerator { * deneb stuff */ pub blobs_bundles: HashMap>, + /// The cells for each blob in `blobs_bundles`, keyed by payload id and indexed by the blob's + /// position within the bundle. Only populated for Fulu-enabled payloads. + pub blob_cells: HashMap>>>, pub kzg: Option>, rng: Arc>, /* @@ -216,6 +223,7 @@ impl ExecutionBlockGenerator { amsterdam_time, heze_time, blobs_bundles: <_>::default(), + blob_cells: <_>::default(), kzg, rng: make_rng(), execution_requests: <_>::default(), @@ -489,8 +497,8 @@ impl ExecutionBlockGenerator { self.next_execution_requests = Some(requests); } - /// Look up a blob and proof by versioned hash across all stored bundles. - pub fn get_blob_and_proof(&self, versioned_hash: &Hash256) -> Option> { + /// Find the payload id, bundle, and blob index for a blob by versioned hash. + fn find_blob(&self, versioned_hash: &Hash256) -> Option<(&PayloadId, &BlobsBundle, usize)> { self.blobs_bundles .iter() .find_map(|(payload_id, blobs_bundle)| { @@ -502,27 +510,51 @@ impl ExecutionBlockGenerator { .find(|(_, commitment)| { &kzg_commitment_to_versioned_hash(commitment) == versioned_hash })?; - let is_fulu = self.payload_ids.get(payload_id)?.fork_name().fulu_enabled(); - let blob = blobs_bundle.blobs.get(blob_idx)?.clone(); - if is_fulu { - let start = blob_idx * E::cells_per_ext_blob(); - let end = start + E::cells_per_ext_blob(); - let proofs = blobs_bundle - .proofs - .get(start..end)? - .to_vec() - .try_into() - .ok()?; - Some(BlobAndProof::V2(BlobAndProofV2 { blob, proofs })) - } else { - Some(BlobAndProof::V1(BlobAndProofV1 { - blob, - proof: *blobs_bundle.proofs.get(blob_idx)?, - })) - } + Some((payload_id, blobs_bundle, blob_idx)) }) } + /// Slice the cell proofs for the blob at `blob_idx` out of a Fulu-style bundle. + fn cell_proofs(blobs_bundle: &BlobsBundle, blob_idx: usize) -> Option> { + let start = blob_idx * E::cells_per_ext_blob(); + let end = start + E::cells_per_ext_blob(); + blobs_bundle + .proofs + .get(start..end)? + .to_vec() + .try_into() + .ok() + } + + /// Look up a blob and proof by versioned hash across all stored bundles. + pub fn get_blob_and_proof(&self, versioned_hash: &Hash256) -> Option> { + let (payload_id, blobs_bundle, blob_idx) = self.find_blob(versioned_hash)?; + let is_fulu = self.payload_ids.get(payload_id)?.fork_name().fulu_enabled(); + let blob = blobs_bundle.blobs.get(blob_idx)?.clone(); + if is_fulu { + let proofs = Self::cell_proofs(blobs_bundle, blob_idx)?; + Some(BlobAndProof::V2(BlobAndProofV2 { blob, proofs })) + } else { + Some(BlobAndProof::V1(BlobAndProofV1 { + blob, + proof: *blobs_bundle.proofs.get(blob_idx)?, + })) + } + } + + /// Look up the cells and cell proofs for a blob by versioned hash across all stored bundles. + /// + /// Returns `None` for pre-Fulu blobs, which have no cells. + pub fn get_blob_cells_and_proofs( + &self, + versioned_hash: &Hash256, + ) -> Option<(Vec>, KzgProofs)> { + let (payload_id, blobs_bundle, blob_idx) = self.find_blob(versioned_hash)?; + let cells = self.blob_cells.get(payload_id)?.get(blob_idx)?.clone(); + let proofs = Self::cell_proofs(blobs_bundle, blob_idx)?; + Some((cells, proofs)) + } + pub fn new_payload(&mut self, payload: ExecutionPayload) -> PayloadStatusV1 { let Some(parent) = self.blocks.get(&payload.parent_hash()) else { return PayloadStatusV1 { @@ -860,6 +892,14 @@ impl ExecutionBlockGenerator { } } } + + if fork_name.fulu_enabled() { + // `generate_blobs` only produces copies of the static test blob, so the + // precomputed cells fixture applies to every blob in the bundle. + let cells = load_test_blob_cells::()?; + self.blob_cells.insert(id, vec![cells; bundle.blobs.len()]); + } + bundle } else { BlobsBundle::default() @@ -922,6 +962,15 @@ pub fn load_test_blobs_bundle_v2() )) } +/// Load the precomputed cells for the single blob in `TEST_BLOB_BUNDLE_V2`. +/// +/// Every blob served by the mock EL is a copy of that blob, so these cells apply to all of them. +pub fn load_test_blob_cells() -> Result>, String> { + FixedVector::, E::CellsPerExtBlob>::from_ssz_bytes(TEST_BLOB_CELLS) + .map(|cells| cells.to_vec()) + .map_err(|e| format!("Unable to decode ssz: {:?}", e)) +} + pub fn generate_blobs( n_blobs: usize, fork_name: ForkName, @@ -1154,4 +1203,36 @@ mod test { Kzg::new_from_trusted_setup(&get_trusted_setup()) .map_err(|e| format!("Failed to load trusted setup: {e:?}")) } + + #[test] + fn valid_test_blob_cells() { + validate_test_blob_cells::() + .expect("Mainnet preset cells fixture should match the test blob"); + validate_test_blob_cells::() + .expect("Minimal preset cells fixture should match the test blob"); + } + + fn validate_test_blob_cells() -> Result<(), String> { + let kzg = load_kzg()?; + let (_, _, blob) = load_test_blobs_bundle_v2::()?; + let kzg_blob: KzgBlobRef = blob + .as_ref() + .try_into() + .map_err(|e| format!("Error converting blob to kzg blob ref: {e:?}"))?; + let computed = kzg + .compute_cells(kzg_blob) + .map_err(|e| format!("Failed to compute cells: {e:?}"))?; + let embedded = load_test_blob_cells::()?; + if embedded.len() != computed.len() + || embedded + .iter() + .zip(computed.iter()) + .any(|(embedded_cell, computed_cell)| { + embedded_cell[..] != computed_cell.as_ref()[..] + }) + { + return Err("cells fixture does not match cells computed from the test blob".into()); + } + Ok(()) + } } diff --git a/beacon_node/execution_layer/src/test_utils/fixtures/mainnet/test_blobs_bundle_v2_cells.ssz b/beacon_node/execution_layer/src/test_utils/fixtures/mainnet/test_blobs_bundle_v2_cells.ssz new file mode 100644 index 0000000000000000000000000000000000000000..819cddfe47212975fa9d7f4332df3d9eafe0334a GIT binary patch literal 262144 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�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 literal 0 HcmV?d00001 diff --git a/beacon_node/execution_layer/src/test_utils/handle_rpc.rs b/beacon_node/execution_layer/src/test_utils/handle_rpc.rs index 2f4ad9fdaa3..f89c78bd4d7 100644 --- a/beacon_node/execution_layer/src/test_utils/handle_rpc.rs +++ b/beacon_node/execution_layer/src/test_utils/handle_rpc.rs @@ -528,6 +528,41 @@ pub async fn handle_rpc( let response: Option>> = results.into_iter().collect(); Ok(serde_json::to_value(response).unwrap()) } + ENGINE_GET_BLOBS_V4 => { + let versioned_hashes = + get_param::>(params, 0).map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?; + let indices_bitarray = get_param::(params, 1) + .map_err(|s| (s, BAD_PARAMS_ERROR_CODE))?; + let requested_indices = indices_bitarray + .iter_set_bits() + .map(|i| i as usize) + .collect::>(); + + let generator = ctx.execution_block_generator.read(); + let response = versioned_hashes + .iter() + .map(|hash| { + // Pre-Fulu blobs have no cells and cannot be served over V4. + let Some((cells, cell_proofs)) = generator.get_blob_cells_and_proofs(hash) + else { + return Ok(None); + }; + let mut blob_cells = Vec::with_capacity(requested_indices.len()); + let mut proofs = Vec::with_capacity(requested_indices.len()); + for &index in &requested_indices { + let (cell, proof) = + cells.get(index).zip(cell_proofs.get(index)).ok_or(( + format!("cell index {index} out of range"), + BAD_PARAMS_ERROR_CODE, + ))?; + blob_cells.push(Some(JsonCell(cell.clone()))); + proofs.push(Some(*proof)); + } + Ok(Some(BlobCellsAndProofsV1:: { blob_cells, proofs })) + }) + .collect::, (String, i64)>>()?; + Ok(serde_json::to_value(response).unwrap()) + } ENGINE_FORKCHOICE_UPDATED_V1 | ENGINE_FORKCHOICE_UPDATED_V2 | ENGINE_FORKCHOICE_UPDATED_V3 diff --git a/beacon_node/execution_layer/src/test_utils/mod.rs b/beacon_node/execution_layer/src/test_utils/mod.rs index 992da1a0d8c..ac0fbc1080b 100644 --- a/beacon_node/execution_layer/src/test_utils/mod.rs +++ b/beacon_node/execution_layer/src/test_utils/mod.rs @@ -58,7 +58,9 @@ pub const DEFAULT_ENGINE_CAPABILITIES: EngineCapabilities = EngineCapabilities { get_payload_v6: true, get_client_version_v1: true, get_blobs_v2: true, - get_blobs_v3: true, + // The mock server has no `engine_getBlobsV3` handler, so it must not advertise it: nodes + // prefer the advertised version and get method-not-found errors instead of blobs. + get_blobs_v3: false, get_blobs_v4: true, }; From 1c6be2a98adae1ba95c99f185844fcff781795df Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Thu, 3 Sep 2026 16:21:09 +0200 Subject: [PATCH 7/9] fix tests --- beacon_node/beacon_chain/src/fetch_blobs/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs index 54f5f372b14..91ad01e0cf8 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs @@ -542,7 +542,7 @@ mod get_blobs_v4 { spec.clone(), )); let cache = Arc::new( - PendingPayloadCache::::new(get_kzg(&spec), custody_context, false, spec.clone()) + PendingPayloadCache::::new(get_kzg(&spec), custody_context, false, 0, spec.clone()) .expect("create pending payload cache"), ); mock_adapter From 1ac03b5664adcada5c414cf609b20001f56c41c7 Mon Sep 17 00:00:00 2001 From: Daniel Knopik Date: Wed, 9 Sep 2026 11:40:43 +0200 Subject: [PATCH 8/9] respect null return values --- .../src/fetch_blobs/fetch_blobs_beacon_adapter.rs | 4 ++-- beacon_node/beacon_chain/src/fetch_blobs/mod.rs | 9 +++++++++ beacon_node/beacon_chain/src/fetch_blobs/tests.rs | 9 +++++---- beacon_node/execution_layer/src/engine_api/http.rs | 2 +- .../execution_layer/src/engine_api/json_structures.rs | 2 ++ beacon_node/execution_layer/src/lib.rs | 4 ++-- 6 files changed, 21 insertions(+), 9 deletions(-) diff --git a/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs b/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs index 159532046ca..db4d956e3f7 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/fetch_blobs_beacon_adapter.rs @@ -5,7 +5,7 @@ use crate::partial_data_column_assembler::PartialDataColumnAssembler; use crate::pending_payload_cache::{Availability, PendingPayloadCache}; use crate::{AvailabilityProcessingStatus, BeaconChain, BeaconChainTypes}; use execution_layer::json_structures::{ - BlobAndProofV2, BlobAndProofV3, BlobCellsAndProofsV1, CustodyColumnsBitArray, + BlobAndProofV2, BlobAndProofV3, CustodyColumnsBitArray, GetBlobsV4List, }; use kzg::Kzg; #[cfg(test)] @@ -87,7 +87,7 @@ impl FetchBlobsBeaconAdapter { &self, versioned_hashes: Vec, custody_columns: CustodyColumnsBitArray, - ) -> Result>>, FetchEngineBlobError> { + ) -> Result>, FetchEngineBlobError> { let execution_layer = self .chain .execution_layer diff --git a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs index 8f0d581f01d..7c97553baba 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/mod.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/mod.rs @@ -439,6 +439,15 @@ async fn fetch_and_process_blobs_v4( inc_counter(&metrics::BLOBS_FROM_EL_ERROR_TOTAL); })?; + let Some(response) = response else { + warn!( + num_expected_blobs, + "engine_getBlobsV4 returned null, EL might be syncing" + ); + inc_counter(&metrics::BLOBS_FROM_EL_ERROR_TOTAL); + return Ok(None); + }; + if response.len() != num_expected_blobs { warn!( response_len = response.len(), diff --git a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs index 91ad01e0cf8..10795562159 100644 --- a/beacon_node/beacon_chain/src/fetch_blobs/tests.rs +++ b/beacon_node/beacon_chain/src/fetch_blobs/tests.rs @@ -274,7 +274,7 @@ mod get_blobs_v4 { use crate::test_utils::{ NumBlobs, generate_data_column_indices_rand_order, generate_rand_block_and_blobs, }; - use execution_layer::json_structures::{BlobCellsAndProofsV1, JsonCell}; + use execution_layer::json_structures::{BlobCellsAndProofsV1, GetBlobsV4List, JsonCell}; use kzg::KzgProof; use slot_clock::{SlotClock, TestingSlotClock}; use std::time::Duration; @@ -291,8 +291,8 @@ mod get_blobs_v4 { num_blobs: usize, num_custody_cols: usize, present: impl Fn(usize, usize) -> bool, - ) -> Vec>> { - (0..num_blobs) + ) -> Option> { + let list = (0..num_blobs) .map(|blob_idx| { let blob_cells = (0..num_custody_cols) .map(|col_pos| { @@ -304,7 +304,8 @@ mod get_blobs_v4 { .collect(); Some(BlobCellsAndProofsV1 { blob_cells, proofs }) }) - .collect() + .collect(); + Some(list) } fn fulu_header(block: &SignedBeaconBlock) -> PartialHeaderOrBid { diff --git a/beacon_node/execution_layer/src/engine_api/http.rs b/beacon_node/execution_layer/src/engine_api/http.rs index df551029b10..cc7de356eb3 100644 --- a/beacon_node/execution_layer/src/engine_api/http.rs +++ b/beacon_node/execution_layer/src/engine_api/http.rs @@ -763,7 +763,7 @@ impl HttpJsonRpc { &self, versioned_hashes: Vec, indices_bitarray: CustodyColumnsBitArray, - ) -> Result>>, Error> { + ) -> Result>, Error> { let params = json!([versioned_hashes, indices_bitarray]); self.rpc_request( diff --git a/beacon_node/execution_layer/src/engine_api/json_structures.rs b/beacon_node/execution_layer/src/engine_api/json_structures.rs index 735e9506268..25b18dc17f8 100644 --- a/beacon_node/execution_layer/src/engine_api/json_structures.rs +++ b/beacon_node/execution_layer/src/engine_api/json_structures.rs @@ -1115,6 +1115,8 @@ pub struct BlobCellsAndProofsV1 { pub proofs: Vec>, } +pub type GetBlobsV4List = Vec>>; + #[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct JsonForkchoiceStateV1 { diff --git a/beacon_node/execution_layer/src/lib.rs b/beacon_node/execution_layer/src/lib.rs index d59e6500875..0722edef4ed 100644 --- a/beacon_node/execution_layer/src/lib.rs +++ b/beacon_node/execution_layer/src/lib.rs @@ -5,7 +5,7 @@ //! deposit-contract functionality that the `beacon_node/eth1` crate already provides. use crate::json_structures::{ - BlobAndProofV2, BlobAndProofV3, BlobCellsAndProofsV1, CustodyColumnsBitArray, + BlobAndProofV2, BlobAndProofV3, CustodyColumnsBitArray, GetBlobsV4List, }; use crate::payload_cache::PayloadCache; use arc_swap::ArcSwapOption; @@ -1785,7 +1785,7 @@ impl ExecutionLayer { &self, query: Vec, custody_columns: CustodyColumnsBitArray, - ) -> Result>>, Error> { + ) -> Result>, Error> { let capabilities = self.get_engine_capabilities(None).await?; if capabilities.get_blobs_v4 { From 81335acd8c1de08ca048c6c4c7a29be6d2e2ea6c Mon Sep 17 00:00:00 2001 From: Mark Mackey Date: Thu, 13 Aug 2026 14:53:50 -0500 Subject: [PATCH 9/9] Convert produceBlockV4 to POST and round-trip Eth-Builder-Url (Gloas builder API 4/5) Fourth PR of the Gloas builder API stack (beacon-APIs #630): - convert `/eth/v4/validator/blocks/{slot}` to POST with an optional `BuilderConfig` body (min_bid, builder_boost_factor, direct builders) - add `POST /eth/v1/validator/builder_preferences` for forwarding signed builder preferences - set `Eth-Builder-Url` on produceBlockV4 responses when a direct-builder bid wins, accept it on `POST /eth/v2/beacon/blocks`, and forward the signed block to that builder The validator client still uses the legacy GET methods at this point; it migrates in the final PR of this stack. Change-Id: I0ad30b8f36ad9b588ea1a0398220f92c9597bb95 --- .../direct_verified_bid.rs | 42 ++- .../gossip_verified_bid.rs | 36 +- .../builder_client/src/builder_http_client.rs | 18 +- beacon_node/http_api/src/lib.rs | 40 ++- beacon_node/http_api/src/produce_block.rs | 49 ++- beacon_node/http_api/src/publish_blocks.rs | 70 ++++ beacon_node/http_api/src/validator/mod.rs | 235 +++++++++++- beacon_node/http_api/src/version.rs | 13 +- .../tests/broadcast_validation_tests.rs | 4 +- .../http_api/tests/gloas_reorg_tests.rs | 12 +- .../http_api/tests/interactive_tests.rs | 10 +- beacon_node/http_api/tests/tests.rs | 335 +++++++++++++++++- 12 files changed, 811 insertions(+), 53 deletions(-) diff --git a/beacon_node/beacon_chain/src/payload_bid_verification/direct_verified_bid.rs b/beacon_node/beacon_chain/src/payload_bid_verification/direct_verified_bid.rs index 9983df131d8..f57d5628695 100644 --- a/beacon_node/beacon_chain/src/payload_bid_verification/direct_verified_bid.rs +++ b/beacon_node/beacon_chain/src/payload_bid_verification/direct_verified_bid.rs @@ -1,6 +1,6 @@ use crate::payload_bid_verification::{ PayloadBidError, - gossip_verified_bid::{is_gas_limit_target_compatible, verify_bid_consistency}, + gossip_verified_bid::{is_gas_limit_target_compatible, verify_direct_bid_consistency}, }; use eth2::types::BuilderPubkeys; use state_processing::signature_sets::{ @@ -14,7 +14,8 @@ use types::{ /// Fully validate a bid fetched directly from a builder, for inclusion in a block being produced. /// /// This performs all validation a direct builder bid must pass before it can be selected: -/// - the consensus-consistency checks shared with the gossip verifier via [`verify_bid_consistency`] +/// - the consensus-consistency checks shared with the gossip verifier, bundled for this path in +/// [`verify_direct_bid_consistency`] /// (fee recipient, blob count, builder eligibility/version, and that the builder's collateral /// covers the bid value), /// - that the bid matches the block being produced — the exact `proposal_slot`, the selected @@ -81,7 +82,7 @@ pub fn verify_direct_bid( } // Consensus-consistency checks shared with the gossip verifier. - verify_bid_consistency(bid, proposal_slot, proposer_preferences, state, spec)?; + verify_direct_bid_consistency(bid, proposal_slot, proposer_preferences, state, spec)?; // If the requesting `BuilderEntry` named builder pubkeys, the bid must come from one of them: // the builder at `bid.builder_index` must have one of those pubkeys (the `builder_pubkeys` @@ -267,6 +268,38 @@ mod tests { )); } + #[test] + fn rejects_block_hash_equal_to_parent_block_hash() { + let (state, spec) = state_and_spec(); + // Passes every earlier check (slot, ancestor hash, parent root, RANDAO, gas limit), then + // claims a `block_hash` equal to its `parent_block_hash` — the consensus assert from + // `process_execution_payload_bid` that must be front-run before selection. + let executed_ancestor = ExecutionBlockHash::repeat_byte(7); + let mut bid = signed_bid( + Slot::new(1), + executed_ancestor, + Hash256::ZERO, + Hash256::ZERO, + ); + bid.message.block_hash = executed_ancestor; + bid.message.gas_limit = EXECUTED_ANCESTOR_GAS_LIMIT; + let result = verify_direct_bid( + &bid, + Slot::new(1), + executed_ancestor, + Hash256::ZERO, + EXECUTED_ANCESTOR_GAS_LIMIT, + &BuilderPubkeys::default(), + &preferences(), + &state, + &spec, + ); + assert!(matches!( + result, + Err(PayloadBidError::BlockHashEqualsParentBlockHash { .. }) + )); + } + #[test] fn rejects_gas_limit_incompatible_with_parent() { let (state, spec) = state_and_spec(); @@ -305,6 +338,9 @@ mod tests { Hash256::ZERO, ); bid.message.gas_limit = EXECUTED_ANCESTOR_GAS_LIMIT; + // A default (zero) `block_hash` would equal the zero parent hash and trip the + // block-hash-equals-parent rejection before the checks this test targets. + bid.message.block_hash = ExecutionBlockHash::repeat_byte(1); let result = verify_direct_bid( &bid, Slot::new(1), diff --git a/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs b/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs index 25d82ccc971..851bf821de7 100644 --- a/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs +++ b/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs @@ -44,14 +44,26 @@ fn verify_bid_payment_and_blobs( }); } + verify_bid_block_hash_not_parent(bid)?; + + verify_bid_blobs(bid, spec) +} + +/// Reject a bid whose `block_hash` equals its `parent_block_hash`. +/// +/// `process_execution_payload_bid` enforces this in `per_block_processing`, so every bid intake — +/// gossip *and* direct (builder-API) — must front-run it: a bid that fails only at block +/// processing has already won selection and costs the proposer the slot. +pub(crate) fn verify_bid_block_hash_not_parent( + bid: &ExecutionPayloadBid, +) -> Result<(), PayloadBidError> { if bid.block_hash == bid.parent_block_hash { return Err(PayloadBidError::BlockHashEqualsParentBlockHash { slot: bid.slot, block_hash: bid.block_hash, }); } - - verify_bid_blobs(bid, spec) + Ok(()) } fn verify_bid_blobs( @@ -71,12 +83,17 @@ fn verify_bid_blobs( Ok(()) } -/// Verify that an execution payload bid is consistent with the current chain state -/// and proposer preferences. +/// Verify that a direct (builder-API) bid is consistent with the current chain state +/// and proposer preferences: the direct path's bundle of the shared bid checks. /// -/// These checks are shared by gossip and direct bids. Source-specific checks (e.g. the gossip-only -/// requirement that `execution_payment == 0`) are applied by the caller. -pub(crate) fn verify_bid_consistency( +/// The individual checks are shared with gossip, but this bundle's only caller is +/// [`verify_direct_bid`](crate::payload_bid_verification::direct_verified_bid::verify_direct_bid): +/// the gossip verifier applies the same helpers (`verify_bid_slot`, `verify_bid_blobs`, +/// `verify_bid_block_hash_not_parent`, `verify_bid_state_conditions`) piecewise, in gossip-spec +/// order, interleaved with gossip-only work (cache checks, the preferences lookup, fork-choice +/// rules). A check that must cover both intakes belongs in one of those shared helpers — adding +/// it only here leaves gossip uncovered. +pub(crate) fn verify_direct_bid_consistency( bid: &ExecutionPayloadBid, current_slot: Slot, proposer_preferences: &SignedProposerPreferences, @@ -89,6 +106,11 @@ pub(crate) fn verify_bid_consistency( return Err(PayloadBidError::InvalidFeeRecipient); } + // Mirrors the consensus assert in `process_execution_payload_bid`. The gossip path applies + // this earlier (via `verify_bid_payment_and_blobs`); repeating it here keeps the direct path + // covered without depending on the gossip caller's composition. + verify_bid_block_hash_not_parent(bid)?; + verify_bid_blobs(bid, spec)?; verify_bid_state_conditions(bid, head_state, spec) diff --git a/beacon_node/builder_client/src/builder_http_client.rs b/beacon_node/builder_client/src/builder_http_client.rs index a857d13226c..12241036b3f 100644 --- a/beacon_node/builder_client/src/builder_http_client.rs +++ b/beacon_node/builder_client/src/builder_http_client.rs @@ -41,6 +41,11 @@ const DATE_MILLISECONDS: HeaderName = HeaderName::from_static("date-milliseconds #[derive(Clone)] pub struct BuilderHttpClient { client: reqwest::Client, + /// Client for `submitSignedBeaconBlock` only. The target URL arrives over the wire (the + /// `Eth-Builder-Url` request header echoed by the VC) and is an SSRF risk, so beacon-APIs + /// `publishBlock` requires that the forwarding request "MUST NOT follow redirects" — reqwest's + /// redirect policy is client-wide, hence a dedicated client with redirects disabled. + no_redirect_client: reqwest::Client, user_agent: String, /// Only use json for all request/response types. disable_ssz: bool, @@ -50,8 +55,13 @@ impl BuilderHttpClient { pub fn new(user_agent: Option, disable_ssz: bool) -> Result { let user_agent = user_agent.unwrap_or_else(|| DEFAULT_USER_AGENT.to_string()); let client = reqwest::Client::builder().user_agent(&user_agent).build()?; + let no_redirect_client = reqwest::Client::builder() + .user_agent(&user_agent) + .redirect(reqwest::redirect::Policy::none()) + .build()?; Ok(Self { client, + no_redirect_client, user_agent, disable_ssz, }) @@ -234,6 +244,10 @@ impl BuilderHttpClient { /// /// `ssz_request` selects the request-body encoding: SSZ when `true` and the client has SSZ /// enabled, otherwise JSON. + /// + /// Sent via [`Self::no_redirect_client`]: `builder_url` is wire input (`Eth-Builder-Url`), and + /// the spec forbids following redirects on this request. A redirect response surfaces as + /// [`Error::StatusCode`] like any other non-202. pub async fn submit_signed_beacon_block( &self, builder_url: &SensitiveUrl, @@ -263,7 +277,7 @@ impl BuilderHttpClient { HeaderValue::from_str(SSZ_CONTENT_TYPE_HEADER) .map_err(|e| Error::InvalidHeaders(format!("{}", e)))?, ); - self.client + self.no_redirect_client .post(path) .timeout(timeout) .headers(headers) @@ -274,7 +288,7 @@ impl BuilderHttpClient { HeaderValue::from_str(JSON_CONTENT_TYPE_HEADER) .map_err(|e| Error::InvalidHeaders(format!("{}", e)))?, ); - self.client + self.no_redirect_client .post(path) .timeout(timeout) .headers(headers) diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index 4f41c2a1a1c..e73cf06c00a 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -68,7 +68,9 @@ use eth2::types::{ self as api_types, BroadcastValidation, EndpointVersion, ForkChoice, ForkChoiceExtraData, ForkChoiceNode, LightClientUpdatesQuery, PublishBlockRequest, ValidatorId, }; -use eth2::{CONSENSUS_VERSION_HEADER, CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER}; +use eth2::{ + BUILDER_URL_HEADER, CONSENSUS_VERSION_HEADER, CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER, +}; use health_metrics::observe::Observe; use lighthouse_network::Enr; use lighthouse_network::NetworkGlobals; @@ -106,7 +108,7 @@ use types::{ }; use validator::execution_payload_envelopes::get_validator_execution_payload_envelopes; use version::{ - ResponseIncludesVersion, V1, V2, add_consensus_version_header, add_ssz_content_type_header, + ResponseIncludesVersion, V1, V2, V4, add_consensus_version_header, add_ssz_content_type_header, execution_optimistic_finalized_beacon_response, inconsistent_fork_rejection, unsupported_version_rejection, }; @@ -384,6 +386,7 @@ pub async fn serve( let eth_v1 = single_version(any_version.clone(), V1); let eth_v2 = single_version(any_version.clone(), V2); + let eth_v4 = single_version(any_version.clone(), V4); // Create a `warp` filter that provides access to the network globals. let inner_network_globals = ctx.network_globals.clone(); @@ -819,6 +822,9 @@ pub async fn serve( */ let consensus_version_header_filter = warp::header::header::(CONSENSUS_VERSION_HEADER).boxed(); + // The winning builder's URL echoed by the VC on a Gloas block publish (beacon-APIs #630), so the + // node forwards the block to that builder. Optional: absent for self-build / p2p-won blocks. + let builder_url_header_filter = warp::header::optional::(BUILDER_URL_HEADER).boxed(); let optional_consensus_version_header_filter = warp::header::optional::(CONSENSUS_VERSION_HEADER).boxed(); @@ -855,6 +861,8 @@ pub async fn serve( &network_tx, BroadcastValidation::default(), duplicate_block_status_code, + // Legacy v1 publish: no builder-URL provenance (VC uses v2 for Gloas). + None, ) .await }) @@ -892,6 +900,8 @@ pub async fn serve( &network_tx, BroadcastValidation::default(), duplicate_block_status_code, + // Legacy v1 publish: no builder-URL provenance (VC uses v2 for Gloas). + None, ) .await }) @@ -909,13 +919,15 @@ pub async fn serve( .and(task_spawner_filter.clone()) .and(chain_filter.clone()) .and(network_tx_filter.clone()) + .and(builder_url_header_filter.clone()) .then( move |validation_level: api_types::BroadcastValidationQuery, value: serde_json::Value, consensus_version: ForkName, task_spawner: TaskSpawner, chain: Arc>, - network_tx: UnboundedSender>| { + network_tx: UnboundedSender>, + builder_url: Option| { task_spawner.spawn_async_with_rejection(Priority::P0, async move { let request = PublishBlockRequest::::context_deserialize( &value, @@ -932,6 +944,7 @@ pub async fn serve( &network_tx, validation_level.broadcast_validation, duplicate_block_status_code, + builder_url, ) .await }) @@ -949,13 +962,15 @@ pub async fn serve( .and(task_spawner_filter.clone()) .and(chain_filter.clone()) .and(network_tx_filter.clone()) + .and(builder_url_header_filter.clone()) .then( move |validation_level: api_types::BroadcastValidationQuery, block_bytes: Bytes, consensus_version: ForkName, task_spawner: TaskSpawner, chain: Arc>, - network_tx: UnboundedSender>| { + network_tx: UnboundedSender>, + builder_url: Option| { task_spawner.spawn_async_with_rejection(Priority::P0, async move { let block_contents = PublishBlockRequest::::from_ssz_bytes( &block_bytes, @@ -971,6 +986,7 @@ pub async fn serve( &network_tx, validation_level.broadcast_validation, duplicate_block_status_code, + builder_url, ) .await }) @@ -2570,6 +2586,14 @@ pub async fn serve( task_spawner_filter.clone(), ); + // POST v4/validator/blocks/{slot} + let post_validator_blocks_v4 = post_validator_blocks_v4( + eth_v4.clone(), + chain_filter.clone(), + not_while_syncing_filter.clone(), + task_spawner_filter.clone(), + ); + // GET validator/blinded_blocks/{slot} let get_validator_blinded_blocks = get_validator_blinded_blocks( eth_v1.clone(), @@ -2683,6 +2707,12 @@ pub async fn serve( chain_filter.clone(), task_spawner_filter.clone(), ); + // POST validator/builder_preferences + let post_validator_builder_preferences = post_validator_builder_preferences( + eth_v1.clone(), + chain_filter.clone(), + task_spawner_filter.clone(), + ); // POST validator/sync_committee_subscriptions let post_validator_sync_committee_subscriptions = post_validator_sync_committee_subscriptions( eth_v1.clone(), @@ -3496,6 +3526,8 @@ pub async fn serve( .uor(post_validator_sync_committee_subscriptions) .uor(post_validator_prepare_beacon_proposer) .uor(post_validator_register_validator) + .uor(post_validator_builder_preferences) + .uor(post_validator_blocks_v4) .uor(post_validator_liveness_epoch) .uor(post_lighthouse_liveness) .uor(post_lighthouse_database_reconstruct) diff --git a/beacon_node/http_api/src/produce_block.rs b/beacon_node/http_api/src/produce_block.rs index 63420fbe2d0..49315790da0 100644 --- a/beacon_node/http_api/src/produce_block.rs +++ b/beacon_node/http_api/src/produce_block.rs @@ -1,10 +1,10 @@ use crate::{ build_block_contents, version::{ - ResponseIncludesVersion, add_consensus_block_value_header, add_consensus_version_header, - add_execution_payload_blinded_header, add_execution_payload_included_header, - add_execution_payload_value_header, add_ssz_content_type_header, beacon_response, - inconsistent_fork_rejection, + ResponseIncludesVersion, add_builder_url_header, add_consensus_block_value_header, + add_consensus_version_header, add_execution_payload_blinded_header, + add_execution_payload_included_header, add_execution_payload_value_header, + add_ssz_content_type_header, beacon_response, inconsistent_fork_rejection, }, }; use beacon_chain::graffiti_calculator::GraffitiSettings; @@ -17,9 +17,10 @@ use eth2::{ beacon_response::ForkVersionedResponse, types::{BlockAndEnvelope, ProduceBlockV4Metadata}, }; +use sensitive_url::SensitiveUrl; use ssz::Encode; use std::sync::Arc; -use tracing::instrument; +use tracing::{debug, instrument}; use types::{execution::BlockProductionVersion, *}; use warp::{ http::response::Builder, @@ -58,13 +59,30 @@ pub async fn produce_block_v4( chain: Arc>, slot: Slot, query: api_types::ValidatorBlocksQuery, + builder_config: api_types::BuilderConfig, ) -> Result { + // `produceBlockV4` is the Gloas block-production endpoint. + let fork_name = chain.spec.fork_name_at_slot::(slot); + if !fork_name.gloas_enabled() { + return Err(warp_utils::reject::custom_bad_request( + "produceBlockV4 is only valid for Gloas and later".to_string(), + )); + } + let include_payload = query.include_payload.ok_or_else(|| { warp_utils::reject::custom_bad_request( "include_payload query parameter is required".to_string(), ) })?; + // The resolved builder config is threaded into block production, where it drives direct-builder + // bid requests and the gossip/direct bid policy (see `produce_block_on_state_gloas`). + debug!( + %slot, + builders = builder_config.builders.len(), + "Received produceBlockV4 request" + ); + let randao_reveal = query.randao_reveal.decompress().map_err(|e| { warp_utils::reject::custom_bad_request(format!( "randao reveal is not a valid BLS signature: {:?}", @@ -73,14 +91,9 @@ pub async fn produce_block_v4( })?; let randao_verification = get_randao_verification(&query, randao_reveal.is_infinity())?; - // The GET route carries only a boost factor; direct builders arrive with the `BuilderConfig` - // body once this route is converted to POST (later in this PR stack). Until then the winning - // bid's builder URL is unused (`Eth-Builder-Url` also lands with the POST conversion). - let builder_config = api_types::BuilderConfig { - builder_boost_factor: query.builder_boost_factor.unwrap_or(DEFAULT_BOOST_FACTOR), - ..api_types::BuilderConfig::empty() - }; + // Gloas takes its bid boost policy from `builder_config` (global for gossip, per-builder for + // direct), so the V3-style `builder_boost_factor` query param is not used on this path. let graffiti_settings = GraffitiSettings::new(query.graffiti, query.graffiti_policy); let ( @@ -89,7 +102,7 @@ pub async fn produce_block_v4( consensus_block_value, execution_payload_value, payload_contents, - _builder_url, + builder_url, ) = chain .produce_block_with_verification_gloas( randao_reveal, @@ -110,6 +123,7 @@ pub async fn produce_block_v4( consensus_block_value, execution_payload_value, payload_contents, + builder_url, accept_header, &chain.spec, ) @@ -164,9 +178,13 @@ pub fn build_response_v4( consensus_block_value: u64, execution_payload_value: Uint256, payload_contents: Option>, + builder_url: Option, accept_header: Option, spec: &ChainSpec, ) -> Result { + // Stringify the winning builder's URL only here, at the `Eth-Builder-Url` header boundary; it is + // kept as a redacted `SensitiveUrl` everywhere upstream. + let builder_url = builder_url.map(|url| url.expose_full().to_string()); let fork_name = block .to_ref() .fork_name(spec) @@ -180,14 +198,15 @@ pub fn build_response_v4( consensus_block_value: consensus_block_value_wei, execution_payload_value, execution_payload_included, - builder_url: None, + builder_url: builder_url.clone(), }; let add_v4_headers = |res: Response| { let res = add_consensus_version_header(res, fork_name); let res = add_consensus_block_value_header(res, consensus_block_value_wei); let res = add_execution_payload_value_header(res, execution_payload_value); - add_execution_payload_included_header(res, execution_payload_included) + let res = add_execution_payload_included_header(res, execution_payload_included); + add_builder_url_header(res, builder_url.as_deref()) }; // When the payload is included, bundle the block with the execution payload envelope, blobs and diff --git a/beacon_node/http_api/src/publish_blocks.rs b/beacon_node/http_api/src/publish_blocks.rs index a7336f2f6eb..5279a25b3be 100644 --- a/beacon_node/http_api/src/publish_blocks.rs +++ b/beacon_node/http_api/src/publish_blocks.rs @@ -19,6 +19,7 @@ use logging::crit; use network::NetworkMessage; use rand::prelude::SliceRandom; use reqwest::StatusCode; +use sensitive_url::SensitiveUrl; use slot_clock::SlotClock; use std::marker::PhantomData; use std::sync::Arc; @@ -73,6 +74,62 @@ impl ProvenancedBlock> } } +/// If a direct builder won this block's payload bid, forward the signed block to that builder via +/// `submitSignedBeaconBlock` so it reveals the execution payload envelope. +/// +/// The builder's URL is the `Eth-Builder-Url` request header the VC echoed on publish (beacon-APIs +/// #630), so this works even on a beacon node that did not produce the block. `None` (self-built or +/// p2p-won), no configured builders, or a malformed URL are all no-ops. +/// +/// Fire-and-forget: the submission runs in a detached task; a failure is logged at high severity +/// (the validator has already signed the commitment) but never blocks the publish response. Runs +/// only once per block since it hangs off the single p2p-publish point. +fn forward_signed_block_to_winning_builder( + chain: &Arc>, + block: Arc>, + builder_url: Option<&str>, +) { + // The VC echoes the winning builder's URL in the `Eth-Builder-Url` request header (beacon-APIs + // #630); absent for a self-built block or a p2p-won bid, in which case there's nothing to forward. + let Some(builder_url) = builder_url else { + return; + }; + let Some(builders) = chain.builders.as_ref() else { + return; + }; + let url = match SensitiveUrl::parse(builder_url) { + Ok(url) => url, + Err(e) => { + warn!(error = ?e, "Ignoring malformed Eth-Builder-Url header"); + return; + } + }; + + let builders = builders.clone(); + let slot = block.slot(); + let block_root = block.canonical_root(); + + chain.task_executor.spawn( + async move { + match builders.forward_signed_block(&url, &block).await { + Ok(()) => info!( + %slot, + %block_root, + "Forwarded signed block to winning builder" + ), + Err(e) => error!( + %slot, + %block_root, + builder_url = ?url, + error = ?e, + "Failed to forward signed block to winning builder" + ), + } + }, + "forward_signed_block_to_builder", + ); +} + /// Handles a request from the HTTP API for full blocks. #[allow(clippy::too_many_arguments)] #[instrument( @@ -88,6 +145,9 @@ pub async fn publish_block>( network_tx: &UnboundedSender>, validation_level: BroadcastValidation, duplicate_status_code: StatusCode, + // The `Eth-Builder-Url` request header (beacon-APIs #630): when a direct builder won the block's + // payload bid, its URL, so the block is forwarded there for envelope reveal. + builder_url: Option, ) -> Result { let seen_timestamp = chain.slot_clock.now_duration().unwrap_or_default(); let block_publishing_delay_for_testing = chain.config.block_publishing_delay; @@ -141,6 +201,14 @@ pub async fn publish_block>( BlockError::BeaconChainError(Box::new(BeaconChainError::UnableToPublish)) })?; + // If a direct builder won this block's payload bid, forward the signed block to it so it + // reveals the execution payload envelope. + forward_signed_block_to_winning_builder( + &publish_chain, + block.clone(), + builder_url.as_deref(), + ); + Ok(()) }; @@ -570,6 +638,8 @@ pub async fn publish_blinded_block( network_tx, validation_level, duplicate_status_code, + // Blinded (mev-boost) publish predates the Gloas builder-URL round-trip. + None, ) .await } else { diff --git a/beacon_node/http_api/src/validator/mod.rs b/beacon_node/http_api/src/validator/mod.rs index 7b904260b8e..ecb362985e4 100644 --- a/beacon_node/http_api/src/validator/mod.rs +++ b/beacon_node/http_api/src/validator/mod.rs @@ -6,7 +6,7 @@ use crate::utils::{ AnyVersionFilter, ChainFilter, EthV1Filter, NetworkTxFilter, NotWhileSyncingFilter, ResponseFilter, TaskSpawnerFilter, ValidatorSubscriptionTxFilter, publish_network_message, }; -use crate::version::{V1, V2, V3, V4, add_ssz_content_type_header, unsupported_version_rejection}; +use crate::version::{V1, V2, V3, add_ssz_content_type_header, unsupported_version_rejection}; use crate::{StateId, attester_duties, proposer_duties, ptc_duties, sync_committees}; use beacon_chain::attestation_verification::VerifiedAttestation; use beacon_chain::proposer_preferences_verification::ProposerPreferencesError; @@ -14,12 +14,13 @@ use beacon_chain::{AttestationError, BeaconChain, BeaconChainError, BeaconChainT use bls::PublicKeyBytes; use bytes::Bytes; use context_deserialize::ContextDeserialize; -use eth2::CONSENSUS_VERSION_HEADER; use eth2::types::{ - Accept, BeaconCommitteeSubscription, EndpointVersion, Failure, GenericResponse, - StandardLivenessResponseData, StateId as CoreStateId, ValidatorAggregateAttestationQuery, - ValidatorAttestationDataQuery, ValidatorBlocksQuery, ValidatorIndexData, ValidatorStatus, + Accept, BeaconCommitteeSubscription, BuilderConfig, BuilderPreferenceEntry, EndpointVersion, + Failure, GenericResponse, MAX_SUBMITTED_BUILDER_PREFERENCES, StandardLivenessResponseData, + StateId as CoreStateId, ValidatorAggregateAttestationQuery, ValidatorAttestationDataQuery, + ValidatorBlocksQuery, ValidatorIndexData, ValidatorStatus, }; +use eth2::{CONSENSUS_VERSION_HEADER, CONTENT_TYPE_HEADER, SSZ_CONTENT_TYPE_HEADER}; use lighthouse_network::PubsubMessage; use network::{NetworkMessage, ValidatorSubscriptionMessage}; use reqwest::StatusCode; @@ -483,8 +484,12 @@ pub fn get_validator_blocks( not_synced_filter?; - if endpoint_version == V4 { - produce_block_v4(accept_header, chain, slot, query).await + // Gloas block production is served via `POST v4/validator/blocks`. + let fork_name = chain.spec.fork_name_at_slot::(slot); + if fork_name.gloas_enabled() { + Err(warp_utils::reject::custom_bad_request( + "Gloas block production requires POST v4/validator/blocks".to_string(), + )) } else if endpoint_version == V3 { produce_block_v3(accept_header, chain, slot, query).await } else { @@ -496,6 +501,95 @@ pub fn get_validator_blocks( .boxed() } +/// Does the request's `Content-Type` header select SSZ? +/// +/// Tolerates media-type parameters (`application/octet-stream; ...`) and surrounding whitespace; +/// anything else (including an absent header) selects JSON. +fn is_ssz_content_type(content_type: Option<&str>) -> bool { + content_type + .and_then(|header| header.split(';').next()) + .is_some_and(|media_type| media_type.trim() == SSZ_CONTENT_TYPE_HEADER) +} + +// POST v4/validator/blocks/{slot} +// +// The Gloas block-production endpoint. Carries the validator's resolved `BuilderConfig` as the +// request body, accepted as either JSON or SSZ (selected by `Content-Type`; `application/octet-stream` +// => SSZ). The `Eth-Consensus-Version` request header is required (per beacon-APIs #630); the body +// is not fork-versioned, so like the builder-preferences endpoint the header is validated but only +// logged. +pub fn post_validator_blocks_v4( + eth_v4: EthV1Filter, + chain_filter: ChainFilter, + not_while_syncing_filter: NotWhileSyncingFilter, + task_spawner_filter: TaskSpawnerFilter, +) -> ResponseFilter { + eth_v4 + .and(warp::path("validator")) + .and(warp::path("blocks")) + .and(warp::path::param::().or_else(|_| async { + Err(warp_utils::reject::custom_bad_request( + "Invalid slot".to_string(), + )) + })) + .and(warp::path::end()) + .and(warp::header::optional::("accept")) + .and(warp::header::(CONSENSUS_VERSION_HEADER)) + .and(not_while_syncing_filter) + .and(warp::query::()) + .and( + warp::header::optional::(CONTENT_TYPE_HEADER) + .and(warp::body::bytes()) + .and_then(|content_type: Option, body: Bytes| async move { + let builder_config: BuilderConfig = + if is_ssz_content_type(content_type.as_deref()) { + BuilderConfig::from_ssz_bytes(&body).map_err(|e| { + warp_utils::reject::custom_bad_request(format!( + "invalid SSZ: {e:?}" + )) + })? + } else { + serde_json::from_slice(&body).map_err(|e| { + warp_utils::reject::custom_deserialize_error(format!("{e:?}")) + })? + }; + // A zero-length `url` or auth `data` makes the body itself invalid (beacon-APIs + // #630) — a 400, unlike per-entry bid failures, which are isolated. + for entry in builder_config.builders.iter() { + entry.validate().map_err(|e| { + warp_utils::reject::custom_bad_request(format!( + "invalid builder entry: {e}" + )) + })?; + } + Ok::<_, Rejection>(builder_config) + }), + ) + .and(task_spawner_filter) + .and(chain_filter) + .then( + |slot: Slot, + accept_header: Option, + consensus_version: ForkName, + not_synced_filter: Result<(), Rejection>, + query: ValidatorBlocksQuery, + builder_config: BuilderConfig, + task_spawner: TaskSpawner, + chain: Arc>| { + task_spawner.spawn_async_with_rejection(Priority::P0, async move { + debug!( + ?slot, + %consensus_version, + "Block production request from HTTP API (v4)" + ); + not_synced_filter?; + produce_block_v4(accept_header, chain, slot, query, builder_config).await + }) + }, + ) + .boxed() +} + // POST validator/liveness/{epoch} pub fn post_validator_liveness_epoch( eth_v1: EthV1Filter, @@ -770,6 +864,133 @@ pub fn post_validator_register_validator( .boxed() } +// POST validator/builder_preferences +// +// Accepts the `BuilderPreferenceEntry` list as either JSON or SSZ. A required +// `Eth-Consensus-Version` header carries the consensus version the preferences belong to (per +// beacon-APIs #630); it is not needed to decode the (currently single-fork) body, so it is only +// logged. +pub fn post_validator_builder_preferences( + eth_v1: EthV1Filter, + chain_filter: ChainFilter, + task_spawner_filter: TaskSpawnerFilter, +) -> ResponseFilter { + eth_v1 + .and(warp::path("validator")) + .and(warp::path("builder_preferences")) + .and(warp::path::end()) + .and(warp::header::(CONSENSUS_VERSION_HEADER)) + .and(task_spawner_filter.clone()) + .and(chain_filter.clone()) + .and( + warp::header::optional::(CONTENT_TYPE_HEADER) + .and(warp::body::bytes()) + .and_then(|content_type: Option, body: Bytes| async move { + let entries: Vec = + if is_ssz_content_type(content_type.as_deref()) { + Vec::from_ssz_bytes(&body).map_err(|e| { + warp_utils::reject::custom_bad_request(format!( + "invalid SSZ: {e:?}" + )) + })? + } else { + serde_json::from_slice(&body).map_err(|e| { + warp_utils::reject::custom_deserialize_error(format!("{e:?}")) + })? + }; + // The submission list is bounded (SSZ `List[BuilderPreferencesEntry, 4096]`, + // JSON `maxItems: 4096`, per beacon-APIs #630); a longer body is invalid. + if entries.len() > MAX_SUBMITTED_BUILDER_PREFERENCES { + return Err(warp_utils::reject::custom_bad_request(format!( + "too many builder preference entries: {} exceeds the limit of {}", + entries.len(), + MAX_SUBMITTED_BUILDER_PREFERENCES + ))); + } + // A zero-length `url` or auth `data` makes the body itself invalid (beacon-APIs + // #630) — a 400, unlike per-entry submission failures, which are isolated. + for entry in &entries { + entry.validate().map_err(|e| { + warp_utils::reject::custom_bad_request(format!( + "invalid builder preference entry: {e}" + )) + })?; + } + Ok::<_, Rejection>(entries) + }), + ) + .then( + |consensus_version: ForkName, + task_spawner: TaskSpawner, + chain: Arc>, + entries: Vec| async move { + let (tx, rx) = oneshot::channel(); + + let initial_result = task_spawner + .spawn_async_with_rejection_no_conversion(Priority::P0, async move { + // The builder service is only present when the Gloas fork is scheduled; a + // node without one can't submit preferences anywhere, which is the + // caller's misconfiguration (not a server fault), so reject with a 400. + let builders = chain + .builders + .as_ref() + .ok_or_else(|| { + warp_utils::reject::custom_bad_request( + "this beacon node has no builder service (the Gloas fork is \ + not scheduled on its network)" + .to_string(), + ) + })? + .clone(); + + debug!( + count = entries.len(), + %consensus_version, + "Received submit builder preferences request" + ); + + // Submitting to a builder can be slow (they frequently time out), so the + // fan-out runs in a detached task rather than holding a `BeaconProcessor` + // worker. The service submits each entry independently and best-effort, + // returning the failures by index (per beacon-APIs #630). + tokio::task::spawn(async move { + let response = match builders + .submit_builder_preferences(entries, consensus_version) + .await + { + Ok(()) => Ok(warp::reply::reply().into_response()), + Err(failures) => Err(warp_utils::reject::indexed_bad_request( + "error submitting builder preferences".to_string(), + failures + .into_iter() + .map(|f| Failure::new(f.index, f.error.to_string())) + .collect(), + )), + }; + let _ = tx.send(response); + }); + + Ok(warp::reply::reply().into_response()) + }) + .await; + + if initial_result.is_err() { + return convert_rejection(initial_result).await; + } + + convert_rejection(rx.await.unwrap_or_else(|_| { + Ok(warp::reply::with_status( + warp::reply::json(&"No response from channel"), + warp::http::StatusCode::INTERNAL_SERVER_ERROR, + ) + .into_response()) + })) + .await + }, + ) + .boxed() +} + // POST validator/prepare_beacon_proposer pub fn post_validator_prepare_beacon_proposer( eth_v1: EthV1Filter, diff --git a/beacon_node/http_api/src/version.rs b/beacon_node/http_api/src/version.rs index 6f441636b49..63914feb049 100644 --- a/beacon_node/http_api/src/version.rs +++ b/beacon_node/http_api/src/version.rs @@ -4,8 +4,8 @@ use eth2::beacon_response::{ ExecutionOptimisticFinalizedMetadata, ForkVersionedResponse, UnversionedResponse, }; use eth2::{ - CONSENSUS_BLOCK_VALUE_HEADER, CONSENSUS_VERSION_HEADER, CONTENT_TYPE_HEADER, - EXECUTION_PAYLOAD_BLINDED_HEADER, EXECUTION_PAYLOAD_INCLUDED_HEADER, + BUILDER_URL_HEADER, CONSENSUS_BLOCK_VALUE_HEADER, CONSENSUS_VERSION_HEADER, + CONTENT_TYPE_HEADER, EXECUTION_PAYLOAD_BLINDED_HEADER, EXECUTION_PAYLOAD_INCLUDED_HEADER, EXECUTION_PAYLOAD_VALUE_HEADER, SSZ_CONTENT_TYPE_HEADER, }; use serde::Serialize; @@ -116,6 +116,15 @@ pub fn add_execution_payload_value_header( .into_response() } +/// Add the `Eth-Builder-Url` header (the winning builder's URL) to a response, when present. +/// Absent for a self-built block or a block won by a p2p bid. +pub fn add_builder_url_header(reply: T, builder_url: Option<&str>) -> Response { + match builder_url { + Some(url) => reply::with_header(reply, BUILDER_URL_HEADER, url).into_response(), + None => reply.into_response(), + } +} + /// Add the `Eth-Consensus-Block-Value` header to a response. pub fn add_consensus_block_value_header( reply: T, diff --git a/beacon_node/http_api/tests/broadcast_validation_tests.rs b/beacon_node/http_api/tests/broadcast_validation_tests.rs index 4d2be52a0d5..5db04d7d136 100644 --- a/beacon_node/http_api/tests/broadcast_validation_tests.rs +++ b/beacon_node/http_api/tests/broadcast_validation_tests.rs @@ -433,6 +433,7 @@ pub async fn consensus_partial_pass_only_consensus() { &channel.0, validation_level, StatusCode::ACCEPTED, + None, ) .await; @@ -610,7 +611,7 @@ pub async fn equivocation_consensus_early_equivocation() { .post_beacon_blocks_v2_ssz( &PublishBlockRequest::new(block_a.clone(), blobs_a), validation_level, - None + None, ) .await .is_ok() @@ -763,6 +764,7 @@ pub async fn equivocation_consensus_late_equivocation() { &channel.0, validation_level, StatusCode::ACCEPTED, + None, ) .await; diff --git a/beacon_node/http_api/tests/gloas_reorg_tests.rs b/beacon_node/http_api/tests/gloas_reorg_tests.rs index f1a4ed02bb4..f31746ddf70 100644 --- a/beacon_node/http_api/tests/gloas_reorg_tests.rs +++ b/beacon_node/http_api/tests/gloas_reorg_tests.rs @@ -27,7 +27,7 @@ use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; use types::{ - Address, BeaconBlockRef, EthSpec, ExecutionBlockHash, Hash256, MinimalEthSpec, + Address, BeaconBlockRef, EthSpec, ExecutionBlockHash, ForkName, Hash256, MinimalEthSpec, ProposerPreparationData, Slot, }; @@ -727,7 +727,15 @@ pub async fn proposer_boost_re_org_test( let (block_c, block_c_blobs) = { let (response, _) = tester .client - .get_validator_blocks_v4::(slot_c, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot_c, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); ( diff --git a/beacon_node/http_api/tests/interactive_tests.rs b/beacon_node/http_api/tests/interactive_tests.rs index 90c7f37b02c..df4fdaf0904 100644 --- a/beacon_node/http_api/tests/interactive_tests.rs +++ b/beacon_node/http_api/tests/interactive_tests.rs @@ -817,7 +817,15 @@ pub async fn fork_choice_before_proposal() { let block_d = if harness.spec.fork_name_at_slot::(slot_d).gloas_enabled() { tester .client - .get_validator_blocks_v4::(slot_d, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot_d, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap() .0 diff --git a/beacon_node/http_api/tests/tests.rs b/beacon_node/http_api/tests/tests.rs index 8f9dcac5a04..0fc3fd17cec 100644 --- a/beacon_node/http_api/tests/tests.rs +++ b/beacon_node/http_api/tests/tests.rs @@ -4813,7 +4813,15 @@ impl ApiTester { let (response, _metadata) = self .client - .get_validator_blocks_v4::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -5005,6 +5013,248 @@ impl ApiTester { self } + pub async fn test_block_production_v4_missing_consensus_version_header_returns_400( + self, + ) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + let fork = self.chain.canonical_head.cached_head().head_fork(); + let genesis_validators_root = self.chain.genesis_validators_root; + let Some((slot, epoch, _fork_name)) = self.advance_to_gloas_slot() else { + return self; + }; + + let (_sk, randao_reveal) = self + .proposer_setup(slot, epoch, &fork, genesis_validators_root) + .await; + + let url = self + .client + .post_validator_blocks_v4_path( + slot, + &randao_reveal, + None, + SkipRandaoVerification::No, + false, + None, + ) + .await + .unwrap(); + + // A valid body, but no `Eth-Consensus-Version` header: the header is required + // (beacon-APIs #630), so the request must fail with a 400. + let response = reqwest::Client::new() + .post(url) + .json(ð2::types::BuilderConfig::empty()) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + + self.chain.slot_clock.set_slot(slot.as_u64() + 1); + + self + } + + pub async fn test_block_production_v4_zero_length_entry_fields_return_400(self) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + let fork = self.chain.canonical_head.cached_head().head_fork(); + let genesis_validators_root = self.chain.genesis_validators_root; + let Some((slot, epoch, _fork_name)) = self.advance_to_gloas_slot() else { + return self; + }; + + let (_sk, randao_reveal) = self + .proposer_setup(slot, epoch, &fork, genesis_validators_root) + .await; + + let url = self + .client + .post_validator_blocks_v4_path( + slot, + &randao_reveal, + None, + SkipRandaoVerification::No, + false, + None, + ) + .await + .unwrap(); + + let valid_auth = eth2::types::SignedRequestAuth { + message: eth2::types::RequestAuth { + data: eth2::types::RequestAuthData::new(b"http://builder.example.com".to_vec()) + .unwrap(), + slot, + }, + signature: Signature::empty(), + }; + let entry = |url: &str, auth: eth2::types::SignedRequestAuth| eth2::types::BuilderEntry { + url: url.parse().unwrap(), + auth, + builder_pubkeys: <_>::default(), + max_execution_payment: 0, + min_bid: 0, + builder_boost_factor: 100, + }; + + // A zero-length `url` and a zero-length auth `data` each make the body invalid + // (beacon-APIs #630), so the request must fail with a 400. + let empty_url_entry = entry("", valid_auth.clone()); + let mut empty_data_auth = valid_auth; + empty_data_auth.message.data = eth2::types::RequestAuthData::default(); + let empty_data_entry = entry("http://builder.example.com", empty_data_auth); + + for bad_entry in [empty_url_entry, empty_data_entry] { + let config = serde_json::json!({ + "min_bid": "0", + "builder_boost_factor": "100", + "builders": [bad_entry], + }); + let response = reqwest::Client::new() + .post(url.clone()) + .header(eth2::CONSENSUS_VERSION_HEADER, "gloas") + .json(&config) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + } + + self.chain.slot_clock.set_slot(slot.as_u64() + 1); + + self + } + + /// The `POST validator/builder_preferences` URL, for raw requests that bypass the eth2 client + /// (which always sets the required header). + fn builder_preferences_url(&self) -> reqwest::Url { + let mut url = self.client.server().expose_full().clone(); + url.path_segments_mut() + .unwrap() + .push("eth") + .push("v1") + .push("validator") + .push("builder_preferences"); + url + } + + /// A `BuilderPreferenceEntry` that passes the endpoint's body validation. + fn valid_builder_preference_entry() -> eth2::types::BuilderPreferenceEntry { + eth2::types::BuilderPreferenceEntry { + proposer_pubkey: PublicKeyBytes::empty(), + url: "http://builder.example.com".parse().unwrap(), + auth: eth2::types::SignedRequestAuth { + message: eth2::types::RequestAuth { + data: eth2::types::RequestAuthData::new(b"http://builder.example.com".to_vec()) + .unwrap(), + slot: Slot::new(0), + }, + signature: Signature::empty(), + }, + max_execution_payment: 0, + } + } + + pub async fn test_builder_preferences_missing_consensus_version_header_returns_400( + self, + ) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + // A valid body, but no `Eth-Consensus-Version` header: the header is required + // (beacon-APIs #630), so the request must fail with a 400. + let response = reqwest::Client::new() + .post(self.builder_preferences_url()) + .json(&vec![Self::valid_builder_preference_entry()]) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + + self + } + + pub async fn test_builder_preferences_zero_length_entry_fields_return_400(self) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + // A zero-length `url` and a zero-length auth `data` each make the body invalid + // (beacon-APIs #630), so the request must fail with a 400. + let mut empty_url_entry = Self::valid_builder_preference_entry(); + empty_url_entry.url = "".parse().unwrap(); + let mut empty_data_entry = Self::valid_builder_preference_entry(); + empty_data_entry.auth.message.data = eth2::types::RequestAuthData::default(); + + for bad_entry in [empty_url_entry, empty_data_entry] { + let response = reqwest::Client::new() + .post(self.builder_preferences_url()) + .header(eth2::CONSENSUS_VERSION_HEADER, "gloas") + .json(&vec![bad_entry]) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + } + + self + } + + pub async fn test_builder_preferences_oversize_list_returns_400(self) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + // The submission list is bounded at `MAX_SUBMITTED_BUILDER_PREFERENCES` entries + // (beacon-APIs #630); one more is an invalid body. + let entries = vec![ + Self::valid_builder_preference_entry(); + eth2::types::MAX_SUBMITTED_BUILDER_PREFERENCES + 1 + ]; + let response = reqwest::Client::new() + .post(self.builder_preferences_url()) + .header(eth2::CONSENSUS_VERSION_HEADER, "gloas") + .json(&entries) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + + self + } + + pub async fn test_builder_preferences_without_builder_service_returns_400(self) -> Self { + if !self.chain.spec.is_gloas_scheduled() { + return self; + } + + // The test harness never wires a builder service into the chain, so a well-formed + // submission reaches the handler and must be rejected as a client-side misconfiguration + // (400 with a self-explanatory message), not a 500. + let response = reqwest::Client::new() + .post(self.builder_preferences_url()) + .header(eth2::CONSENSUS_VERSION_HEADER, "gloas") + .json(&vec![Self::valid_builder_preference_entry()]) + .send() + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::BAD_REQUEST); + let body = response.text().await.unwrap(); + assert!( + body.contains("no builder service"), + "unexpected error body: {body}" + ); + + self + } + pub async fn test_envelope_post_when_syncing_returns_503(mut self) -> Self { if !self.chain.spec.is_gloas_scheduled() { return self; @@ -5178,7 +5428,15 @@ impl ApiTester { let (response, metadata) = self .client - .get_validator_blocks_v4::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -5253,7 +5511,15 @@ impl ApiTester { let (response, metadata) = self .client - .get_validator_blocks_v4_ssz::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4_ssz::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -5325,12 +5591,28 @@ impl ApiTester { let (response, metadata) = if ssz { self.client - .get_validator_blocks_v4_ssz::(slot, &randao_reveal, None, true, None, None) + .post_validator_blocks_v4_ssz::( + slot, + &randao_reveal, + None, + true, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap() } else { self.client - .get_validator_blocks_v4::(slot, &randao_reveal, None, true, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + true, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap() }; @@ -5871,7 +6153,15 @@ impl ApiTester { // Produce and publish a block. let (response, _metadata) = self .client - .get_validator_blocks_v4::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -5954,7 +6244,15 @@ impl ApiTester { // Produce and publish a block, but withhold its envelope. let (response, _metadata) = self .client - .get_validator_blocks_v4::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -8923,7 +9221,15 @@ impl ApiTester { let (response, _metadata) = self .client - .get_validator_blocks_v4::(slot, &randao_reveal, None, false, None, None) + .post_validator_blocks_v4::( + slot, + &randao_reveal, + None, + false, + ð2::types::BuilderConfig::empty(), + None, + ForkName::Gloas, + ) .await .unwrap(); let block = response.into_block(); @@ -9229,7 +9535,6 @@ impl ApiTester { let epoch = self.chain.epoch().unwrap(); let (_, randao_reveal) = self.get_test_randao(slot, epoch).await; let graffiti = Some(Graffiti::from([0; GRAFFITI_BYTES_LEN])); - // When GraffitiPolicy is None let no_graffiti_policy_path = self .client @@ -10101,6 +10406,18 @@ async fn envelope_api() { .await .test_block_production_v4_missing_include_payload_returns_400() .await + .test_block_production_v4_missing_consensus_version_header_returns_400() + .await + .test_block_production_v4_zero_length_entry_fields_return_400() + .await + .test_builder_preferences_missing_consensus_version_header_returns_400() + .await + .test_builder_preferences_zero_length_entry_fields_return_400() + .await + .test_builder_preferences_oversize_list_returns_400() + .await + .test_builder_preferences_without_builder_service_returns_400() + .await .test_envelope_post_consensus_invalid_returns_400_no_broadcast() .await .test_envelope_post_gossip_partial_pass_returns_202()