diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index de557e7e2c..01dcaa74a9 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -8,10 +8,7 @@ use crate::custody_context::NodeCustodyType; use crate::data_availability_checker::DataAvailabilityChecker; use crate::fork_choice_signal::ForkChoiceSignalTx; use crate::graffiti_calculator::{GraffitiCalculator, GraffitiOrigin}; -use crate::kzg_utils::{ - build_data_column_sidecars_fulu, build_data_column_sidecars_gloas, - build_data_column_sidecars_heze, -}; +use crate::kzg_utils::{build_data_column_sidecars_fulu, build_data_column_sidecars_gloas}; use crate::light_client_server_cache::LightClientServerCache; use crate::migrate::{BackgroundMigrator, MigratorConfig}; use crate::observed_data_sidecars::ObservedDataSidecars; @@ -1240,15 +1237,7 @@ fn build_data_columns_from_blobs( .cloned() .map_err(|e| format!("Unexpected pre Deneb block: {e:?}"))?; - if block.fork_name_unchecked().heze_enabled() { - build_data_column_sidecars_heze( - block.message().tree_hash_root(), - block.slot(), - blob_cells_and_proofs_vec, - spec, - ) - .map_err(|e| format!("Failed to compute weak subjectivity data_columns: {e:?}"))? - } else if block.fork_name_unchecked().gloas_enabled() { + if block.fork_name_unchecked().gloas_enabled() { build_data_column_sidecars_gloas( block.message().tree_hash_root(), block.slot(), diff --git a/beacon_node/beacon_chain/src/data_column_verification.rs b/beacon_node/beacon_chain/src/data_column_verification.rs index 967025d336..02dd887c83 100644 --- a/beacon_node/beacon_chain/src/data_column_verification.rs +++ b/beacon_node/beacon_chain/src/data_column_verification.rs @@ -320,9 +320,7 @@ impl GossipVerifiedDataColumn }) } // TODO(gloas) support gloas data column variant - DataColumnSidecar::Gloas(_) | DataColumnSidecar::Heze(_) => { - Err(GossipDataColumnError::InvalidVariant) - } + DataColumnSidecar::Gloas(_) => Err(GossipDataColumnError::InvalidVariant), } } @@ -1131,9 +1129,7 @@ fn verify_data_column_sidecar( // TODO(gloas): implement Gloas verification that takes kzg_commitments from block as parameter let commitments_len = match data_column { DataColumnSidecar::Fulu(dc) => dc.kzg_commitments.len(), - DataColumnSidecar::Gloas(_) | DataColumnSidecar::Heze(_) => { - return Err(GossipDataColumnError::InvalidVariant); - } + DataColumnSidecar::Gloas(_) => return Err(GossipDataColumnError::InvalidVariant), }; if commitments_len == 0 { diff --git a/beacon_node/beacon_chain/src/kzg_utils.rs b/beacon_node/beacon_chain/src/kzg_utils.rs index 9a8fe0feae..b05a896777 100644 --- a/beacon_node/beacon_chain/src/kzg_utils.rs +++ b/beacon_node/beacon_chain/src/kzg_utils.rs @@ -13,9 +13,8 @@ use types::data::{ use types::kzg_ext::KzgCommitments; use types::{ Blob, BlobSidecar, BlobSidecarList, ChainSpec, DataColumnSidecar, DataColumnSidecarFulu, - DataColumnSidecarGloas, DataColumnSidecarHeze, DataColumnSidecarList, EthSpec, Hash256, - KzgCommitment, KzgProof, SignedBeaconBlock, SignedBeaconBlockHeader, SignedBlindedBeaconBlock, - Slot, + DataColumnSidecarGloas, DataColumnSidecarList, EthSpec, Hash256, KzgCommitment, KzgProof, + SignedBeaconBlock, SignedBeaconBlockHeader, SignedBlindedBeaconBlock, Slot, }; /// Converts a blob ssz FixedVector to a reference to a fixed-size array @@ -81,11 +80,11 @@ pub fn validate_full_data_columns<'a, E: EthSpec>( // This function requires Fulu sidecars with embedded commitments. let kzg_commitments = match data_column.as_ref() { DataColumnSidecar::Fulu(dc) => &dc.kzg_commitments, - DataColumnSidecar::Gloas(_) | DataColumnSidecar::Heze(_) => { + DataColumnSidecar::Gloas(_) => { return Err(( Some(col_index), KzgError::InconsistentArrayLength( - "Gloas/Heze data columns require commitments from block".to_string(), + "Gloas data columns require commitments from block".to_string(), ), )); } @@ -275,15 +274,7 @@ pub fn blobs_to_data_column_sidecars( }) .collect::, KzgError>>()?; - if block.fork_name_unchecked().heze_enabled() { - build_data_column_sidecars_heze( - signed_block_header.message.tree_hash_root(), - block.slot(), - blob_cells_and_proofs_vec, - spec, - ) - .map_err(DataColumnSidecarError::BuildSidecarFailed) - } else if block.fork_name_unchecked().gloas_enabled() { + if block.fork_name_unchecked().gloas_enabled() { build_data_column_sidecars_gloas( signed_block_header.message.tree_hash_root(), block.slot(), @@ -403,7 +394,7 @@ pub(crate) fn build_data_column_sidecars_fulu( .fork_name_at_slot::(signed_block_header.message.slot) .gloas_enabled() { - return Err("Attempting to construct Fulu data columns post-Gloas/Heze".to_owned()); + return Err("Attempting to construct Fulu data columns post-Gloas".to_owned()); } let number_of_columns = E::number_of_columns(); @@ -528,68 +519,6 @@ pub(crate) fn build_data_column_sidecars_gloas( sidecars } -pub(crate) fn build_data_column_sidecars_heze( - beacon_block_root: Hash256, - slot: Slot, - blob_cells_and_proofs_vec: Vec, - spec: &ChainSpec, -) -> Result, String> { - if !spec.fork_name_at_slot::(slot).heze_enabled() { - return Err("Attempting to construct Heze data columns pre-Heze".to_owned()); - } - - let number_of_columns = E::number_of_columns(); - let max_blobs_per_block = spec.max_blobs_per_block(slot.epoch(E::slots_per_epoch())) as usize; - let mut columns = vec![Vec::with_capacity(max_blobs_per_block); number_of_columns]; - let mut column_kzg_proofs = vec![Vec::with_capacity(max_blobs_per_block); number_of_columns]; - - for (blob_cells, blob_cell_proofs) in blob_cells_and_proofs_vec { - for col in 0..number_of_columns { - let cell = blob_cells - .get(col) - .ok_or(format!("Missing blob cell at index {col}"))?; - let cell: Vec = cell.to_vec(); - let cell = - Cell::::try_from(cell).map_err(|e| format!("BytesPerCell exceeded: {e:?}"))?; - - let proof = blob_cell_proofs - .get(col) - .ok_or(format!("Missing blob cell KZG proof at index {col}"))?; - - let column = columns - .get_mut(col) - .ok_or(format!("Missing data column at index {col}"))?; - let column_proofs = column_kzg_proofs - .get_mut(col) - .ok_or(format!("Missing data column proofs at index {col}"))?; - - column.push(cell); - column_proofs.push(*proof); - } - } - - let sidecars: Result>>, String> = columns - .into_iter() - .zip(column_kzg_proofs) - .enumerate() - .map( - |(index, (col, proofs))| -> Result>, String> { - Ok(Arc::new(DataColumnSidecar::Heze(DataColumnSidecarHeze { - index: index as u64, - column: DataColumn::::try_from(col) - .map_err(|e| format!("MaxBlobCommitmentsPerBlock exceeded: {e:?}"))?, - kzg_proofs: VariableList::try_from(proofs) - .map_err(|e| format!("MaxBlobCommitmentsPerBlock exceeded: {e:?}"))?, - beacon_block_root, - slot, - }))) - }, - ) - .collect(); - - sidecars -} - pub(crate) fn build_partial_data_columns( header: &PartialDataColumnHeader, blob_cells_and_proofs_vec: Vec>, @@ -700,7 +629,7 @@ pub fn reconstruct_blobs( // https://github.com/sigp/lighthouse/issues/7413 let num_of_blobs = first_data_column .kzg_commitments() - .map_err(|_| "Gloas/Heze blob reconstruction not yet supported".to_string())? + .map_err(|_| "Gloas blob reconstruction not yet supported".to_string())? .len(); (0..num_of_blobs).collect() } @@ -780,7 +709,7 @@ pub fn reconstruct_data_columns( .kzg_commitments() .map_err(|_| { KzgError::InconsistentArrayLength( - "Gloas/Heze data column reconstruction not yet supported".to_string(), + "Gloas data column reconstruction not yet supported".to_string(), ) })? .len(); @@ -822,13 +751,6 @@ pub fn reconstruct_data_columns( spec, ) .map_err(KzgError::ReconstructFailed), - DataColumnSidecar::Heze(first_column) => build_data_column_sidecars_heze( - first_column.beacon_block_root, - first_column.slot, - blob_cells_and_proofs_vec, - spec, - ) - .map_err(KzgError::ReconstructFailed), } } diff --git a/beacon_node/beacon_chain/src/observed_data_sidecars.rs b/beacon_node/beacon_chain/src/observed_data_sidecars.rs index 05cab4bbfb..2461c8115d 100644 --- a/beacon_node/beacon_chain/src/observed_data_sidecars.rs +++ b/beacon_node/beacon_chain/src/observed_data_sidecars.rs @@ -265,8 +265,8 @@ mod tests { use bls::{FixedBytesExtended, Signature}; use std::sync::Arc; use types::{ - BeaconBlockHeader, DataColumnSidecarFulu, DataColumnSidecarGloas, DataColumnSidecarHeze, - ForkName, MainnetEthSpec, SignedBeaconBlockHeader, + BeaconBlockHeader, DataColumnSidecarFulu, DataColumnSidecarGloas, ForkName, MainnetEthSpec, + SignedBeaconBlockHeader, }; type E = MainnetEthSpec; @@ -320,31 +320,13 @@ mod tests { })) } - /// Creates a Heze DataColumnSidecar for testing. - /// Keyed by (beacon_block_root, slot) in the observation cache. - fn get_data_column_sidecar_heze( - slot: u64, - beacon_block_root: Hash256, - index: u64, - ) -> Arc> { - Arc::new(DataColumnSidecar::Heze(DataColumnSidecarHeze { - index, - column: vec![].try_into().unwrap(), - kzg_proofs: vec![].try_into().unwrap(), - slot: slot.into(), - beacon_block_root, - })) - } - fn get_sidecar( slot: u64, key: u64, index: u64, fork_name: ForkName, ) -> Arc> { - if fork_name.heze_enabled() { - get_data_column_sidecar_heze(slot, Hash256::from_low_u64_be(key), index) - } else if fork_name.gloas_enabled() { + if fork_name.gloas_enabled() { get_data_column_sidecar_gloas(slot, Hash256::from_low_u64_be(key), index) } else { get_data_column_sidecar_fulu(slot, key, index) diff --git a/beacon_node/beacon_chain/src/test_utils.rs b/beacon_node/beacon_chain/src/test_utils.rs index 19a9496bd5..f3139db5be 100644 --- a/beacon_node/beacon_chain/src/test_utils.rs +++ b/beacon_node/beacon_chain/src/test_utils.rs @@ -3,10 +3,7 @@ use crate::block_verification_types::{AsBlock, AvailableBlockData, LookupBlock, use crate::custody_context::NodeCustodyType; use crate::data_availability_checker::DataAvailabilityChecker; use crate::graffiti_calculator::GraffitiSettings; -use crate::kzg_utils::{ - build_data_column_sidecars_fulu, build_data_column_sidecars_gloas, - build_data_column_sidecars_heze, -}; +use crate::kzg_utils::{build_data_column_sidecars_fulu, build_data_column_sidecars_gloas}; use crate::observed_operations::ObservationOutcome; pub use crate::persisted_beacon_chain::PersistedBeaconChain; use crate::{BeaconBlockResponseWrapper, CustodyContext, get_block_root}; @@ -3894,8 +3891,8 @@ pub fn generate_data_column_sidecars_from_block( let num_blobs = kzg_commitments.len(); let signed_block_header = block.signed_block_header(); let template_data_columns = - RuntimeVariableList::>::from_ssz_bytes( - TEST_DATA_COLUMN_SIDECARS_SSZ, + RuntimeVariableList::>::from_ssz_bytes( + TEST_DATA_COLUMN_SIDECARS_GLOAS_SSZ, E::number_of_columns(), ) .unwrap(); @@ -3903,7 +3900,7 @@ pub fn generate_data_column_sidecars_from_block( let (cells, proofs) = template_data_columns .into_iter() .map(|sidecar| { - let DataColumnSidecarHeze { + let DataColumnSidecarGloas { column, kzg_proofs, .. } = sidecar; // There's only one cell per column for a single blob @@ -3917,7 +3914,7 @@ pub fn generate_data_column_sidecars_from_block( let blob_cells_and_proofs_vec = vec![(cells.try_into().unwrap(), proofs.try_into().unwrap()); num_blobs]; - build_data_column_sidecars_heze( + build_data_column_sidecars_gloas( signed_block_header.message.tree_hash_root(), signed_block_header.message.slot, blob_cells_and_proofs_vec, diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 5930fd1c07..734295ac1d 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -906,8 +906,8 @@ impl SyncManager { ); } // TODO(gloas) support gloas data column variant - DataColumnSidecar::Gloas(_) | DataColumnSidecar::Heze(_) => { - error!("Gloas/Heze variant not yet supported") + DataColumnSidecar::Gloas(_) => { + error!("Gloas variant not yet supported") } } } diff --git a/common/eth2/src/types.rs b/common/eth2/src/types.rs index f8ad5eed19..42bb70676a 100644 --- a/common/eth2/src/types.rs +++ b/common/eth2/src/types.rs @@ -1044,7 +1044,6 @@ impl SseDataColumnSidecar { let kzg_commitments: Vec = match data_column_sidecar { DataColumnSidecar::Fulu(dc) => dc.kzg_commitments.to_vec(), DataColumnSidecar::Gloas(_) => vec![], - DataColumnSidecar::Heze(_) => vec![], }; let versioned_hashes = kzg_commitments .iter() diff --git a/consensus/state_processing/src/genesis.rs b/consensus/state_processing/src/genesis.rs index 1cce5bd6a6..09617deb1f 100644 --- a/consensus/state_processing/src/genesis.rs +++ b/consensus/state_processing/src/genesis.rs @@ -204,9 +204,10 @@ pub fn initialize_beacon_state_from_eth1( /// Create an unsigned genesis `BeaconBlock`. /// -/// For Gloas and later, the block's `signed_execution_payload_bid` is populated from the state's -/// `latest_execution_payload_bid` so that the body root is consistent with -/// `state.latest_block_header.body_root`. +/// Per spec, the genesis block body is empty (all default fields) except for Gloas and later, +/// where `body.signed_execution_payload_bid.message` is initialised from +/// `state.latest_execution_payload_bid` so that the first post-genesis proposer can +/// build on the correct execution layer head. /// /// `state.latest_block_header.body_root` is set from this same block's body, so the /// two must stay in sync. diff --git a/consensus/types/src/data/data_column_sidecar.rs b/consensus/types/src/data/data_column_sidecar.rs index 5c2404b1ca..d734280183 100644 --- a/consensus/types/src/data/data_column_sidecar.rs +++ b/consensus/types/src/data/data_column_sidecar.rs @@ -44,7 +44,7 @@ pub struct DataColumnsByRootIdentifier { pub type DataColumnSidecarList = Vec>>; #[superstruct( - variants(Fulu, Gloas, Heze), + variants(Fulu, Gloas), variant_attributes( derive( Debug, @@ -95,9 +95,9 @@ pub struct DataColumnSidecar { /// An inclusion proof, proving the inclusion of `blob_kzg_commitments` in `BeaconBlockBody`. #[superstruct(only(Fulu))] pub kzg_commitments_inclusion_proof: FixedVector, - #[superstruct(only(Gloas, Heze), partial_getter(rename = "slot_gloas"))] + #[superstruct(only(Gloas), partial_getter(rename = "slot_gloas"))] pub slot: Slot, - #[superstruct(only(Gloas, Heze))] + #[superstruct(only(Gloas))] pub beacon_block_root: Hash256, } @@ -106,7 +106,6 @@ impl DataColumnSidecar { match self { DataColumnSidecar::Fulu(column) => column.slot(), DataColumnSidecar::Gloas(column) => column.slot, - DataColumnSidecar::Heze(column) => column.slot, } } @@ -118,7 +117,6 @@ impl DataColumnSidecar { match self { DataColumnSidecar::Fulu(column) => column.block_root(), DataColumnSidecar::Gloas(column) => column.beacon_block_root, - DataColumnSidecar::Heze(column) => column.beacon_block_root, } } @@ -137,12 +135,9 @@ impl DataColumnSidecar { ForkName::Fulu => Ok(DataColumnSidecar::Fulu( DataColumnSidecarFulu::from_ssz_bytes(bytes)?, )), - ForkName::Gloas => Ok(DataColumnSidecar::Gloas( + ForkName::Gloas | ForkName::Heze => Ok(DataColumnSidecar::Gloas( DataColumnSidecarGloas::from_ssz_bytes(bytes)?, )), - ForkName::Heze => Ok(DataColumnSidecar::Heze( - DataColumnSidecarHeze::from_ssz_bytes(bytes)?, - )), } } @@ -315,33 +310,6 @@ impl DataColumnSidecarGloas { } } -impl DataColumnSidecarHeze { - pub fn min_size() -> usize { - // min size is one cell - Self { - index: 0, - column: VariableList::new(vec![Cell::::default()]).unwrap(), - kzg_proofs: VariableList::new(vec![KzgProof::empty()]).unwrap(), - slot: Slot::new(0), - beacon_block_root: Hash256::ZERO, - } - .as_ssz_bytes() - .len() - } - - pub fn max_size(max_blobs_per_block: usize) -> usize { - Self { - index: 0, - column: VariableList::new(vec![Cell::::default(); max_blobs_per_block]).unwrap(), - kzg_proofs: VariableList::new(vec![KzgProof::empty(); max_blobs_per_block]).unwrap(), - slot: Slot::new(0), - beacon_block_root: Hash256::ZERO, - } - .as_ssz_bytes() - .len() - } -} - #[derive(Debug)] pub enum DataColumnSidecarError { ArithError(ArithError), diff --git a/consensus/types/src/data/mod.rs b/consensus/types/src/data/mod.rs index 9c9d65295a..9c7eb42626 100644 --- a/consensus/types/src/data/mod.rs +++ b/consensus/types/src/data/mod.rs @@ -14,7 +14,7 @@ pub use data_column_custody_group::{ }; pub use data_column_sidecar::{ Cell, ColumnIndex, DataColumn, DataColumnSidecar, DataColumnSidecarError, - DataColumnSidecarFulu, DataColumnSidecarGloas, DataColumnSidecarHeze, DataColumnSidecarList, + DataColumnSidecarFulu, DataColumnSidecarGloas, DataColumnSidecarList, DataColumnsByRootIdentifier, }; pub use data_column_subnet_id::{DataColumnSubnetId, all_data_column_sidecar_subnets_from_spec}; diff --git a/testing/ef_tests/src/type_name.rs b/testing/ef_tests/src/type_name.rs index 3b447a1662..fe632f0211 100644 --- a/testing/ef_tests/src/type_name.rs +++ b/testing/ef_tests/src/type_name.rs @@ -65,7 +65,6 @@ type_name_generic!(BlobSidecar); type_name_generic!(DataColumnSidecar); type_name_generic!(DataColumnSidecarFulu, "DataColumnSidecar"); type_name_generic!(DataColumnSidecarGloas, "DataColumnSidecar"); -type_name_generic!(DataColumnSidecarHeze, "DataColumnSidecar"); type_name!(Checkpoint); type_name!(ConsolidationRequest); type_name_generic!(ContributionAndProof); diff --git a/testing/ef_tests/tests/tests.rs b/testing/ef_tests/tests/tests.rs index bdcba7dc15..0a200e7c7c 100644 --- a/testing/ef_tests/tests/tests.rs +++ b/testing/ef_tests/tests/tests.rs @@ -738,9 +738,9 @@ mod ssz_static { .run(); SszStaticHandler::, MainnetEthSpec>::gloas_only() .run(); - SszStaticHandler::, MinimalEthSpec>::heze_only() + SszStaticHandler::, MinimalEthSpec>::heze_only() .run(); - SszStaticHandler::, MainnetEthSpec>::heze_only() + SszStaticHandler::, MainnetEthSpec>::heze_only() .run(); }