From d70bd70ec3ccb1359e2f50c2a1c56bdc86e6e781 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Thu, 17 Oct 2024 08:04:03 -0700 Subject: [PATCH 1/8] electra updates --- ethereum/consensus-core/src/consensus_core.rs | 31 +- ethereum/consensus-core/src/consensus_spec.rs | 21 ++ ethereum/consensus-core/src/proof.rs | 38 ++- ethereum/consensus-core/src/types/mod.rs | 300 ++++++++++++++++-- ethereum/consensus-core/src/utils.rs | 4 +- .../bootstrap.ssz_snappy | Bin 0 -> 2377 bytes .../config.yaml | 55 ++++ .../meta.yaml | 3 + .../steps.yaml | 45 +++ ...d48a1fcd8e92984b094bd8207597_sf.ssz_snappy | Bin 0 -> 3054 bytes ...5ba526041c8ea2527e5cbeaefe5c_xf.ssz_snappy | Bin 0 -> 1193 bytes ...ab5ae612fc7a65e23f34d1a0e29d_sf.ssz_snappy | Bin 0 -> 2842 bytes ...ab5ae612fc7a65e23f34d1a0e29d_xf.ssz_snappy | Bin 0 -> 1190 bytes ...ab5ae612fc7a65e23f34d1a0e29d_xx.ssz_snappy | Bin 0 -> 757 bytes .../light_client_sync/bootstrap.ssz_snappy | Bin 0 -> 2377 bytes .../electra/light_client_sync/config.yaml | 55 ++++ .../electra/light_client_sync/meta.yaml | 3 + .../electra/light_client_sync/steps.yaml | 86 +++++ ...d48a1fcd8e92984b094bd8207597_sf.ssz_snappy | Bin 0 -> 3054 bytes ...0843e4d8673ead3a6d4256adfd10_sf.ssz_snappy | Bin 0 -> 2696 bytes ...a86ff350e24990e3e34665075448_sf.ssz_snappy | Bin 0 -> 2927 bytes ...bc08d4bab62fa075ee4f4f73549d_sf.ssz_snappy | Bin 0 -> 2942 bytes ...5ba526041c8ea2527e5cbeaefe5c_sf.ssz_snappy | Bin 0 -> 2845 bytes ...b9daced05fc322e772633150b0b4_xx.ssz_snappy | Bin 0 -> 758 bytes ...c7a27e1d33e99db728c4b85b436d_sx.ssz_snappy | Bin 0 -> 2524 bytes ...d2e2817264250a9a69c3a791a0fe_xf.ssz_snappy | Bin 0 -> 1194 bytes .../bootstrap.ssz_snappy | Bin 0 -> 2403 bytes .../config.yaml | 55 ++++ .../meta.yaml | 3 + .../steps.yaml | 9 + ...91d29745a3769789e7bee17ee6d7_sf.ssz_snappy | Bin 0 -> 3024 bytes ethereum/consensus-core/tests/runner/mod.rs | 10 +- ethereum/consensus-core/tests/sync.rs | 37 ++- 33 files changed, 694 insertions(+), 61 deletions(-) create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/bootstrap.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/config.yaml create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/meta.yaml create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/steps.yaml create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x0135573e3e3834ec18c1325bfd08816a6766d48a1fcd8e92984b094bd8207597_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x66f38b1586f12d7d2c42fcbf867817e5794c5ba526041c8ea2527e5cbeaefe5c_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/bootstrap.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/config.yaml create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/meta.yaml create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/steps.yaml create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x0135573e3e3834ec18c1325bfd08816a6766d48a1fcd8e92984b094bd8207597_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x25f64cbf076547dfbc25207d9c29889675b80843e4d8673ead3a6d4256adfd10_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x5d124d3e4e0590d597f0025096c16483a07fa86ff350e24990e3e34665075448_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x614a8c7b473967ed7ec6e342cb2472de462abc08d4bab62fa075ee4f4f73549d_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x66f38b1586f12d7d2c42fcbf867817e5794c5ba526041c8ea2527e5cbeaefe5c_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6d82fdd1fed607a582340184ab57cf266ae3b9daced05fc322e772633150b0b4_xx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xb6f113ccae600134ede042b6ce7f75d6e55ac7a27e1d33e99db728c4b85b436d_sx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xed4a5637066ffd1ac54700f538958802fac3d2e2817264250a9a69c3a791a0fe_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/bootstrap.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/config.yaml create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/meta.yaml create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/steps.yaml create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/update_0x9b9540f46ae0eec77002ab85529da89a8bc491d29745a3769789e7bee17ee6d7_sf.ssz_snappy diff --git a/ethereum/consensus-core/src/consensus_core.rs b/ethereum/consensus-core/src/consensus_core.rs index 84e3483d..eb6392e5 100644 --- a/ethereum/consensus-core/src/consensus_core.rs +++ b/ethereum/consensus-core/src/consensus_core.rs @@ -31,17 +31,19 @@ pub fn verify_bootstrap( checkpoint: B256, forks: &Forks, ) -> Result<()> { - if !is_valid_header::(&bootstrap.header, forks) { + if !is_valid_header::(&bootstrap.header(), forks) { return Err(ConsensusError::InvalidExecutionPayloadProof.into()); } let committee_valid = is_current_committee_proof_valid( - &bootstrap.header.beacon(), - &bootstrap.current_sync_committee, - &bootstrap.current_sync_committee_branch, + bootstrap.header().beacon(), + bootstrap.current_sync_committee(), + bootstrap.current_sync_committee_branch(), + bootstrap.header().beacon().slot / S::slots_per_epoch(), + forks, ); - let header_hash = bootstrap.header.beacon().tree_hash_root(); + let header_hash = bootstrap.header().beacon().tree_hash_root(); let header_valid = header_hash == checkpoint; if !header_valid { @@ -93,10 +95,10 @@ pub fn apply_bootstrap( bootstrap: &Bootstrap, ) { *store = LightClientStore { - finalized_header: bootstrap.header.clone(), - current_sync_committee: bootstrap.current_sync_committee.clone(), + finalized_header: bootstrap.header().clone(), + current_sync_committee: bootstrap.current_sync_committee().clone(), next_sync_committee: None, - optimistic_header: bootstrap.header.clone(), + optimistic_header: bootstrap.header().clone(), previous_max_active_participants: 0, current_max_active_participants: 0, best_valid_update: None, @@ -296,9 +298,11 @@ pub fn verify_generic_update( } let is_valid = is_finality_proof_valid( - &update.attested_header.beacon(), - &finalized_header.beacon(), + update.attested_header.beacon(), + finalized_header.beacon(), finality_branch, + update.attested_header.beacon().slot / S::slots_per_epoch(), + forks, ); if !is_valid { @@ -312,9 +316,11 @@ pub fn verify_generic_update( if let Some(next_sync_committee) = &update.next_sync_committee { if let Some(next_sync_committee_branch) = &update.next_sync_committee_branch { let is_valid = is_next_committee_proof_valid( - &update.attested_header.beacon(), + update.attested_header.beacon(), next_sync_committee, next_sync_committee_branch, + update.attested_header.beacon().slot / S::slots_per_epoch(), + forks, ); if !is_valid { @@ -488,6 +494,7 @@ fn is_valid_header(header: &LightClientHeader, forks: &Forks) let execution_branch = header.execution_branch().unwrap(); let valid_execution_type = match execution { + ExecutionPayloadHeader::Electra(_) => epoch >= forks.electra.epoch, ExecutionPayloadHeader::Deneb(_) => epoch >= forks.deneb.epoch, ExecutionPayloadHeader::Capella(_) => { epoch >= forks.capella.epoch && epoch < forks.deneb.epoch @@ -498,7 +505,7 @@ fn is_valid_header(header: &LightClientHeader, forks: &Forks) }; let proof_valid = - is_execution_payload_proof_valid(&header.beacon(), execution, execution_branch); + is_execution_payload_proof_valid(header.beacon(), execution, execution_branch); proof_valid && valid_execution_type } else { diff --git a/ethereum/consensus-core/src/consensus_spec.rs b/ethereum/consensus-core/src/consensus_spec.rs index feeff405..10201f6c 100644 --- a/ethereum/consensus-core/src/consensus_spec.rs +++ b/ethereum/consensus-core/src/consensus_spec.rs @@ -6,7 +6,11 @@ use typenum::Unsigned; pub trait ConsensusSpec: 'static + Default + Sync + Send + Clone + Debug + PartialEq { type MaxProposerSlashings: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type MaxAttesterSlashings: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxAttesterSlashingsElectra: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type MaxAttestations: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxAttestationsElectra: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxValidatorsPerSlot: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxCommitteesPerSlot: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type MaxDeposits: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type MaxVoluntaryExits: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type MaxBlsToExecutionChanged: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; @@ -16,6 +20,9 @@ pub trait ConsensusSpec: 'static + Default + Sync + Send + Clone + Debug + Parti type SlotsPerEpoch: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type EpochsPerSyncCommiteePeriod: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; type SyncCommitteeSize: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxWithdrawalRequests: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxDepositRequests: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; + type MaxConsolidationRequests: Unsigned + Default + Debug + Sync + Send + Clone + PartialEq; fn slots_per_epoch() -> u64 { Self::SlotsPerEpoch::to_u64() @@ -40,7 +47,11 @@ pub struct MainnetConsensusSpec; impl ConsensusSpec for MainnetConsensusSpec { type MaxProposerSlashings = typenum::U16; type MaxAttesterSlashings = typenum::U2; + type MaxAttesterSlashingsElectra = typenum::U1; type MaxAttestations = typenum::U128; + type MaxAttestationsElectra = typenum::U8; + type MaxCommitteesPerSlot = typenum::U64; + type MaxValidatorsPerSlot = typenum::U131072; type MaxDeposits = typenum::U16; type MaxVoluntaryExits = typenum::U16; type MaxBlsToExecutionChanged = typenum::U16; @@ -50,6 +61,9 @@ impl ConsensusSpec for MainnetConsensusSpec { type SlotsPerEpoch = typenum::U32; type EpochsPerSyncCommiteePeriod = typenum::U256; type SyncCommitteeSize = typenum::U512; + type MaxDepositRequests = typenum::U8192; + type MaxWithdrawalRequests = typenum::U16; + type MaxConsolidationRequests = typenum::U1; } #[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)] @@ -58,7 +72,11 @@ pub struct MinimalConsensusSpec; impl ConsensusSpec for MinimalConsensusSpec { type MaxProposerSlashings = typenum::U16; type MaxAttesterSlashings = typenum::U2; + type MaxAttesterSlashingsElectra = typenum::U1; type MaxAttestations = typenum::U128; + type MaxAttestationsElectra = typenum::U8; + type MaxCommitteesPerSlot = typenum::U4; + type MaxValidatorsPerSlot = typenum::U8192; type MaxDeposits = typenum::U16; type MaxVoluntaryExits = typenum::U16; type MaxBlsToExecutionChanged = typenum::U16; @@ -68,4 +86,7 @@ impl ConsensusSpec for MinimalConsensusSpec { type SlotsPerEpoch = typenum::U8; type EpochsPerSyncCommiteePeriod = typenum::U8; type SyncCommitteeSize = typenum::U32; + type MaxDepositRequests = typenum::U4; + type MaxWithdrawalRequests = typenum::U2; + type MaxConsolidationRequests = typenum::U1; } diff --git a/ethereum/consensus-core/src/proof.rs b/ethereum/consensus-core/src/proof.rs index ba8b0339..1ce44598 100644 --- a/ethereum/consensus-core/src/proof.rs +++ b/ethereum/consensus-core/src/proof.rs @@ -4,20 +4,28 @@ use tree_hash::TreeHash; use crate::{ consensus_spec::ConsensusSpec, - types::{BeaconBlockHeader, ExecutionPayloadHeader, SyncCommittee}, + types::{BeaconBlockHeader, ExecutionPayloadHeader, SyncCommittee, Forks}, }; pub fn is_finality_proof_valid( attested_header: &BeaconBlockHeader, finality_header: &BeaconBlockHeader, finality_branch: &[B256], + current_epoch: u64, + forks: &Forks, ) -> bool { + let (index, depth) = if current_epoch >= forks.electra.epoch { + (41, 7) + } else { + (41, 6) + }; + is_proof_valid( attested_header.state_root, finality_header, finality_branch, - 6, - 41, + depth, + index, ) } @@ -25,13 +33,21 @@ pub fn is_next_committee_proof_valid( attested_header: &BeaconBlockHeader, next_committee: &SyncCommittee, next_committee_branch: &[B256], + current_epoch: u64, + forks: &Forks, ) -> bool { + let (index, depth) = if current_epoch >= forks.electra.epoch { + (23, 6) + } else { + (23, 5) + }; + is_proof_valid( attested_header.state_root, next_committee, next_committee_branch, - 5, - 23, + depth, + index, ) } @@ -39,13 +55,21 @@ pub fn is_current_committee_proof_valid( attested_header: &BeaconBlockHeader, current_committee: &SyncCommittee, current_committee_branch: &[B256], + current_epoch: u64, + forks: &Forks, ) -> bool { + let (index, depth) = if current_epoch >= forks.electra.epoch { + (22, 6) + } else { + (22, 5) + }; + is_proof_valid( attested_header.state_root, current_committee, current_committee_branch, - 5, - 22, + depth, + index, ) } diff --git a/ethereum/consensus-core/src/types/mod.rs b/ethereum/consensus-core/src/types/mod.rs index d3ef10e8..da1ec364 100644 --- a/ethereum/consensus-core/src/types/mod.rs +++ b/ethereum/consensus-core/src/types/mod.rs @@ -48,7 +48,7 @@ pub struct BeaconBlock { } #[superstruct( - variants(Bellatrix, Capella, Deneb), + variants(Bellatrix, Capella, Deneb, Electra), variant_attributes( derive(Deserialize, Clone, Debug, Encode, TreeHash, Default), serde(deny_unknown_fields), @@ -65,21 +65,38 @@ pub struct BeaconBlockBody { eth1_data: Eth1Data, graffiti: B256, proposer_slashings: VariableList, + + #[superstruct( + only(Bellatrix, Capella, Deneb), + partial_getter(rename = "attester_slashings_base") + )] attester_slashings: VariableList, S::MaxAttesterSlashings>, + #[superstruct(only(Electra), partial_getter(rename = "attester_slashings_electra"))] + attester_slashings: VariableList, S::MaxAttesterSlashingsElectra>, + + #[superstruct( + only(Bellatrix, Capella, Deneb), + partial_getter(rename = "attestations_base") + )] attestations: VariableList, S::MaxAttestations>, + #[superstruct(only(Electra), partial_getter(rename = "attestations_electra"))] + attestations: VariableList, S::MaxAttestationsElectra>, + deposits: VariableList, voluntary_exits: VariableList, sync_aggregate: SyncAggregate, pub execution_payload: ExecutionPayload, - #[superstruct(only(Capella, Deneb))] + #[superstruct(only(Capella, Deneb, Electra))] bls_to_execution_changes: VariableList, - #[superstruct(only(Deneb))] + #[superstruct(only(Deneb, Electra))] blob_kzg_commitments: VariableList, + #[superstruct(only(Electra))] + execution_requests: ExecutionRequests, } impl Default for BeaconBlockBody { fn default() -> Self { - BeaconBlockBody::Bellatrix(BeaconBlockBodyBellatrix::default()) + BeaconBlockBody::Electra(BeaconBlockBodyElectra::default()) } } @@ -98,7 +115,7 @@ pub struct BlsToExecutionChange { } #[superstruct( - variants(Bellatrix, Capella, Deneb), + variants(Bellatrix, Capella, Deneb, Electra), variant_attributes( derive(Default, Debug, Deserialize, Encode, TreeHash, Clone), serde(deny_unknown_fields), @@ -130,12 +147,12 @@ pub struct ExecutionPayload { pub base_fee_per_gas: U256, pub block_hash: B256, pub transactions: VariableList, - #[superstruct(only(Capella, Deneb))] + #[superstruct(only(Capella, Deneb, Electra))] pub withdrawals: VariableList, - #[superstruct(only(Deneb))] + #[superstruct(only(Deneb, Electra))] #[serde(with = "serde_utils::u64")] pub blob_gas_used: u64, - #[superstruct(only(Deneb))] + #[superstruct(only(Deneb, Electra))] #[serde(with = "serde_utils::u64")] pub excess_blob_gas: u64, #[ssz(skip_serializing, skip_deserializing)] @@ -151,7 +168,7 @@ impl Default for ExecutionPayload { } #[superstruct( - variants(Bellatrix, Capella, Deneb), + variants(Bellatrix, Capella, Deneb, Electra), variant_attributes( derive( Serialize, @@ -191,12 +208,12 @@ pub struct ExecutionPayloadHeader { pub base_fee_per_gas: U256, pub block_hash: B256, pub transactions_root: B256, - #[superstruct(only(Capella, Deneb))] + #[superstruct(only(Capella, Deneb, Electra))] pub withdrawals_root: B256, - #[superstruct(only(Deneb))] + #[superstruct(only(Deneb, Electra))] #[serde(with = "serde_utils::u64")] pub blob_gas_used: u64, - #[superstruct(only(Deneb))] + #[superstruct(only(Deneb, Electra))] #[serde(with = "serde_utils::u64")] pub excess_blob_gas: u64, } @@ -259,21 +276,56 @@ pub struct AttesterSlashing { attestation_2: IndexedAttestation, } -#[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] +#[superstruct( + variants(Base, Electra), + variant_attributes( + derive(Deserialize, Debug, Default, Encode, TreeHash, Clone,), + serde(deny_unknown_fields), + ) +)] +#[derive(Deserialize, Debug, Encode, TreeHash, Clone)] #[serde(bound = "S: ConsensusSpec")] +#[serde(untagged)] +#[ssz(enum_behaviour = "transparent")] +#[tree_hash(enum_behaviour = "transparent")] struct IndexedAttestation { #[serde(with = "quoted_u64_var_list")] + #[superstruct(only(Base), partial_getter(rename = "attesting_indices_base"))] attesting_indices: VariableList, + #[serde(with = "quoted_u64_var_list")] + #[superstruct(only(Electra), partial_getter(rename = "attesting_indices_electra"))] + attesting_indices: VariableList, data: AttestationData, signature: Signature, } +impl Default for IndexedAttestation { + fn default() -> Self { + IndexedAttestation::Electra(IndexedAttestationElectra::default()) + } +} + +#[superstruct( + variants(Base, Electra), + variant_attributes( + derive(Deserialize, Debug, Encode, TreeHash, Clone,), + serde(deny_unknown_fields), + ) +)] #[derive(Deserialize, Debug, Encode, TreeHash, Clone)] #[serde(bound = "S: ConsensusSpec")] +#[serde(untagged)] +#[ssz(enum_behaviour = "transparent")] +#[tree_hash(enum_behaviour = "transparent")] pub struct Attestation { + #[superstruct(only(Base), partial_getter(rename = "aggregation_bits_base"))] aggregation_bits: BitList, + #[superstruct(only(Electra), partial_getter(rename = "aggregation_bits_electra"))] + aggregation_bits: BitList, data: AttestationData, signature: Signature, + #[superstruct(only(Electra))] + committee_bits: BitVector, } #[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] @@ -331,38 +383,147 @@ pub struct Eth1Data { block_hash: B256, } +#[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] +pub struct ExecutionRequests { + deposits: VariableList, + withdrawals: VariableList, + consolidations: VariableList, +} + +#[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] +pub struct DepositRequest { + pubkey: PublicKey, + withdrawal_credentials: B256, + #[serde(with = "serde_utils::u64")] + amount: u64, + signature: Signature, + #[serde(with = "serde_utils::u64")] + slot: u64, +} + +#[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] +pub struct WithdrawalRequest { + source_address: Address, + validator_pubkey: PublicKey, + #[serde(with = "serde_utils::u64")] + amount: u64, +} + +#[derive(Deserialize, Debug, Default, Encode, TreeHash, Clone)] +pub struct ConsolidationRequest { + source_address: Address, + source_pubkey: PublicKey, + target_pubkey: PublicKey, +} + +#[superstruct( + variants(Base, Electra), + variant_attributes(derive(Deserialize, Debug, Decode,), serde(deny_unknown_fields),) +)] #[derive(Deserialize, Debug, Decode)] -#[serde(bound = "S: ConsensusSpec")] +#[serde(untagged)] +#[ssz(enum_behaviour = "transparent")] pub struct Bootstrap { pub header: LightClientHeader, pub current_sync_committee: SyncCommittee, + #[superstruct( + only(Base), + partial_getter(rename = "current_sync_committee_branch_base") + )] pub current_sync_committee_branch: FixedVector, + #[superstruct( + only(Electra), + partial_getter(rename = "current_sync_committee_branch_electra") + )] + pub current_sync_committee_branch: FixedVector, +} + +impl Bootstrap { + pub fn current_sync_committee_branch(&self) -> &[B256] { + match self { + Bootstrap::Base(inner) => &inner.current_sync_committee_branch, + Bootstrap::Electra(inner) => &inner.current_sync_committee_branch, + } + } } +#[superstruct( + variants(Base, Electra), + variant_attributes( + derive(Serialize, Deserialize, Debug, Clone, Decode,), + serde(deny_unknown_fields), + ) +)] #[derive(Serialize, Deserialize, Debug, Clone, Decode)] -#[serde(bound = "S: ConsensusSpec")] +#[serde(untagged)] +#[ssz(enum_behaviour = "transparent")] pub struct Update { pub attested_header: LightClientHeader, pub next_sync_committee: SyncCommittee, + #[superstruct(only(Base), partial_getter(rename = "next_sync_committee_branch_base"))] pub next_sync_committee_branch: FixedVector, + #[superstruct( + only(Electra), + partial_getter(rename = "next_sync_committee_branch_electra") + )] + pub next_sync_committee_branch: FixedVector, pub finalized_header: LightClientHeader, + #[superstruct(only(Base), partial_getter(rename = "finality_branch_base"))] pub finality_branch: FixedVector, + #[superstruct(only(Electra), partial_getter(rename = "finality_branch_electra"))] + pub finality_branch: FixedVector, pub sync_aggregate: SyncAggregate, #[serde(with = "serde_utils::u64")] pub signature_slot: u64, } +impl Update { + pub fn next_sync_committee_branch(&self) -> &[B256] { + match self { + Update::Base(inner) => &inner.next_sync_committee_branch, + Update::Electra(inner) => &inner.next_sync_committee_branch, + } + } + + pub fn finality_branch(&self) -> &[B256] { + match self { + Update::Base(inner) => &inner.finality_branch, + Update::Electra(inner) => &inner.finality_branch, + } + } +} + +#[superstruct( + variants(Base, Electra), + variant_attributes( + derive(Serialize, Deserialize, Debug, Clone, Decode,), + serde(deny_unknown_fields), + ) +)] #[derive(Serialize, Deserialize, Debug, Clone, Decode)] -#[serde(bound = "S: ConsensusSpec")] +#[serde(untagged)] +#[ssz(enum_behaviour = "transparent")] pub struct FinalityUpdate { pub attested_header: LightClientHeader, pub finalized_header: LightClientHeader, + #[superstruct(only(Base), partial_getter(rename = "finality_branch_base"))] pub finality_branch: FixedVector, + #[superstruct(only(Electra), partial_getter(rename = "finality_branch_electra"))] + pub finality_branch: FixedVector, pub sync_aggregate: SyncAggregate, #[serde(with = "serde_utils::u64")] pub signature_slot: u64, } +impl FinalityUpdate { + pub fn finality_branch(&self) -> &[B256] { + match self { + FinalityUpdate::Base(inner) => &inner.finality_branch, + FinalityUpdate::Electra(inner) => &inner.finality_branch, + } + } +} + #[derive(Serialize, Deserialize, Debug, Decode)] #[serde(bound = "S: ConsensusSpec")] pub struct OptimisticUpdate { @@ -373,7 +534,7 @@ pub struct OptimisticUpdate { } #[superstruct( - variants(Bellatrix, Capella, Deneb), + variants(Bellatrix, Capella, Deneb, Electra), variant_attributes( derive(Default, Debug, Clone, Serialize, Deserialize, Decode, PartialEq), serde(deny_unknown_fields), @@ -384,9 +545,9 @@ pub struct OptimisticUpdate { #[ssz(enum_behaviour = "transparent")] pub struct LightClientHeader { pub beacon: BeaconBlockHeader, - #[superstruct(only(Capella, Deneb))] + #[superstruct(only(Capella, Deneb, Electra))] pub execution: ExecutionPayloadHeader, - #[superstruct(only(Capella, Deneb))] + #[superstruct(only(Capella, Deneb, Electra))] pub execution_branch: FixedVector, } @@ -415,6 +576,7 @@ pub struct Forks { pub bellatrix: Fork, pub capella: Fork, pub deneb: Fork, + pub electra: Fork, } #[derive(Serialize, Deserialize, Debug, Default, Clone)] @@ -429,21 +591,21 @@ pub struct GenericUpdate { pub sync_aggregate: SyncAggregate, pub signature_slot: u64, pub next_sync_committee: Option>, - pub next_sync_committee_branch: Option>, + pub next_sync_committee_branch: Option>, pub finalized_header: Option, - pub finality_branch: Option>, + pub finality_branch: Option>, } impl From<&Update> for GenericUpdate { fn from(update: &Update) -> Self { Self { - attested_header: update.attested_header.clone(), - sync_aggregate: update.sync_aggregate.clone(), - signature_slot: update.signature_slot, - next_sync_committee: default_to_none(update.next_sync_committee.clone()), - next_sync_committee_branch: default_to_none(update.next_sync_committee_branch.clone()), - finalized_header: default_header_to_none(update.finalized_header.clone()), - finality_branch: default_to_none(update.finality_branch.clone()), + attested_header: update.attested_header().clone(), + sync_aggregate: update.sync_aggregate().clone(), + signature_slot: *update.signature_slot(), + next_sync_committee: default_to_none(update.next_sync_committee().clone()), + next_sync_committee_branch: default_branch_to_none(update.next_sync_committee_branch()), + finalized_header: default_header_to_none(update.finalized_header().clone()), + finality_branch: default_branch_to_none(update.finality_branch()), } } } @@ -451,13 +613,13 @@ impl From<&Update> for GenericUpdate { impl From<&FinalityUpdate> for GenericUpdate { fn from(update: &FinalityUpdate) -> Self { Self { - attested_header: update.attested_header.clone(), - sync_aggregate: update.sync_aggregate.clone(), - signature_slot: update.signature_slot, + attested_header: update.attested_header().clone(), + sync_aggregate: update.sync_aggregate().clone(), + signature_slot: *update.signature_slot(), next_sync_committee: None, next_sync_committee_branch: None, - finalized_header: default_header_to_none(update.finalized_header.clone()), - finality_branch: default_to_none(update.finality_branch.clone()), + finalized_header: default_header_to_none(update.finalized_header().clone()), + finality_branch: default_branch_to_none(update.finality_branch()), } } } @@ -484,6 +646,16 @@ fn default_to_none(value: T) -> Option { } } +fn default_branch_to_none(value: &[B256]) -> Option> { + for elem in value { + if !elem.is_zero() { + return Some(value.to_vec()); + } + } + + None +} + fn default_header_to_none(value: LightClientHeader) -> Option { match &value { LightClientHeader::Bellatrix(header) => { @@ -524,6 +696,16 @@ fn default_header_to_none(value: LightClientHeader) -> Option Some(value) } } + ExecutionPayloadHeader::Electra(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderElectra::default(); + + if is_default { + None + } else { + Some(value) + } + } }, LightClientHeader::Deneb(header) => match &header.execution { ExecutionPayloadHeader::Bellatrix(payload_header) => { @@ -556,6 +738,58 @@ fn default_header_to_none(value: LightClientHeader) -> Option Some(value) } } + ExecutionPayloadHeader::Electra(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderElectra::default(); + + if is_default { + None + } else { + Some(value) + } + } + }, + LightClientHeader::Electra(header) => match &header.execution { + ExecutionPayloadHeader::Bellatrix(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderBellatrix::default(); + + if is_default { + None + } else { + Some(value) + } + } + ExecutionPayloadHeader::Capella(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderCapella::default(); + + if is_default { + None + } else { + Some(value) + } + } + ExecutionPayloadHeader::Deneb(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderDeneb::default(); + + if is_default { + None + } else { + Some(value) + } + } + ExecutionPayloadHeader::Electra(payload_header) => { + let is_default = header.beacon == BeaconBlockHeader::default() + && payload_header == &ExecutionPayloadHeaderElectra::default(); + + if is_default { + None + } else { + Some(value) + } + } }, } } diff --git a/ethereum/consensus-core/src/utils.rs b/ethereum/consensus-core/src/utils.rs index 76425e39..6a765b9d 100644 --- a/ethereum/consensus-core/src/utils.rs +++ b/ethereum/consensus-core/src/utils.rs @@ -21,7 +21,9 @@ pub fn calculate_fork_version( ) -> FixedVector { let epoch = slot / S::slots_per_epoch(); - let version = if epoch >= forks.deneb.epoch { + let version = if epoch >= forks.electra.epoch { + forks.electra.fork_version + } else if epoch >= forks.deneb.epoch { forks.deneb.fork_version } else if epoch >= forks.capella.epoch { forks.capella.fork_version diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/bootstrap.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/bootstrap.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..900bb55909d2a6d219ec94f476ce7e25b4222e1e GIT binary patch literal 2377 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 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..08b727d3d04e8c91e441965b697dfc51ccc3d4e1 GIT binary patch literal 2842 zcmc&!XHb)g7X3nkl7u3Jj`ZF^q)6`wC?Wy|MJd6hBTY&uf*{fZm@G;aLkmr$Nhb@^ zi_}0CDGEx5C;^eW&b*m7^ZvYj`|F)KKkwYR=iGa4D=*asY)A(HMgD{9Y1dtit=eIQ9N%z7%n%gRmHZ z@Nuiwyx)3v-e6V(8?3eJXs@7`S7Y}8;TvfYc(uhcImz7|LQV|KI*;m=CkpI1)wJlK zHr_rNl(WTnB<0|%K9rjilI!V2WbO}Gq==k^f3Sx*^X0h2B&^gPc(ej{Ysu|tpr_-ze_?wTkKso zkunL7Hz4yv?&gTar_XlJvhO-#X!xxLN$=f5ozeki*cCtP1z_Ow&Wf~9B?HOTWP09w zdpMixI+HK^@`5o8Rk~g^u|{n%x`mT=3oB`@P`@QY8QLC-F-jRUnpOxn5*VTWr1Tge zi^Mm@n#qN7Uf1d$3GA^kl8je7JwP4su{)Qp^*k(1(@{DU>#Cb$Zz}0##{Aj8tv%B0 z@Ewu-ag~y|9+6rjfNDLBmy?b>hN~hz6{gHw*4VPr;I6ZFVr`EdWlHc?>Y*Lm542tV zy!AZu+eC?C<}_9ehf2Ods9@@HOTLjA*hE`kp{~QhQ-SodS=IT8=H59{r@&@~dRi*# zlcTHXtK@R88+ryng@j)UcNqm*Y$JEdW>wZ+W!Mct3z&1hAM$&%;e zg0Dhv`04#QAL45<5Lm)b{?L!`vzYdP3w169(Y-1%5~)4jfhBlVFN89_#5HVu`}=!S@ui_y)!;|w+-?S) z=YCOs0fKc-ev$iN`F84Njvd!`;-!l^U3&rV_zt*(EP3O%@<=_Yi2orbmlVM5L@?D9 zlF7j-f;#%l#-8fxTs~NDZ~s7&N&1e|KKnuO9)t5;V|Kle0(PNsF2v44VI$y@f{A{c z_j!48^b8f-qfznhX)EpfW1+8mx6bFhKZ~UCokZf;l#CKVV~#blcBO4u^_aGDI}!)K z;)Tb%3UBgdxT8W^P_TB@7jCZfP6vk$w6DWM_6ts;hQA{9BKJsyo8?!_WO}HtT2S?* zurFp^RbybWIXtAhs%cHXj=?ABf=NuU8?1>DD)%knzH^8p-QQdIpOJkRQv$pAb5A=$ zc0tW^J(^(hMTOph4^Dv`Z_f$@EYEQ=?v9grw!<#oi6472cG0xzChB7pnwr!nK7JDS zt}EgT-eq(O(%G5C0~1jJfjk9?Cq<)$#!Z7#N;>p(lpO_l%h{B~ZRT$!)uSXp@Q%R*6pE ztIZo^8Td!(U7s(GCLhg9iCFlVW~uy#|F_1oU#Kr%P{2d78or$Oa4|^8j6Z5Kd!%iy zqNQS{}hT~5WH24aHDgtO$cDTHK!U%JP+=+0NG!Xp{A zhuwaa8?9R8HcV$PZsuI=@RIa{z79nLO`{w!>aUf-cRZBa#sexoPDOwV;mHh$elfmO zQy;lzuL_1x7;n6nH%Y}7mCL3s7e^SVNnd&GgF};)Py77GV|+3$(+fL3@op!I$~+HK z-2Q4d{C4Sb84FW#9Fx{6wt?K9%b^;~CWtK&RS`Z%8IxGFTHl_eKHCpoMQYyRu||5> z4TB~xsCpO7SBnzs624%4)1Uf(Utv~u@Ea-K9X=*>cB%n@ECVkH5I}=~aNeQotMk40 z(B)6-T^oibxhGhRc(93q2ugweiSFcc6JGOE5b!UKgMg^s{jA$aj`H#7CA+-t`=mxShpp3R4fZ}vC<(`&` zs3nUkyDfLm>Su&*cju+Dn=avK(+YFV{iYwEitrVKo}E;4h8+scE06tbpDsVgiv^vS zESXs!ZGDnx=DdtAX}E1nzmktHAVbUJB~EOD>?TKT%(7>Rn+gD+5&{603`~GD10BW5 z&3};JN3cfv_o{F@yRPjTE%B84s@H@x3~c0zr=Ju;jE}->%En3Qss8_kh^p zvOb*I%X-Vgm8ZAQD+5jZo_|a12Qo8q8?0 zbOy8cWu>&IUzGLM)&v8K-e#$q;P62Y3s`|d3B9oqFC1Kk<&5q}Y%H=iX+O6J{~=y@ LO82Yvuj;=5`dMN8 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xf.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..f51ff2ca81af63794b4e84daf629fbe75a67dbc7 GIT binary patch literal 1190 zcmdlZ%i+So@Q;zo=nx}=Km#`e16S2Iwl5}(@%c>aH5HpCU6RV&=2huc!%@8X!B;oI z=^Duec|ChS7go8isSwdPRN%4e^-Ue_JKCS~o+h~8@m_IY3ip4T75e9Ax7;;5b~%aR zdwYKPM6IxMK@rz~@rAmX-%vCP`k|(XxHs3bs$MG{O^7k*g zn>R^tnKI9{w&L9}9Z`?}sOfMgYp58fUguf%_&K-kz70#_t&Tfwo@$_S?B2Dy5VZi+ zo(Pkg_bFV5cB}g2e%oX9bH9z0eARy-*t+_@!D5zK+n%y#r8sv^@A$pftJKch%-ms4 z-l@e)4V5p=?Vn(mY`ITFF7NDR?pNKStOa|wEM_sC+T0ZQ_}P`1ogsBMu4vug(Y&Mk z>)F;FM~z)hv0OXzp0DB}i^k)vKMo`^KtKYNHr5UK!pbPYsrG!8uE7ge)=RckuO2?W zVQLlY$^CL$VXoMzurn{?S3mLF-laP8U*w!Mx17}!1y}y>`F~Ydb7A4cEVjl&3tlLn zo3#1Y(ZaQ__t@Ut+kfcz)EjJ@&py^pJ+a@=*~WE_+83a0-0!nY_g*SqbLVO;^AheJ zUg48!a($k8db@Jg@K$okcI4z+HtICaZ+_d)oMIUrgC{bKhKX^KwzeDa%#Ol-WL9)OZl|>fMzu z?cd5@MA$@0heTvWo@KluV4l11-UihJTRNXkDVW$=^y#^vX?)?iWuMRfS$XJ?1p|XF zuPh^jLKP!JjqDlU7x#|GR;_N`n!fGK6{*WYuF_MwN`yZwbo%RXWwN`hH#{w0Vq|DI z{%uxxg!t-9jgKS0o;v?<-jjq28;`yg|D1C&K=a38zHA*`F`kCQCmDIUSs7Uzm{{3a z7(5s`I8M#7=Hv@wWcZNy`)cNdKH<$bRZTOV9KG!{sq)>?d3|D@kEgOuSTfhU@Ou3} z6}e@M?SD5&RR2=CXL|AHzU!;mWT!Cxb${#?^84*Wja?EZi(w?@ih9mOuyG^$0y<68U zS~;Pg>zrkPk4pJR^P9cQn%5mqd`@}$T)JlE+#d(_r@T5l{kTZ5Usm9>txG@eURVjl}AtHGbwL4 z-FwDhu?wq>bY_3_lneTbReQ>J`JAmX{E*r3dQP8x!90$=g`;wAbvIG z2ZJt;9wS4QH8apaIBK$CZjieZsdJOlF10RVskX4i3Fm~0iAtv@Z3{?Z7CSMkci%)A z-CR2xW`+m3UVS#qHK()uxE2~L=W%nD)qGc9@{a>(G*C4F DGV~sV literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xx.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xfdc4c160932e0ce2aea3b37be2e25ab72693ab5ae612fc7a65e23f34d1a0e29d_xx.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..4cd8bfdef200a12314858ed90f3493bed6688633 GIT binary patch literal 757 zcmdlZ%i+So@Q;zo=nx|VO9S`6&ukFX_L=QN>VF{Ey86DsVwPFkp0a19ICoC(_`TPw z)Xv+?++j}Msl`hTl`qZhpJ114xlcqc@9bsnSKXql1$(zFW-*=G+!Xlu*_D``A$2#d zXx-n@yrcW;+14FLja^Q$Ts!lgui_$$#^bF&4kR*YdN3q#va>K4^KyJ)Wt8Ald%jB7 z;DsyeCEKc34Ql0rPa?YAt&T5K+EC2WWzbdS` zuyA4)TjQYxFO<(s+WhNi;o8@GY;W%EKXiQR4Yti^A8V(c*l*};<2py}3j+fK_xmi< zy_bsD+__rIyo9@lSNNowT%Tv2-maWAyp>$C9XYwz%)*lAidyNltvt19;`2p$Q>(6- z{yR~0sX1?w36F9@Q|`V4sydUa4c|TUI=k_)$tofKo;H5l7gM&~+&5R;yj)aq%5qgR zWws9&H68@LdUxeZ`?vBJ5jIiMArV=TXBn>unCC9Mw?Xy5md>YB3MRG|eR?iv8ee#B z+2^x=RvtQJ!N8!)E6d2BP{qhlBYVd8#l7RPRjXUKrf)lQMe4GUtMrtv65$UEo&Gvp znd~m>4NnS}7#SLlf14E^A-?)jX-~DnLnh9wP(8mw%ZI^D?m~WGhC7R2zub GfJ^|teOCnl literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/bootstrap.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/bootstrap.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..900bb55909d2a6d219ec94f476ce7e25b4222e1e GIT binary patch literal 2377 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 PTu)u`i>f#mKJWb-t0)hI literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x5d124d3e4e0590d597f0025096c16483a07fa86ff350e24990e3e34665075448_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x5d124d3e4e0590d597f0025096c16483a07fa86ff350e24990e3e34665075448_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..dccc4560ad4e413a18dc21e1d998d54352f92802 GIT binary patch literal 2927 zcmc(eS5VUp7RCReNDWcCfb=Fvk*Xm|4@wCrAO?_PL(jll60cjF2 zC?dUAA(RjT2q;Yf!@4uh?8DCN%=ffs&dhy0_x|pj)^oe!Gs-paYhHD)9Rw==)jq|DbJxW8z8@&rjH(zH;j zl0VHQS2}CnLt6@l5eruQ29F)DaZZ-w(hgNGHLBUx3Z_+*4F7fMAlknpZjO&9{8>eoLf7ffLnC< zEXUS-aU*aqA**jE!VA8VNXNnXC1rt1%wiYcknwG+jd{rZn^Ceq_%3SmBE`Jijo-Uh zl&b`tQtKsrQ>qImwQDc@w)qm6T3#=BND&&5x0Lej&XZwR$06H0HE-gka+=kn))dr= z3%w~rW6XwYp-J>nsS(cxv2i4HxHLS11ry2fVicFRN&hqFRHjuCIb;C0;AsEizxW45 zfOeTrCCloun!qB_FWLJGdT*bxZGDhdMR=+PLp$TOb5d`#&iU)d3`lm^Wu02Hhzh0U ztGdz&Pa7`Vz0(#al9Fqq#r2IlgX7HO{_E-2)v2h8%{ek&M5dKvhnH|K}hDWOXq?X zTP-Qdmy`9R(l5Bzhh;E%IDMh&7hXEJ+~{T$2worSQqAYxxhEHjHh#LX#Q1Ayn}f$m zL~f%ZJ)?$wTquW9@_i?O`G&HM=C4TKAeIY-JUQvZ?cFqpo8nn*+t!r@Yw+-%?oQ#o zB`#R5tbNXpu0`^Gsz}1B4^qr3Orz1~iv`cwm3d@@E&o@mU#E9Ju`U#$1;9iH>=QR%@CPUOqK>o=suHUCfqKS zSxoY4NfHRrA!Nr}p2tHFWzyQ2VWuLv7C#y));?0*13ck+elXQQvVV~?e}|Z_W;_bb zHh3W8MWNiA*-O%mk8?Jnn~L?#W9j&3NwGl{_)TXmsRl4{223>1MolP; zp&kBdjcT9imPuVwO>6qgOj2pJ}OH!}C0c@Ee*1a7HSjv9IY^w9uU) zV9bbeaftY6TA~d@n_*kDn6dRxL$p`65Df>Pqp)Z{tGD~@F&XoLh`REsTJ8sP3#F?H zZpAkt(I1CHla%s$59w1)hnQT2eT<)8zdt0CCzG9_cQe$e{WY~6)765~@sCysNt41>uq`NP5x;e{3i?lLniN@+x41ky zc!GNTN#oVK=vMm9W6_m8bA}h4Ct)<6qqozzl=WjlLk_ia$ny8u^;l1ZA*ED+zT!O8 znejx#dwW9aTK##;Z!D)WJxnJWp5vpi?U#)UUt2rd8DzSFAdk3!9F z`8)Q}u1Y`XD+AQZvG8#fRawVbN6V1FkqGcRfnP^IrjcG~2V{&-Z^Ok&aVV|d^|FEe zDW?r<#6wIr5P(^k%yyC4ajjyfx*{&!_k0)p9?{+Ma-qb1te|7>CT!7SlrcP|!*XkyR>+J2NDT;rZ8xOOPG?R$G ztrD_zkNHE3gt6OxEA$s0#wQdM!2$rR!2ecrCQ{|P{$x8yQQg{Ka9OqqU_y7??(8s~>sH?<&uf-D2GY%8A5K&ujL@fQkZ#?;Crr5|+F4AUDkK zA?i3o2}T9x_{7~AWHT|T{Nq%%d^4gj@h#>KPTHbTaHjGy33DIkH%Rp zlIJOOU8(UP?~RY8XWZ#stZTVqK8QYhd&y({vbdB%?@)+gsUNCT4^ zi7dCn2cB$Ewn*M5y0`u6cv|$Pj5Jgo0@K#^zK^n5jU7~ulQn|S4Fa>!gXo^q(K84G*J%Dg z`I4={#C8h=Y&(7(aw%gW1G5(6k=`eZqlF$x<|g@x+wMzebk}Azx8dPbalum1li$_6 z!H1%AszblpCMr*zO9lNlSTeLY`nDk5%&SsV)?fu^CFd6vOfgkrrGH!cBS!}<4RdDN zHxvOtEdT%)Mp;8f`8e)yS`akh{ZaL_i(B z!3#-16yqQa9Xndm{jo-G+VBM1l^ZPy26Z|XyI@GT&-!U>eKJdLw+AOT!ipj5zKMaY zg#OpuBeUIqf1G8@MfLr#&#T$7P}*XacrZt|q+sH8clqW=ufT!K=dgc1{sTt4t%Vqe zB|=3=pI+i(YXrt$C`lBf53xR1Y&>@55z{*1keM9Ivz^C75{ntRGzl46SVJ0aH@foa zJ9*1a;;KT4JAfRkJO~KVpryk8V+@Qo!g}niwnXoD>s`gm;oq1im(Rz?a=@l_?$@ir zy>#Ew3`xql0TECbEuiJ70s!eS+K}}HHvd4w@U5emCSkdh$g-3m9A9JIia~Jruk~`P M_S`=SS7EgO0%;$HNdN!< literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x614a8c7b473967ed7ec6e342cb2472de462abc08d4bab62fa075ee4f4f73549d_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x614a8c7b473967ed7ec6e342cb2472de462abc08d4bab62fa075ee4f4f73549d_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..3272bf0c644eb4cf40143ba629e733e127fad3b0 GIT binary patch literal 2942 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 K|7XKxP4M4Om50^< literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x66f38b1586f12d7d2c42fcbf867817e5794c5ba526041c8ea2527e5cbeaefe5c_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x66f38b1586f12d7d2c42fcbf867817e5794c5ba526041c8ea2527e5cbeaefe5c_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..5e83ec8db8c6549da4d3819f90e51355d723d0e9 GIT binary patch literal 2845 zcmc&!XHb)g7X1QYNvKMsOA(Mx=tV#S(otHZB*IDw2uPJ0I)d~_P+(CyglgzgqzDMY z(j`<`ii(9Ip$4S$nAw>(^ZvYj{(5K5&pT)CJ@=m5#zV27)`kE;vCrUYijlK!Jf!c3 zX}JzV#+6x_r=p;%S}9U=-KY}rMZAA2{&MKe?o6D8SO>FlnyyC3aPqy=Jn_zrj`B}o zFi)2n^?PmB3tF>kX@S?5?QCQ;bL-GfFz;|DjBDo^`;kY ztq*5$8Zmpbef_9QhbddF8egHb>fA|}a0w}Gt5Cfov^lgs6s_}QP-j}k_lSRla~peNmxyWQ(mmV%H!6z;B{XKOC)xrqO(fBnWt zi|sZHH@Cc*xEhvR$B$_{jfYEwAJZ$tJ{LXtprA%Zs&Unu+h1ybJj$HlA>T_w+Vitq zUL>bxY>k)7W=y9Er(QDHnSYv4Ux;Twlri1_vAinA!cM0dVJAYaa8wJ1lgN-GsrUw@~YK2}Qk zy*=qlYL2xAE14|=cJc8D=ds)CGq*OuctQR8J_oF*)cntBjwQInug;6-5BYGtQdnwc zAvRDSYVuI?uLZ2P@qk|`-^}}dm>Uv1qc9sy*-3d4e0|vnh3Nm){!=>N{`6Z4%c}$% z=G#FF?#ZWJ3aoD~%_~C41witPb%b6WZ_p*U*L)0OdXe7vW9y&qP05>T6In+XnRhV@ zpyhf_yZ}yfz&+1#`f8QDmW}4z?v%TX=-%~h;@#&8Fy)CS=T7w|!~Tbu$jMN*cT!Uf zz!~fuLYSjPR<>kk2jXCZjg6BSv&3ETJ+}RlT}B6MT{cZ@0h_=WCv4+m(QCl*3I0)S z?&8;p(KF2BUbTv*m^PYs#{%DX@6cwyI}4}so!nYFcIbiJ||7_uZMz$%slnbV5oXklU5clj6}L-R41Yc?1K5$X~K7?NNkej_DZ-!^`Ck9nz$k zkf3h-zPA$$?vuoG#WORskvTpr<0{b?RT(Oqp}+bPN<}rFhnrld#Cq#$ z`>QJkEd>xh>4%Ccua)z*Zz@?5wLG>k5`MB=Rg|oL z!r(MLH|Vrwd*8L5C5$QAgJXJzb8GLz3$STQ9W+nlZR*-gkht{86>b);usoK4lfJn3 zBEK6uKam_)JhtET!Mx8*kA`~;@m9{*rVq<@2FM)(hJD_famNt`*=t&kv5zYSRRV*G zKUCf(d`aaqK0Jt_%F7aRIpTFnOj1B6auA_01Rr|!=@hqluPh!?pud`p1(l!5MypfO zWvdDksXg}*q*VJsI85F$M7LQ6ytF@f^4rjx-FTY@A1Y;XSY77q3ur`Z=U=o|i6Oa; zQn_ckh8t_2X%VUkS*Hl!VrGXCyR_ZvbQz)Eg{g3JVbiNPltSo+BVAYP)!QC>ZK?+y z>Rf!mk@Nrn1^zp1y{M|iu0%Z><8o~@3^ELb_`dqIt9vm+6yxoQd$aQ}Sg!(mNwmvb zzvah_B>kMkj^{T!y}4UuooV!E>SfaJ|KBs7oujZD*~0_F%egNZ=W19RsUHnwjW+Li zdX4XUT^o7a6fN{1YShe%k;wPu0jsH;f-F?YIV(zH4aE>jGV!7wE!DqhmQb?K$kqh2ikA7O-LGTz{>$Kn!V-{9}8|sp_+tu_ci? z1-u1RG7L_lD;L=-cEYz>JLH;Oui1~!D&LPn(#6L2RnO)DfD|JS2;dI}0iirYM#~F- z{vJ$>X>e{Fn&28|(cw-@^n+~{+&s~kNY&%HbqWIh<`@Ww45S!SaTgm2-cYYz;S7yG z`PvT}Kl;bi?W_?cLd5oNVPy_mnZjtE3-AYM)I>jw$J0tXtjBsRiu2gx z=t#j(#tY-^;^3J4<`N*q00#lVYSia~|7Mgrb?C}OAZe5j|H@OW5Pom?nz&L)-D{yQ z?r#}z*y{a-YKW}=4Rvau#=|iAyf~nlmO?z8Se$Uz#|m|*oG}$_eiPKA?J9YG9HRY9 KR`Xo>y!u}!ky$qY literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6d82fdd1fed607a582340184ab57cf266ae3b9daced05fc322e772633150b0b4_xx.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6d82fdd1fed607a582340184ab57cf266ae3b9daced05fc322e772633150b0b4_xx.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..0192c14fcc3eb1c9da10056f82f9661c7ace4ded GIT binary patch literal 758 zcmdlZ%i+So@Q;zo=nx|VO9S`6&ukFX_L=QN>VF`Zwr|I8+cPU}p2~Z@blSg!KP~-} zXSVI$zcHUN<=Tm`6}x|F_D1iG&is6kL%@*FBKNiAqffIV(w1e%E?#Ri@N&h`{?eYo*{Wm{&T-qN_-_>=PLDPewnUkG`L4ud#3oB!yS5LLO zW%}E?V~?Fqs}$XH)7ryvW!E z{cXlVqsB=&@>WmNXHQxpwscDDT?IB*6(y~^=43_AXYAPAqUKw>=l<61CEWp<`X53%I5jgC#^vN*GYd+HtICaZ+_d)oMIUrgC{bKhKX^Oeh3Pg;Cu zjh89?mKA*@sBn>I>F<&&pXUo7Wmh>^_|5fk?V|oC5>u`iy>_0lQljaLoi^*09J777 z_hjB4ES^x?z`&r(E6d2BP{qhlBYVd8#l7RPRjXUKrf)lQMe4GUtMrtv65$UEo&Gvp znd~m>4NnS}7#SM+mH0L>FZIW^0glP`>s;X|VMZkL?5Zy- z7b{EzkR5&OTuLF@@?U6 zJkRGZUU-vpb%(~^(6Y!Y7ec*e-#+lhfPo>b0+e>=F)}cG`IpHsFB5x8wqj&RwSo8z G$OHiYMN^Cb literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xb6f113ccae600134ede042b6ce7f75d6e55ac7a27e1d33e99db728c4b85b436d_sx.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xb6f113ccae600134ede042b6ce7f75d6e55ac7a27e1d33e99db728c4b85b436d_sx.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..03b22ca0bce9ff4e12b96615d7586520e3912ec5 GIT binary patch literal 2524 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 E0J}UF(f|Me literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/bootstrap.ssz_snappy b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/bootstrap.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..9ab4b9eaacec56f7273d8a0e9e1035b948f01c96 GIT binary patch literal 2403 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: P) { +pub fn run>(test_data_dir: P, with_electra: bool) { let test_data_dir: PathBuf = test_data_dir.into(); let steps_file = test_data_dir.join("steps.yaml"); let steps = std::fs::read_to_string(steps_file).unwrap(); @@ -25,7 +25,7 @@ pub fn run>(test_data_dir: P) { let mut store = LightClientStore::default(); let config = get_meta_config(&test_data_dir); - let forks = get_forks(); + let forks = get_forks(with_electra); let bootstrap = get_bootstrap(&test_data_dir); verify_bootstrap(&bootstrap, config.trusted_block_root, &forks).expect("bootstrap failed"); @@ -157,7 +157,7 @@ fn get_meta_config(test_data_dir: &PathBuf) -> MetaConfig { serde_yaml::from_str(&meta).unwrap() } -fn get_forks() -> Forks { +fn get_forks(with_electra: bool) -> Forks { Forks { genesis: Fork { epoch: 0, @@ -179,5 +179,9 @@ fn get_forks() -> Forks { epoch: 0, fork_version: fixed_bytes!("04000001"), }, + electra: Fork { + epoch: if with_electra { 0 } else { u64::MAX }, + fork_version: fixed_bytes!("05000001"), + }, } } diff --git a/ethereum/consensus-core/tests/sync.rs b/ethereum/consensus-core/tests/sync.rs index 56908f49..4ca2e139 100644 --- a/ethereum/consensus-core/tests/sync.rs +++ b/ethereum/consensus-core/tests/sync.rs @@ -2,15 +2,42 @@ mod runner; #[test] fn light_client_sync_deneb() { - runner::run("testdata/deneb/light_client_sync"); + runner::run("testdata/deneb/light_client_sync", false); } #[test] -fn supply_sync_committee_from_past_update() { - runner::run("testdata/deneb/supply_sync_committee_from_past_update"); +fn supply_sync_committee_from_past_update_deneb() { + runner::run( + "testdata/deneb/supply_sync_committee_from_past_update", + false, + ); } #[test] -fn advance_finality_without_sync_committee() { - runner::run("testdata/deneb/advance_finality_without_sync_committee"); +fn advance_finality_without_sync_committee_deneb() { + runner::run( + "testdata/deneb/advance_finality_without_sync_committee", + false, + ); +} + +#[test] +fn light_client_sync_electra() { + runner::run("testdata/electra/light_client_sync", true); +} + +#[test] +fn supply_sync_committee_from_past_update_electra() { + runner::run( + "testdata/electra/supply_sync_committee_from_past_update", + true, + ); +} + +#[test] +fn advance_finality_without_sync_committee_electra() { + runner::run( + "testdata/electra/advance_finality_without_sync_committee", + true, + ); } From d0335b26a9691d19e2c7b6a16e45c982a1abb8ef Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Thu, 17 Oct 2024 08:22:03 -0700 Subject: [PATCH 2/8] fix consensus --- ethereum/consensus-core/src/types/mod.rs | 11 ++++++++++- ethereum/src/config/networks.rs | 16 ++++++++++++++++ ethereum/src/consensus.rs | 6 +++--- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ethereum/consensus-core/src/types/mod.rs b/ethereum/consensus-core/src/types/mod.rs index da1ec364..63a9ad2a 100644 --- a/ethereum/consensus-core/src/types/mod.rs +++ b/ethereum/consensus-core/src/types/mod.rs @@ -418,10 +418,15 @@ pub struct ConsolidationRequest { #[superstruct( variants(Base, Electra), - variant_attributes(derive(Deserialize, Debug, Decode,), serde(deny_unknown_fields),) + variant_attributes( + derive(Deserialize, Debug, Decode), + serde(deny_unknown_fields), + serde(bound = "S: ConsensusSpec"), + ) )] #[derive(Deserialize, Debug, Decode)] #[serde(untagged)] +#[serde(bound = "S: ConsensusSpec")] #[ssz(enum_behaviour = "transparent")] pub struct Bootstrap { pub header: LightClientHeader, @@ -452,10 +457,12 @@ impl Bootstrap { variant_attributes( derive(Serialize, Deserialize, Debug, Clone, Decode,), serde(deny_unknown_fields), + serde(bound = "S: ConsensusSpec"), ) )] #[derive(Serialize, Deserialize, Debug, Clone, Decode)] #[serde(untagged)] +#[serde(bound = "S: ConsensusSpec")] #[ssz(enum_behaviour = "transparent")] pub struct Update { pub attested_header: LightClientHeader, @@ -498,10 +505,12 @@ impl Update { variant_attributes( derive(Serialize, Deserialize, Debug, Clone, Decode,), serde(deny_unknown_fields), + serde(bound = "S: ConsensusSpec"), ) )] #[derive(Serialize, Deserialize, Debug, Clone, Decode)] #[serde(untagged)] +#[serde(bound = "S: ConsensusSpec")] #[ssz(enum_behaviour = "transparent")] pub struct FinalityUpdate { pub attested_header: LightClientHeader, diff --git a/ethereum/src/config/networks.rs b/ethereum/src/config/networks.rs index cc623168..7201fcf4 100644 --- a/ethereum/src/config/networks.rs +++ b/ethereum/src/config/networks.rs @@ -106,6 +106,10 @@ pub fn mainnet() -> BaseConfig { epoch: 269568, fork_version: fixed_bytes!("04000000"), }, + electra: Fork { + epoch: u64::MAX, + fork_version: fixed_bytes!("05000000"), + }, }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] @@ -147,6 +151,10 @@ pub fn goerli() -> BaseConfig { epoch: 231680, fork_version: fixed_bytes!("04001020"), }, + electra: Fork { + epoch: u64::MAX, + fork_version: fixed_bytes!("05001020"), + }, }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] @@ -188,6 +196,10 @@ pub fn sepolia() -> BaseConfig { epoch: 132608, fork_version: fixed_bytes!("90000073"), }, + electra: Fork { + epoch: u64::MAX, + fork_version: fixed_bytes!("90000074"), + }, }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] @@ -229,6 +241,10 @@ pub fn holesky() -> BaseConfig { epoch: 29696, fork_version: fixed_bytes!("05017000"), }, + electra: Fork { + epoch: u64::MAX, + fork_version: fixed_bytes!("06017000"), + }, }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] diff --git a/ethereum/src/consensus.rs b/ethereum/src/consensus.rs index b87460f8..b2b0e644 100644 --- a/ethereum/src/consensus.rs +++ b/ethereum/src/consensus.rs @@ -444,7 +444,7 @@ impl> Inner { .await .map_err(|err| eyre!("could not fetch bootstrap: {}", err))?; - let is_valid = self.is_valid_checkpoint(bootstrap.header.beacon().slot); + let is_valid = self.is_valid_checkpoint(bootstrap.header().beacon().slot); if !is_valid { if self.config.strict_checkpoint_age { @@ -507,7 +507,7 @@ impl> Inner { fn log_finality_update(&self, update: &FinalityUpdate) { let size = S::sync_commitee_size() as f32; let participation = - get_bits::(&update.sync_aggregate.sync_committee_bits) as f32 / size * 100f32; + get_bits::(&update.sync_aggregate().sync_committee_bits) as f32 / size * 100f32; let decimals = if participation == 100.0 { 1 } else { 2 }; let age = self.age(self.store.finalized_header.beacon().slot); @@ -526,7 +526,7 @@ impl> Inner { fn log_optimistic_update(&self, update: &FinalityUpdate) { let size = S::sync_commitee_size() as f32; let participation = - get_bits::(&update.sync_aggregate.sync_committee_bits) as f32 / size * 100f32; + get_bits::(&update.sync_aggregate().sync_committee_bits) as f32 / size * 100f32; let decimals = if participation == 100.0 { 1 } else { 2 }; let age = self.age(self.store.optimistic_header.beacon().slot); From 4337f1ff73ec6934d007f977deb860e0ed301d27 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Mon, 28 Oct 2024 16:42:07 -0400 Subject: [PATCH 3/8] update configs --- ethereum/consensus-core/src/proof.rs | 2 +- ethereum/src/config/checkpoints.rs | 7 +- ethereum/src/config/networks.rs | 135 +++++++++++++-------------- 3 files changed, 71 insertions(+), 73 deletions(-) diff --git a/ethereum/consensus-core/src/proof.rs b/ethereum/consensus-core/src/proof.rs index 1ce44598..bceec095 100644 --- a/ethereum/consensus-core/src/proof.rs +++ b/ethereum/consensus-core/src/proof.rs @@ -4,7 +4,7 @@ use tree_hash::TreeHash; use crate::{ consensus_spec::ConsensusSpec, - types::{BeaconBlockHeader, ExecutionPayloadHeader, SyncCommittee, Forks}, + types::{BeaconBlockHeader, ExecutionPayloadHeader, Forks, SyncCommittee}, }; pub fn is_finality_proof_valid( diff --git a/ethereum/src/config/checkpoints.rs b/ethereum/src/config/checkpoints.rs index 0f1032e1..34cbdad7 100644 --- a/ethereum/src/config/checkpoints.rs +++ b/ethereum/src/config/checkpoints.rs @@ -105,10 +105,9 @@ impl CheckpointFallback { Self { services: Default::default(), networks: vec![ - networks::Network::MAINNET, - networks::Network::GOERLI, - networks::Network::SEPOLIA, - networks::Network::HOLESKY, + networks::Network::Mainnet, + networks::Network::Sepolia, + networks::Network::Holesky, ], } } diff --git a/ethereum/src/config/networks.rs b/ethereum/src/config/networks.rs index 7201fcf4..23610cac 100644 --- a/ethereum/src/config/networks.rs +++ b/ethereum/src/config/networks.rs @@ -19,10 +19,10 @@ use crate::config::types::ChainConfig; Debug, Clone, Copy, Serialize, Deserialize, EnumIter, Hash, Eq, PartialEq, PartialOrd, Ord, )] pub enum Network { - MAINNET, - GOERLI, - SEPOLIA, - HOLESKY, + Mainnet, + Sepolia, + Holesky, + PectraDevnet, } impl FromStr for Network { @@ -30,10 +30,10 @@ impl FromStr for Network { fn from_str(s: &str) -> Result { match s { - "mainnet" => Ok(Self::MAINNET), - "goerli" => Ok(Self::GOERLI), - "sepolia" => Ok(Self::SEPOLIA), - "holesky" => Ok(Self::HOLESKY), + "mainnet" => Ok(Self::Mainnet), + "sepolia" => Ok(Self::Sepolia), + "holesky" => Ok(Self::Holesky), + "pectra-devnet" => Ok(Self::PectraDevnet), _ => Err(eyre::eyre!("network not recognized")), } } @@ -42,10 +42,10 @@ impl FromStr for Network { impl Display for Network { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let str = match self { - Self::MAINNET => "mainnet", - Self::GOERLI => "goerli", - Self::SEPOLIA => "sepolia", - Self::HOLESKY => "holesky", + Self::Mainnet => "mainnet", + Self::Sepolia => "sepolia", + Self::Holesky => "holesky", + Self::PectraDevnet => "pectra-devnet", }; f.write_str(str) @@ -55,19 +55,18 @@ impl Display for Network { impl Network { pub fn to_base_config(&self) -> BaseConfig { match self { - Self::MAINNET => mainnet(), - Self::GOERLI => goerli(), - Self::SEPOLIA => sepolia(), - Self::HOLESKY => holesky(), + Self::Mainnet => mainnet(), + Self::Sepolia => sepolia(), + Self::Holesky => holesky(), + Self::PectraDevnet => pectra_devnet(), } } pub fn from_chain_id(id: u64) -> Result { match id { - 1 => Ok(Network::MAINNET), - 5 => Ok(Network::GOERLI), - 11155111 => Ok(Network::SEPOLIA), - 17000 => Ok(Network::HOLESKY), + 1 => Ok(Network::Mainnet), + 11155111 => Ok(Network::Sepolia), + 17000 => Ok(Network::Holesky), _ => Err(eyre::eyre!("chain id not known")), } } @@ -113,52 +112,7 @@ pub fn mainnet() -> BaseConfig { }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] - data_dir: Some(data_dir(Network::MAINNET)), - ..std::default::Default::default() - } -} - -pub fn goerli() -> BaseConfig { - BaseConfig { - default_checkpoint: b256!( - "f6e9d5fdd7c406834e888961beab07b2443b64703c36acc1274ae1ce8bb48839" - ), - rpc_port: 8545, - consensus_rpc: None, - chain: ChainConfig { - chain_id: 5, - genesis_time: 1616508000, - genesis_root: b256!("043db0d9a83813551ee2f33450d23797757d430911a9320530ad8a0eabc43efb"), - }, - forks: Forks { - genesis: Fork { - epoch: 0, - fork_version: fixed_bytes!("00001020"), - }, - altair: Fork { - epoch: 36660, - fork_version: fixed_bytes!("01001020"), - }, - bellatrix: Fork { - epoch: 112260, - fork_version: fixed_bytes!("02001020"), - }, - capella: Fork { - epoch: 162304, - fork_version: fixed_bytes!("03001020"), - }, - deneb: Fork { - epoch: 231680, - fork_version: fixed_bytes!("04001020"), - }, - electra: Fork { - epoch: u64::MAX, - fork_version: fixed_bytes!("05001020"), - }, - }, - max_checkpoint_age: 1_209_600, // 14 days - #[cfg(not(target_arch = "wasm32"))] - data_dir: Some(data_dir(Network::GOERLI)), + data_dir: Some(data_dir(Network::Mainnet)), ..std::default::Default::default() } } @@ -203,7 +157,7 @@ pub fn sepolia() -> BaseConfig { }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] - data_dir: Some(data_dir(Network::SEPOLIA)), + data_dir: Some(data_dir(Network::Sepolia)), ..std::default::Default::default() } } @@ -248,7 +202,52 @@ pub fn holesky() -> BaseConfig { }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] - data_dir: Some(data_dir(Network::HOLESKY)), + data_dir: Some(data_dir(Network::Holesky)), + ..std::default::Default::default() + } +} + +pub fn pectra_devnet() -> BaseConfig { + BaseConfig { + default_checkpoint: b256!( + "4fd68b5777c1369adc2ddc7faf53a8ba8482390f8e0239fbd60b1bf1a66f0c5a" + ), + rpc_port: 8545, + consensus_rpc: None, + chain: ChainConfig { + chain_id: 1, + genesis_time: 1729268862, + genesis_root: b256!("e3218d56569ba80b24d8c5d442b7a13c5fbf5d5e740dd986272f67b525e0e1e7"), + }, + forks: Forks { + genesis: Fork { + epoch: 0, + fork_version: fixed_bytes!("10357071"), + }, + altair: Fork { + epoch: 0, + fork_version: fixed_bytes!("20357071"), + }, + bellatrix: Fork { + epoch: 0, + fork_version: fixed_bytes!("30357071"), + }, + capella: Fork { + epoch: 0, + fork_version: fixed_bytes!("40357071"), + }, + deneb: Fork { + epoch: 0, + fork_version: fixed_bytes!("50357071"), + }, + electra: Fork { + epoch: 5, + fork_version: fixed_bytes!("60357071"), + }, + }, + max_checkpoint_age: 1_209_600, // 14 days + #[cfg(not(target_arch = "wasm32"))] + data_dir: Some(data_dir(Network::PectraDevnet)), ..std::default::Default::default() } } From 2d3393d635b8a71d45afaef5cf779aadd7863068 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Mon, 3 Feb 2025 16:05:35 -0500 Subject: [PATCH 4/8] update consensus to pectra-devnet-6 --- ethereum/consensus-core/src/consensus_core.rs | 22 ++- ethereum/consensus-core/src/consensus_spec.rs | 2 +- .../bootstrap.ssz_snappy | Bin 2377 -> 2022 bytes .../config.yaml | 8 +- .../meta.yaml | 7 +- .../steps.yaml | 70 +++++---- ...c1fd1057f5d82a9695f7ba05b1ab_xf.ssz_snappy | Bin 0 -> 1190 bytes ...ba8ac508034ab8aa851546fb7b32_sf.ssz_snappy | Bin 0 -> 2956 bytes ...ba8ac508034ab8aa851546fb7b32_xf.ssz_snappy | Bin 0 -> 1190 bytes ...ba8ac508034ab8aa851546fb7b32_xx.ssz_snappy | Bin 0 -> 757 bytes ...bd1128e9fb52ce63e60732635ade_sf.ssz_snappy | Bin 0 -> 2567 bytes .../light_client_sync/bootstrap.ssz_snappy | Bin 2377 -> 2022 bytes .../electra/light_client_sync/config.yaml | 8 +- .../electra/light_client_sync/meta.yaml | 7 +- .../electra/light_client_sync/steps.yaml | 136 +++++++++++------- ...af4af34dfd0d517b2a19d7cbc515_sx.ssz_snappy | Bin 0 -> 2363 bytes ...237daccb43922ab68cf4b73b1344_sf.ssz_snappy | Bin 0 -> 2906 bytes ...e549870d2e753ef35785be263d88_sf.ssz_snappy | Bin 0 -> 2727 bytes ...c1fd1057f5d82a9695f7ba05b1ab_sf.ssz_snappy | Bin 0 -> 2956 bytes ...778370ec47d7a2c827ad8cecf1ba_sf.ssz_snappy | Bin 0 -> 2940 bytes ...b839c1e7d26d8c5ae67faa16e5dc_xf.ssz_snappy | Bin 0 -> 1192 bytes ...b68220e6dc3ede7b754e88316cfe_xx.ssz_snappy | Bin 0 -> 758 bytes ...bd1128e9fb52ce63e60732635ade_sf.ssz_snappy | Bin 0 -> 2567 bytes .../bootstrap.ssz_snappy | Bin 2403 -> 2048 bytes .../config.yaml | 8 +- .../meta.yaml | 7 +- .../steps.yaml | 14 +- ...a182e884d1869eaad9993580fabc_sf.ssz_snappy | Bin 0 -> 2537 bytes ethereum/src/config/networks.rs | 22 +-- 29 files changed, 195 insertions(+), 116 deletions(-) create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x6ad1512a26e6b430d9916050f6bee1fde680c1fd1057f5d82a9695f7ba05b1ab_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xed3633b21718e0ad4f0eafca7349e20d78c2bd1128e9fb52ce63e60732635ade_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x385feaf30f37df7de56e32ab099bc5875d04af4af34dfd0d517b2a19d7cbc515_sx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6120c479db1409967248efa2f3fa1cb7a29c237daccb43922ab68cf4b73b1344_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x691c9ff80a4820d209c0fc3d044bb8a8256de549870d2e753ef35785be263d88_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6ad1512a26e6b430d9916050f6bee1fde680c1fd1057f5d82a9695f7ba05b1ab_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaab2b7f33438b2f19579aba316b4e90ac2a8778370ec47d7a2c827ad8cecf1ba_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaea76277f39fc065517107b38db4e0b25ac9b839c1e7d26d8c5ae67faa16e5dc_xf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xbc05d63421b6884cf40b3f416c36ea0c6612b68220e6dc3ede7b754e88316cfe_xx.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/light_client_sync/update_0xed3633b21718e0ad4f0eafca7349e20d78c2bd1128e9fb52ce63e60732635ade_sf.ssz_snappy create mode 100644 ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/update_0x83dbc2fa2597f8700f7722bd30594ff70b1aa182e884d1869eaad9993580fabc_sf.ssz_snappy diff --git a/ethereum/consensus-core/src/consensus_core.rs b/ethereum/consensus-core/src/consensus_core.rs index eb6392e5..012d67a9 100644 --- a/ethereum/consensus-core/src/consensus_core.rs +++ b/ethereum/consensus-core/src/consensus_core.rs @@ -436,11 +436,23 @@ fn is_better_update( // compare sync committee finality if new_has_finality { let new_has_sync_committee_finality = - calc_sync_period::(new_update.finalized_header.as_ref().unwrap().beacon().slot) - == calc_sync_period::(new_update.attested_header.beacon().slot); + calc_sync_period::( + new_update + .finalized_header + .clone() + .unwrap_or_default() + .beacon() + .slot, + ) == calc_sync_period::(new_update.attested_header.beacon().slot); let old_has_sync_committee_finality = - calc_sync_period::(old_update.finalized_header.as_ref().unwrap().beacon().slot) - == calc_sync_period::(old_update.attested_header.beacon().slot); + calc_sync_period::( + old_update + .finalized_header + .clone() + .unwrap_or_default() + .beacon() + .slot, + ) == calc_sync_period::(old_update.attested_header.beacon().slot); if new_has_sync_committee_finality != old_has_sync_committee_finality { return new_has_sync_committee_finality; } @@ -463,7 +475,7 @@ fn has_sync_update(update: &GenericUpdate) -> bool { } fn has_finality_update(update: &GenericUpdate) -> bool { - update.finalized_header.is_some() && update.finality_branch.is_some() + update.finality_branch.is_some() } fn verify_sync_committee_signture( diff --git a/ethereum/consensus-core/src/consensus_spec.rs b/ethereum/consensus-core/src/consensus_spec.rs index 10201f6c..83a5db85 100644 --- a/ethereum/consensus-core/src/consensus_spec.rs +++ b/ethereum/consensus-core/src/consensus_spec.rs @@ -63,7 +63,7 @@ impl ConsensusSpec for MainnetConsensusSpec { type SyncCommitteeSize = typenum::U512; type MaxDepositRequests = typenum::U8192; type MaxWithdrawalRequests = typenum::U16; - type MaxConsolidationRequests = typenum::U1; + type MaxConsolidationRequests = typenum::U2; } #[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)] diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/bootstrap.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/bootstrap.ssz_snappy index 900bb55909d2a6d219ec94f476ce7e25b4222e1e..f507cec0eabe884d5aec0e5ffc02e8dc18034cbe 100644 GIT binary patch delta 1524 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 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..c1c61b55dc51bec37b4ebb8ca9bbea81d8e023cd GIT binary patch literal 2956 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 uBn9GNp(mGpQSaq~o)5dT5ZD?xw*Lbtkzf`8 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xf.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..731709c3aa0c7b89f151a372db3ca62f224a8cc7 GIT binary patch literal 1190 zcmdlZ%i+So@Q;zo=nx}=Km#`e16S2Iwl5}(@%c>aH5HpCU6RV&=2huc!%@8X!B;oI z=^Duec|ChS7cSQ4K78ZnF`o(3>zd3XHs1MVR$!pv${ji5ahBh%&|AWb8|%(a$hVwa z`uU3FgvaOJ>1y|!-R$@2#LK;Q4EhTe{_%SiK24N=QLQeAd0KVCe7hA#eAYI-E3W3X zzWdhE&?%aA`i8kvmK@|C~-luRK+O6u7`)!Za&;2%1@>TzVU}tydf&f0J^u`;~@8-&EJgNQS(xiWuXIWPF zc244Z_V#!A<)-2bM{ABvmfaJx@kIYJ?&xgk5-wz{K&2_|!TDzwukZM%9T>MLSEs2%V3)zp`;Uqgj%!@=JLJ23=lR zMh1l{Mur;MGrlkG9gnSA-MTe>+nFm;mxWxVr*xGFe^}`B*Wt=!cUf+8& z#Z5ic&+F3y&Lpi_NvaBteHOLG+Z&srI$Km3{lj#0#dsPHpJe3aW@Th?U}9xwVenw& z;5aqQnv*Y#k>NvPQpsbNYumpa&HJNr^I}8|OGl}9*6X9T8b_~ppAa=zx3vDBirg~B z_P-k>s(&fnGrjn8-}TjOvQrrUx``Th2x#x4ny#ml#ayYW1qzj)zI&ea_ne?!Y6 zuUrWAntl7g8v_OgvkC@=0A79u4PK59iALvyDh~e_OpfogXwRrWx6bfSPFsg!rRauT zOnxRyZ+(t*x};&NYv`_OJJp-(=#B8Egrc--%Mw<3)a%r@Z*+E%V2;@E$+IKyp_k*) zW}D4Pn__3wXL(G%?4taBkInVVbG|VAvte$tVgBF{U~elSG_SBB_8*r>Y*|VEE}g4g zH7=<$xr>h^M5MnHZ+c=TVAx`{G`J_Ni$z#vZB#){FgGY?@^F?gdOVyNwepd+X~SFnxtEKUyxn-FE1x5i^;fB`jBc)-4Ku@o wT(3SG<{Iskzb9MvSys26E0FpoEBg2DiK=QInJ*ghJWE@4m@JwHG#aQH0G50THvj+t literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xx.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0x957b8d1aae7ed4f46dfbece27ba344efbcd4ba8ac508034ab8aa851546fb7b32_xx.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..f5315e1825ed20a26d3eca1b4480673c61f812f9 GIT binary patch literal 757 zcmdlZ%i+So@Q;zo=nx|VO9S`6&ukFX_L=QN>VF{E+17V6UmeswTllY#!{at>!srbUtnq!k?_rz>G(Z7s)di~vt>o+83mp z3~wks>02ZcSfTnyz0f#>CG@|_{o4yu!lwucd|RjVKT`hD%Cj*QpVCfDzovZq=E<+o zl0SXB|0>td*&SA<%YI1VxAYXou+yIoEs)(-cT_OJWKK_ocG{$ESC52!VPIh3exGH! z_fqkiJ6CI&mvHy+3ZGPy>+{Uh+m*A1w~|Y?!){9Efty|N#ow*`)S;$p-N>_>ShlNgm9j;7v zm-U7xg-eVK4e}dV+|*P3ygn`9OwyW_q^jW9XHjdsy|F2(vqhEBKTJngjHlu7Nk(37 zRz?;FCRSj$doXfvoSJ3L$rr}R@F6j&JE*+p=FU*E`)l`zJ1`00Rux=1t{sxV`O0X@-LHNUMBX0Y{kfsY6I~akO=_n CYDua9 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xed3633b21718e0ad4f0eafca7349e20d78c2bd1128e9fb52ce63e60732635ade_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/advance_finality_without_sync_committee/update_0xed3633b21718e0ad4f0eafca7349e20d78c2bd1128e9fb52ce63e60732635ade_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..63b0ff8e230ac79e6d0bae3f3b708e495ed88c28 GIT binary patch literal 2567 zcma))cQD+G7RP^!gvAmi1d+8miIN~UVq-~Iy-UK%4NJmB^s-hjR~Nk#C3+Wv=&Rna z8)aEhqD0B+R(}L}-rSk@X5P%3dEfc|b>=(YIp;H{jh8Z@LI(gPqRQ$1da!rKdyQr5 zeHV^i&PWvxxEz-3Szyc4CE$*TvBEHo9E-cGt-YE#jC&G-jng5B;NE@_xNEjerllUZBty~WZ}1r%6jVk2Ix+x1(93tYbRGWgwt3dx zUyJ0UWT#N2Czd{{wR9FfnF(~Qsry~H$g#>S3sMc9Wc@HorKvAZifgUJySBh=!UWv< z!e-OtPGrCa%^bm2i)|q^eE(OLnZ@7x7vlg*ce;_ie5_djtLHKPu~Q3E_ov!My%tR9 zx?%Ljmfgx5$hPSrG38V{Ex#YOS$U@06GsI##833vV$lhJ9KF1Y@jNiNxI@0pUj>=4 zQTsZlwf!ZFONZH+V|gA)Z&kWpbqgUv`Mh=PQk#7ofkm=udI z#(A{H-SmCjlNs|=tdm){B4mE&1K(+rHOj)zJ!jX`ycLdXF%fxB&t^=8dzbF(%sXRd zK{?dW7Y_1|YFwARL|YdKqQn=Yf{*JG#uPcE3Ad8|YE1QV7QZ8j-2J(2g}7~4+etYm|>IZxHFVd1Wq z8CTbhL;R?@gU4hFeFeu;V$EnfG&@2Cv{9ptp)Q$FDmHF3AO8@etD^}?+-NxPV`)tt zht1sgn570EENA)?#F&7GY~0r%!T}ycD_wo-!G|!ym^b)S^~9Y;1>0=( z(Cg%*n|W$X94Hl{+Is}&p4QQlODNK3t112FHR^Te*3Ize)W=D)Z&_CCP6OOq{_}{b z05wJ9Z4Ouc!C&1n#VnFWY0|mrtc6EV4?ULINBC%363U17qS%}(Up$Z}~6e|L_<&L#wk- zmX;S^B0Vqy#nMzgQzkGbXUKUO{E4d-z+x6fMIN^?2dzYTmvwI2Dv2~g7G@v|MwwP$ zrAQcyI6j}rM^(ZSQ*&V$b+Dd`^7NdSv+kgK33O_BfX&{}Yf5$|96)!Dpg>>6v9v#G$mmvn!?{djzDn8rA5PSv5jo4g5Q@v4+V zp&@fr4~K z)owdbC&MV}o_4=eX*@#aRJiBkEJt%mA4}Zyz_#L0i}@Z~%(qoakMh${RR zw9Cw2aPX5=t^L+nGKT|y$Qd~>j%&V3IbnL~7jvO}RE4bqquqX(Pk#;<&P(C((KK%P zhZHSh;AgqQyGjKW%feV=SsYfl7mRQ+)9mX{Bfcop6n=!+O0*W5Aq`IAo(KYB~ zn@6-AMeSsF;cTsZ^?7gv($$osZ<$3RWP{G1?C0{3VqwaSojGWZoLKsha4g^oY86&& z6^05H9oEk7z$_7~)J%uT1uv;6!K)hO`2|T4?9%OI$Hf$B!Tz}ke`8^Np%@cc-G=OIyI2OEEd!L-zb=*Z zd%P4Bei6HD_NraT5~*YSm9H+!5p1CKNup<+n4?2lVc`iYQb);kY9}UM#c5p=_jdZJ zY~RDjQfB>UZdo;>QH$6!wjePz085m9FTEOa2nj;#f=*}|t@Py|K-B7VaL?9}i4 zgCvRXIi!gOniVZtQ{29Ae=Xlu3%_#c1D>HS#eJ z^eMdnAOYb80es#dz?YYxvpVs_oJ0i?>Vbv@Al7erO+Dz7lOBn zLE-1MH+)X{=j29DI=)t1S;PY z@>DZx2Dd2<0QWHfa09{&a6;%P=m$JWN7)37RENtX7;(iy7GAK@ANgpo+TYy9e|S>h zXM4fZQL-v!^NPt!L1ezC=RbzbD|w@Zps{A7L%BQwJkEyYR88Njzn4rWne3kG8#puZ zIjWP(XORr|Q1I99TMmE=ICU7DnxYg=apy^9w@eiKDRvz%UQs>(uaqY#IoG6rvlnaL zvepQ%BptY|e{`*^8rj>Wa2}s8nYacr&2lk8<3tk9{JH=MMoAFhtw4QQ_-_ZpseOrT zXAYhx;@{=u6SLClqlf9qy^|j{^p7U@7khJ88ko>LAdn)Q8i)s7&%BJUu<{s`8(mAh gH!T7yWtY5N8dTJP^)CH$7!{?t8E{u)uiGS+^ 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 MNAoj9(0T7a0ObcYY5)KL literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x691c9ff80a4820d209c0fc3d044bb8a8256de549870d2e753ef35785be263d88_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x691c9ff80a4820d209c0fc3d044bb8a8256de549870d2e753ef35785be263d88_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..481a81bbee904aad6e9ad64d5932d6282a4ad5e6 GIT binary patch literal 2727 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 AbN~PV literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6ad1512a26e6b430d9916050f6bee1fde680c1fd1057f5d82a9695f7ba05b1ab_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0x6ad1512a26e6b430d9916050f6bee1fde680c1fd1057f5d82a9695f7ba05b1ab_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..d60d4d47f8704b81f6d809bc3c46e3170bf0c053 GIT binary patch literal 2956 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 literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaab2b7f33438b2f19579aba316b4e90ac2a8778370ec47d7a2c827ad8cecf1ba_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaab2b7f33438b2f19579aba316b4e90ac2a8778370ec47d7a2c827ad8cecf1ba_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..72d20907e632b1f94844ba040f8a60f808d730f8 GIT binary patch literal 2940 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 RZDugaE2{kF#r})=e*noUnT`Me literal 0 HcmV?d00001 diff --git a/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaea76277f39fc065517107b38db4e0b25ac9b839c1e7d26d8c5ae67faa16e5dc_xf.ssz_snappy b/ethereum/consensus-core/testdata/electra/light_client_sync/update_0xaea76277f39fc065517107b38db4e0b25ac9b839c1e7d26d8c5ae67faa16e5dc_xf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..bc4fe147f4fdd58493777f26f1bb1326d299bb98 GIT binary patch literal 1192 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 gH!T7yWtY5N8dTJP^)CH$7!{?t8E{u)uiGS+^ z-ppxB6X1o1^Z%P$V5cZSn0`;DzyR>VlUfBZV2=VHQp?uFX?bCh05u9Zaa7*`%Hr?m zDMhau7>ZNka>X1!mMu-T=>rkmh43{C>Fp($$B}0%c z3d2~YD&miIyN?`vLc^MjRVlv@PLrAeFbIQrkFtOP@Q{-#1u&B;0x*A>&GUe9M&^zL z6BNpm;r`&65+v*@biT5NXcqklCeC|eW9~8OQ>bkla?BzXrFWBqxJDA?8`t6bQ%K-;4t{ynChRoA?3AnD-EaE$9oJfTg=k^?+M-CQRMAAp1KNs># z_TzDdMtkkIm>duT>TtX4hgSplliiIG(>PA(6%a#BG@JWrH8ME}q z!ZW53E>o8js&e%LCg%4nKgJ(gut*Pd3WL{ zCqldrf#r&NslV=NKqs~h;M)!0Q<`JfFV%Nok05*4J*_4!+1`eCNC{7ILE7GUa8Al} zrytqR$rEc*c-b`DgY@%|je0%kO;|t4gGJqd|L+d2$dV2@>$mmkuACiVdFc|HNN`yr z-*_;_e>RZI#D+=K2cE6x>Qk`-V(>Q|>It;D336r`4Fn@{c;|TfD@DmqhAua5wmY1;-)*qYcrSbE43Q;p# zKly=ldJ8O~7n_#Sz{vtmQY4VT!S{6MeV?raN}yl~p+y~RtyZp30rV;Xfy}|4JClyWKv0?K03xIzi>gq9qkqZ?bh1m} zyo(3r|N8A@zVOg2O~1CI2ZEaXT!owvTviCXw;1x!cF;vU9v{J5ek97cW3X%O{FD}L zB7^+rfR7p9twE96`hI_`I8NhfuLiXCgxz9#RK3J?j;}soABs7H)ZNS-VR)Ill9r^U1t43yl`a3T2JQdKJZwfVHK|5~nnT z0nYJd#%h*J(l`U{LinDy8bg1YACZ+XB*xy>epDt>7PkzlOza5krkfMEZB=9|WBCr0oAGg8K|l zt3QXsG*B?l0?7eixz=M)4oZZj^r)=!J*Xl&z?`Z@)iLe~8Bc>+#lxdSn2PA(! zlxd*Ch+0mLW+Ag9@LVAuYNqi&wacsdPPR=7=+zf)fpK9#AyBS*JVM`XXa+7pzcr6p zW>F1W;JCyAh<7dPaeGzb9=-$U&daH%CXSU4L z8q*R*80(S{s92~0Ra910LlRXfZ*tW>HxVz;Yv6ZW$R`- hAcRJr)bp(-K7KkhobDaDT-$kL&YZqRGQE=%2~e$G4?F+> delta 1921 zcmcIjX*3&%7EY|E_9C@(5u$jOG`7&Ftr1l%I+meTOVykjwWOsDqC#~{n^KL4#GtfA z2x&Df8X`;+TS|Ehu}m_G+G-b}q~>+b%#WF0bNb_b=bm%V_v1Tv`R+|un^MQsX^I{I zMREWDO>+X+pEq98O?H<^40`WSJ;$mf9!}A%-(yFr9mb&ZWjAV{N`JzgzZCk*9GaAw zbAR4Uh+kv=rZH5tghv1u8kWy)XYwhjhm+d)qxFa^n7^K2bIP!x?=%1ze0ZB`;z~*L z(J%2|Z>U~q--}B^ySv>uK{%pI^p=L<7}vnQ#+@`{Q5g7TlfCj@RsE5jdA&hsfN^5? zBU5!d+W9uFvoCG5sL3vK;TXKUwmv)KnbI?8iI>~egnb5(LI?+y=)D}YLK}zAm*oYZ zUf?MyeTsDVhqesD)b;OkTWZb^Yw204;Wl8;OU-rDlbSCpuVnXP5np<|J3%*W?`M!?2xNw2yEFQe(l3CBHB!FM>31TQdzYKKf~3Y<(^Db&RY~8maq$cC;GJ7 zfeNZHUNmYNEr-UOCBFSqgz*qbHFi|6V3{S}>WdETX-R$S#^6IK0d_C6@`^a05rqKF z3@glCx{RU=hMTHfM_EhS_UZJaUTv`3H_s+4bAAuQA;LW18$NT7D~Ha;D@-iWlgg*p3_ zx5Ru?F*0vp`$$|`jI({+rNgSrxFn6#%;7v~mkQ|SRqj(gz5S49IpSyU)1?f^cXz?| zJ_y|_HEmmIt)9505f@c=B9s*@M2AoXC`Y?2T~NI#?SN6ENreDMfc>7qO}^ZqU*E$76+4otOlgL2qOJSbXn? z3ny_3UYq4q5QjC znu@Ip3xq)OoUjxJopHGG>p`1*>=-v2jJO- zUj0#mJ6*hpjLf=2huCA1E8Z`VbbyA0YUoZoKeA784df@j>l=Eu$yZinP%0Ny3Ha{{eoRMa+>3ar~2 z2cyj+FOq-F6d^0K!chpWrWJu*y0DnGs_`EyTXJE@qI%#|G3rNBcmPr*U3%^qqG%13D>9VovNanT8RU#U3njYA{ExoD#03Nc>J5Em0W4FC3W z2?znrs^&2WvrpnkDZ{pVUDpRPM q#$VX*6WlJY5by67b|a+GkTa$LjR10b_Kw=|Qg`}c6tPbJ-2VXc-)xKk diff --git a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/config.yaml b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/config.yaml index d751db09..c216fd92 100644 --- a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/config.yaml +++ b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/config.yaml @@ -15,13 +15,10 @@ PROPOSER_SCORE_BOOST: 40 REORG_HEAD_WEIGHT_THRESHOLD: 20 REORG_PARENT_WEIGHT_THRESHOLD: 160 REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2 -GOSSIP_MAX_SIZE: 10485760 +MAX_PAYLOAD_SIZE: 10485760 MAX_REQUEST_BLOCKS: 1024 EPOCHS_PER_SUBNET_SUBSCRIPTION: 256 MIN_EPOCHS_FOR_BLOCK_REQUESTS: 272 -MAX_CHUNK_SIZE: 10485760 -TTFB_TIMEOUT: 5 -RESP_TIMEOUT: 10 ATTESTATION_PROPAGATION_SLOT_RANGE: 32 MAXIMUM_GOSSIP_CLOCK_DISPARITY: 500 MESSAGE_DOMAIN_INVALID_SNAPPY: 0x00000000 @@ -49,7 +46,10 @@ MAX_REQUEST_BLOCKS_DENEB: 128 MAX_REQUEST_BLOB_SIDECARS: 768 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096 BLOB_SIDECAR_SUBNET_COUNT: 6 +MAX_BLOBS_PER_BLOCK_ELECTRA: 9 MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 64000000000 MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 128000000000 ELECTRA_FORK_VERSION: 0x05000001 ELECTRA_FORK_EPOCH: 0 +MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152 +BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: 9 diff --git a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/meta.yaml b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/meta.yaml index 78daaa27..e60ed47a 100644 --- a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/meta.yaml +++ b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/meta.yaml @@ -1,3 +1,4 @@ -{genesis_validators_root: '0x0a08c27fe4ece2483f9e581f78c66379a06f96e9c24cd1390594ff939b26f95b', -trusted_block_root: '0x742f86cc05c13171e2726dbf9d8f14740068eb92396a9ec2eb3aaf7115c4f06c', -bootstrap_fork_digest: '0x9acb230d', store_fork_digest: '0x9acb230d'} +genesis_validators_root: '0x0a08c27fe4ece2483f9e581f78c66379a06f96e9c24cd1390594ff939b26f95b' +trusted_block_root: '0x40987e44961b3a380aefe1959db633a4464a532a2189e47ceadf5facf6941a18' +bootstrap_fork_digest: '0x9acb230d' +store_fork_digest: '0x9acb230d' diff --git a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/steps.yaml b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/steps.yaml index 44a315f4..3ca3be00 100644 --- a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/steps.yaml +++ b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/steps.yaml @@ -1,9 +1,13 @@ - process_update: update_fork_digest: '0x9acb230d' - update: update_0x9b9540f46ae0eec77002ab85529da89a8bc491d29745a3769789e7bee17ee6d7_sf + update: update_0x83dbc2fa2597f8700f7722bd30594ff70b1aa182e884d1869eaad9993580fabc_sf current_slot: 33 checks: - finalized_header: {slot: 49, beacon_root: '0x742f86cc05c13171e2726dbf9d8f14740068eb92396a9ec2eb3aaf7115c4f06c', - execution_root: '0xd6eb54efcd1331bc8a486fec6697caaa1a12bdec88b2f3ef87b9231aa7e0b8db'} - optimistic_header: {slot: 49, beacon_root: '0x742f86cc05c13171e2726dbf9d8f14740068eb92396a9ec2eb3aaf7115c4f06c', - execution_root: '0xd6eb54efcd1331bc8a486fec6697caaa1a12bdec88b2f3ef87b9231aa7e0b8db'} + finalized_header: + slot: 49 + beacon_root: '0x40987e44961b3a380aefe1959db633a4464a532a2189e47ceadf5facf6941a18' + execution_root: '0xc3ec0e0be84542cccc64e14333f4377b617da271f64233aec44c945844757aeb' + optimistic_header: + slot: 49 + beacon_root: '0x40987e44961b3a380aefe1959db633a4464a532a2189e47ceadf5facf6941a18' + execution_root: '0xc3ec0e0be84542cccc64e14333f4377b617da271f64233aec44c945844757aeb' diff --git a/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/update_0x83dbc2fa2597f8700f7722bd30594ff70b1aa182e884d1869eaad9993580fabc_sf.ssz_snappy b/ethereum/consensus-core/testdata/electra/supply_sync_committee_from_past_update/update_0x83dbc2fa2597f8700f7722bd30594ff70b1aa182e884d1869eaad9993580fabc_sf.ssz_snappy new file mode 100644 index 0000000000000000000000000000000000000000..734903de73a4f3aec970fd7f3b735e6d36933664 GIT binary patch literal 2537 zcma)-cQD+G7RP^!gvAoQ#9FII5Q(_C*c(>a=v|`ah6tiYUo~2m5V4lk6D4Gk)j~p) z%OYH?D61tziMG1cZ`9|`oq2EO&Agd+=KII_Ntfdd(z<>f~cdsxkwV60)U6zSy`vFo-Q zOnRB{o!oT;rA_Syli;aTYQL`I?G;aUg=$s_Sv<_)fd@IOnPx*QSV2XQyFZKU&G8^! zUwx3X{pT!oAO8fSuK6%jyNby^G#kg%n7-3WiXSS=u^*`T}It;&#q*Z0-N)pFjd=ZJFlo%1O2noPh^qjVBFkZJ(-Y zjT_LI6|)zs>uw7kkPYiSO4^}8MnNZht?byS9ZLr@BaeP|4R*i*O3cbW7Slk_>?ZZ9 zXgOrm<<8iY{>GOa0Yi3g-uY=1vt!B1TVL`@vY`v=IaAlFNvSq#27E#RCk>L&OqOGA zw<5^QVgnknLSY*1*@>1{TG)+dVv73dh`a;{xMFVprR##9W%UFtetL~NcNI#si z)Ded%nFdoOZMp-<(pg`2B7IPcNeo=vJ*huVXR1IyI(2osQOxyQ;-%h=@YxbM_VVT5;GlxujLL$Nz#ryS5;6@TN^uf!eYC zlC8gIU0kt<38xo~9#Sj{6CX}XvSn=6YsQEf*bLTUe6nG5T!IcFqJ6BsUREPA=KYZ$ zN-C>)U8a5{&V39G=F8Mn8xjk+8Q;_0RHT|Y_3m&Tw@U^wDpUyn`aZUICg3+_mQW{O{Q40wnr7at->Qc3knF+{@ zdA8%&wGp&ERwVT6Z{?D5-=<>GI$&cTynEwzU&DiKuEg(4wD`3-rk{f} zEt(_odQ$<^~pHcoHEV6I-a?&ZJZaO0~@nll#fj>1oube?I z-yU4>yCR+&{h_`%uSo4iAXENZZSk7pP3Cxys_9_1thCzIt-pCzn1FU~f}(m`b5&E5 z+SE<5mI2Ws_=|TY(SFhAp*)jM3T0c9>U}?Cvr(*70u- z1P*8;gki0=PsMvaIaax^ALDsFMPrVskywH0awKki?u@-iIf3Y^%IdZg8`_yGKnhaT z*dHg&FJ5C*>pps?`npV2%VIg@vZT}f$BHQ`r3Nv(9anrJ*2AaGlplYW*`*#qQ*y*3 zkTh=m4S(xmGZPb+<*}m5TapysQM?oS@mN)Y8)d9VYlHpZM1A=gnIteDfqPis@j`Ez zy}Zyv_v5F<*9F!kUQ*557l@P_p8jK5lH)%y*3_d2Zeo0HzWbnXl`PcV8OG-2WW(2lpbE%bECvf13 z5+DL*WB}wKOuH9AoydxWWhCaqy(LtT&8!i%aP8O}|6GQnn@~KZTaq7O87H!c?3x*V zN!+*`NK`|&#UBzAQ<8k{yH^!OWt?pv&IgAv>a1x*aG674VpbyIf_(|?LXeC6!b9B- zTEj8B=V)0r-IV^I_?3Mh38yb&NrZ59OA06HddW9#RUkEf=oOUC<4f@M2u``B zQY~AvRkHe*O0{LZ&M3u+)8{MrQqW@blT#yU)Z&`bzJ;Jm%uZwiyXarCX<7@wssir% z$@w3etXbwt`zmbkk zyVrcG=cOJ3@h;`Qwb8OQA8_c5TFkT*4ZoQW_=VeDq5FeRulg@Qj#VB6gs9S=7yP%P z5%j?L`JQ~P-#+*3 BaseConfig { pub fn pectra_devnet() -> BaseConfig { BaseConfig { default_checkpoint: b256!( - "4fd68b5777c1369adc2ddc7faf53a8ba8482390f8e0239fbd60b1bf1a66f0c5a" + "f52e8522f1abc34fa91f4a0c6560cce6f9d557cfec083f1bc325a74c6060df84" ), rpc_port: 8545, consensus_rpc: None, chain: ChainConfig { - chain_id: 1, - genesis_time: 1729268862, - genesis_root: b256!("e3218d56569ba80b24d8c5d442b7a13c5fbf5d5e740dd986272f67b525e0e1e7"), + chain_id: 7072151312, + genesis_time: 1738603860, + genesis_root: b256!("5c074f81fbc78dc7ba47460572a4286fffe989e9921abfd50791e01e4044d274"), }, forks: Forks { genesis: Fork { epoch: 0, - fork_version: fixed_bytes!("10357071"), + fork_version: fixed_bytes!("10585557"), }, altair: Fork { epoch: 0, - fork_version: fixed_bytes!("20357071"), + fork_version: fixed_bytes!("20585557"), }, bellatrix: Fork { epoch: 0, - fork_version: fixed_bytes!("30357071"), + fork_version: fixed_bytes!("30585557"), }, capella: Fork { epoch: 0, - fork_version: fixed_bytes!("40357071"), + fork_version: fixed_bytes!("40585557"), }, deneb: Fork { epoch: 0, - fork_version: fixed_bytes!("50357071"), + fork_version: fixed_bytes!("50585557"), }, electra: Fork { - epoch: 5, - fork_version: fixed_bytes!("60357071"), + epoch: 10, + fork_version: fixed_bytes!("60585557"), }, }, max_checkpoint_age: 1_209_600, // 14 days From 04281f1bbe6b025b8341d57fc57c2b6c74f8cda0 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Mon, 3 Feb 2025 16:24:41 -0500 Subject: [PATCH 5/8] fixes after rebase| --- ethereum/consensus-core/Cargo.toml | 1 + opstack/src/config.rs | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ethereum/consensus-core/Cargo.toml b/ethereum/consensus-core/Cargo.toml index 019fcfa4..db9f0a37 100644 --- a/ethereum/consensus-core/Cargo.toml +++ b/ethereum/consensus-core/Cargo.toml @@ -10,6 +10,7 @@ alloy = { version = "0.9.1", features = [ "ssz", "rlp", "k256", + "eips", ] } alloy-rlp = "0.3.10" bls12_381.workspace = true diff --git a/opstack/src/config.rs b/opstack/src/config.rs index 5af68443..69b0760e 100644 --- a/opstack/src/config.rs +++ b/opstack/src/config.rs @@ -85,7 +85,7 @@ impl From for NetworkConfig { chain_id: 10, unsafe_signer: address!("AAAA45d9549EDA09E70937013520214382Ffc4A2"), system_config_contract: address!("229047fed2591dbec1eF1118d64F7aF3dB9EB290"), - eth_network: EthNetwork::MAINNET, + eth_network: EthNetwork::Mainnet, }, verify_unsafe_signer: false, }, @@ -95,7 +95,7 @@ impl From for NetworkConfig { chain_id: 8453, unsafe_signer: address!("Af6E19BE0F9cE7f8afd49a1824851023A8249e8a"), system_config_contract: address!("73a79Fab69143498Ed3712e519A88a918e1f4072"), - eth_network: EthNetwork::MAINNET, + eth_network: EthNetwork::Mainnet, }, verify_unsafe_signer: false, }, @@ -109,7 +109,7 @@ impl From for NetworkConfig { chain_id: 480, unsafe_signer: address!("2270d6eC8E760daA317DD978cFB98C8f144B1f3A"), system_config_contract: address!("6ab0777fD0e609CE58F939a7F70Fe41F5Aa6300A"), - eth_network: EthNetwork::MAINNET, + eth_network: EthNetwork::Mainnet, }, verify_unsafe_signer: false, }, @@ -119,7 +119,7 @@ impl From for NetworkConfig { chain_id: 7777777, unsafe_signer: address!("3Dc8Dfd0709C835cAd15a6A27e089FF4cF4C9228"), system_config_contract: address!("A3cAB0126d5F504B071b81a3e8A2BBBF17930d86"), - eth_network: EthNetwork::MAINNET, + eth_network: EthNetwork::Mainnet, }, verify_unsafe_signer: false, }, From acb06c78f585a034dbd02d6a15e66580559fd463 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Thu, 6 Feb 2025 14:19:04 -0500 Subject: [PATCH 6/8] . --- Cargo.lock | 33 ++++++++++----------------------- Cargo.toml | 2 +- 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8b5d6f0a..df3d4c7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -211,19 +211,6 @@ dependencies = [ "serde", ] -[[package]] -name = "alloy-eip7702" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more", - "k256", - "serde", -] - [[package]] name = "alloy-eip7702" version = "0.5.0" @@ -244,7 +231,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "938bc1cf2ec42579e187834efc254e76dd3fa19f526b57872713e6b95f411305" dependencies = [ "alloy-eip2930", - "alloy-eip7702 0.5.0", + "alloy-eip7702", "alloy-primitives", "alloy-rlp", "alloy-serde", @@ -5646,9 +5633,9 @@ dependencies = [ [[package]] name = "revm" -version = "18.0.0" +version = "19.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15689a3c6a8d14b647b4666f2e236ef47b5a5133cdfd423f545947986fff7013" +checksum = "1538aea4d103a8044820eede9b1254e1b5a2a2abaf3f9a67bef19f8865cf1826" dependencies = [ "auto_impl", "cfg-if", @@ -5661,9 +5648,9 @@ dependencies = [ [[package]] name = "revm-interpreter" -version = "14.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74e3f11d0fed049a4a10f79820c59113a79b38aed4ebec786a79d5c667bfeb51" +checksum = "c0f632e761f171fb2f6ace8d1552a5793e0350578d4acec3e79ade1489f4c2a6" dependencies = [ "revm-primitives", "serde", @@ -5671,9 +5658,9 @@ dependencies = [ [[package]] name = "revm-precompile" -version = "15.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e381060af24b750069a2b2d2c54bba273d84e8f5f9e8026fc9262298e26cc336" +checksum = "6542fb37650dfdbf4b9186769e49c4a8bc1901a3280b2ebf32f915b6c8850f36" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -5689,12 +5676,12 @@ dependencies = [ [[package]] name = "revm-primitives" -version = "14.0.0" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3702f132bb484f4f0d0ca4f6fbde3c82cfd745041abbedd6eda67730e1868ef0" +checksum = "48faea1ecf2c9f80d9b043bbde0db9da616431faed84c4cfa3dd7393005598e6" dependencies = [ "alloy-eip2930", - "alloy-eip7702 0.4.2", + "alloy-eip7702", "alloy-primitives", "auto_impl", "bitflags 2.6.0", diff --git a/Cargo.toml b/Cargo.toml index ca72a744..3cb66fe7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,7 +46,7 @@ alloy = { version = "0.9.1", features = [ ] } alloy-trie = "0.7.8" op-alloy-rpc-types = "0.9.0" -revm = { version = "18.0.0", default-features = false, features = [ +revm = { version = "19.4.0", default-features = false, features = [ "std", "serde", "optional_block_gas_limit", From 1e89aa937c849790da9e8b3ebdea77756ecaab8e Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Mon, 10 Feb 2025 15:13:50 -0500 Subject: [PATCH 7/8] add fork schedule for blob fee calculation post pectra and add testnet fork times --- core/src/client/mod.rs | 4 ++- core/src/client/node.rs | 26 ++++++++++++++--- core/src/execution/constants.rs | 2 -- core/src/execution/evm.rs | 27 ++++++++++++------ core/src/execution/mod.rs | 50 +++++++++++---------------------- core/src/fork_schedule.rs | 6 ++++ core/src/lib.rs | 1 + core/src/network_spec.rs | 4 ++- ethereum/src/builder.rs | 2 ++ ethereum/src/config/base.rs | 3 ++ ethereum/src/config/mod.rs | 4 +++ ethereum/src/config/networks.rs | 17 +++++++++-- ethereum/src/spec.rs | 8 ++++-- opstack/src/builder.rs | 10 +++++-- opstack/src/spec.rs | 8 ++++-- 15 files changed, 113 insertions(+), 59 deletions(-) create mode 100644 core/src/fork_schedule.rs diff --git a/core/src/client/mod.rs b/core/src/client/mod.rs index 71766a73..319ad642 100644 --- a/core/src/client/mod.rs +++ b/core/src/client/mod.rs @@ -11,6 +11,7 @@ use crate::client::node::Node; #[cfg(not(target_arch = "wasm32"))] use crate::client::rpc::Rpc; use crate::consensus::Consensus; +use crate::fork_schedule::ForkSchedule; use crate::network_spec::NetworkSpec; use crate::time::interval; use crate::types::BlockTag; @@ -29,9 +30,10 @@ impl> Client { pub fn new( execution_rpc: &str, consensus: C, + fork_schedule: ForkSchedule, #[cfg(not(target_arch = "wasm32"))] rpc_address: Option, ) -> Result { - let node = Node::new(execution_rpc, consensus)?; + let node = Node::new(execution_rpc, consensus, fork_schedule)?; let node = Arc::new(node); #[cfg(not(target_arch = "wasm32"))] diff --git a/core/src/client/node.rs b/core/src/client/node.rs index b81363e8..7f99d669 100644 --- a/core/src/client/node.rs +++ b/core/src/client/node.rs @@ -12,6 +12,7 @@ use crate::execution::evm::Evm; use crate::execution::rpc::http_rpc::HttpRpc; use crate::execution::state::State; use crate::execution::ExecutionClient; +use crate::fork_schedule::ForkSchedule; use crate::network_spec::NetworkSpec; use crate::time::{SystemTime, UNIX_EPOCH}; use crate::types::BlockTag; @@ -20,22 +21,29 @@ pub struct Node> { pub consensus: C, pub execution: Arc>>, pub history_size: usize, + fork_schedule: ForkSchedule, } impl> Node { - pub fn new(execution_rpc: &str, mut consensus: C) -> Result { + pub fn new( + execution_rpc: &str, + mut consensus: C, + fork_schedule: ForkSchedule, + ) -> Result { let block_recv = consensus.block_recv().take().unwrap(); let finalized_block_recv = consensus.finalized_block_recv().take().unwrap(); let state = State::new(block_recv, finalized_block_recv, 256, execution_rpc); let execution = Arc::new( - ExecutionClient::new(execution_rpc, state).map_err(ClientError::InternalError)?, + ExecutionClient::new(execution_rpc, state, fork_schedule.clone()) + .map_err(ClientError::InternalError)?, ); Ok(Node { consensus, execution, history_size: 64, + fork_schedule, }) } @@ -46,14 +54,24 @@ impl> Node { ) -> Result { self.check_blocktag_age(&block).await?; - let mut evm = Evm::new(self.execution.clone(), self.chain_id(), block); + let mut evm = Evm::new( + self.execution.clone(), + self.chain_id(), + self.fork_schedule.clone(), + block, + ); evm.call(tx).await.map_err(ClientError::EvmError) } pub async fn estimate_gas(&self, tx: &N::TransactionRequest) -> Result { self.check_head_age().await?; - let mut evm = Evm::new(self.execution.clone(), self.chain_id(), BlockTag::Latest); + let mut evm = Evm::new( + self.execution.clone(), + self.chain_id(), + self.fork_schedule.clone(), + BlockTag::Latest, + ); evm.estimate_gas(tx).await.map_err(ClientError::EvmError) } diff --git a/core/src/execution/constants.rs b/core/src/execution/constants.rs index 945bb096..b4769fc2 100644 --- a/core/src/execution/constants.rs +++ b/core/src/execution/constants.rs @@ -3,5 +3,3 @@ pub const PARALLEL_QUERY_BATCH_SIZE: usize = 20; // We currently limit the max number of logs to fetch, // to avoid blocking the client for too long. pub const MAX_SUPPORTED_LOGS_NUMBER: usize = 5; -pub const BLOB_BASE_FEE_UPDATE_FRACTION: u64 = 3338477; -pub const MIN_BASE_FEE_PER_BLOB_GAS: u64 = 1; diff --git a/core/src/execution/evm.rs b/core/src/execution/evm.rs index b4735864..99b1532b 100644 --- a/core/src/execution/evm.rs +++ b/core/src/execution/evm.rs @@ -15,27 +15,37 @@ use revm::{ }; use tracing::trace; -use crate::execution::{ - constants::PARALLEL_QUERY_BATCH_SIZE, - errors::{EvmError, ExecutionError}, - rpc::ExecutionRpc, - ExecutionClient, -}; use crate::network_spec::NetworkSpec; use crate::types::BlockTag; +use crate::{ + execution::{ + constants::PARALLEL_QUERY_BATCH_SIZE, + errors::{EvmError, ExecutionError}, + rpc::ExecutionRpc, + ExecutionClient, + }, + fork_schedule::ForkSchedule, +}; pub struct Evm> { execution: Arc>, chain_id: u64, tag: BlockTag, + fork_schedule: ForkSchedule, } impl> Evm { - pub fn new(execution: Arc>, chain_id: u64, tag: BlockTag) -> Self { + pub fn new( + execution: Arc>, + chain_id: u64, + fork_schedule: ForkSchedule, + tag: BlockTag, + ) -> Self { Evm { execution, chain_id, tag, + fork_schedule, } } @@ -100,7 +110,8 @@ impl> Evm { .await .ok_or(ExecutionError::BlockNotFound(tag)) .unwrap(); - env.block = N::block_env(&block); + + env.block = N::block_env(&block, &self.fork_schedule); env.cfg.chain_id = self.chain_id; env.cfg.disable_block_gas_limit = true; diff --git a/core/src/execution/mod.rs b/core/src/execution/mod.rs index 97689239..54e86035 100644 --- a/core/src/execution/mod.rs +++ b/core/src/execution/mod.rs @@ -7,18 +7,18 @@ use alloy::primitives::{keccak256, Address, B256, U256}; use alloy::rlp; use alloy::rpc::types::{BlockTransactions, Filter, FilterChanges, Log}; use alloy_trie::root::ordered_trie_root_with_encoder; -use constants::{BLOB_BASE_FEE_UPDATE_FRACTION, MIN_BASE_FEE_PER_BLOB_GAS}; use eyre::Result; use futures::future::try_join_all; -use proof::{verify_account_proof, verify_storage_proof}; -use revm::primitives::KECCAK_EMPTY; +use revm::primitives::{BlobExcessGasAndPrice, KECCAK_EMPTY}; use tracing::warn; +use crate::fork_schedule::ForkSchedule; use crate::network_spec::NetworkSpec; use crate::types::BlockTag; use self::constants::MAX_SUPPORTED_LOGS_NUMBER; use self::errors::ExecutionError; +use self::proof::{verify_account_proof, verify_storage_proof}; use self::rpc::ExecutionRpc; use self::state::{FilterType, State}; use self::types::Account; @@ -35,12 +35,17 @@ pub mod types; pub struct ExecutionClient> { pub rpc: R, state: State, + fork_schedule: ForkSchedule, } impl> ExecutionClient { - pub fn new(rpc: &str, state: State) -> Result { + pub fn new(rpc: &str, state: State, fork_schedule: ForkSchedule) -> Result { let rpc: R = ExecutionRpc::new(rpc)?; - Ok(ExecutionClient:: { rpc, state }) + Ok(ExecutionClient:: { + rpc, + state, + fork_schedule, + }) } pub async fn check_rpc(&self, chain_id: u64) -> Result<()> { @@ -121,42 +126,21 @@ impl> ExecutionClient { pub async fn blob_base_fee(&self, block: BlockTag) -> U256 { let block = self.state.get_block(block).await; - if block.is_none() { + let Some(block) = block else { warn!(target: "helios::execution", "requested block not found"); return U256::from(0); - } - let parent_hash = block.unwrap().header().parent_hash(); + }; + + let parent_hash = block.header().parent_hash(); let parent_block = self.get_block_by_hash(parent_hash, false).await; if parent_block.is_none() { warn!(target: "helios::execution", "requested parent block not foundß"); return U256::from(0); }; - let blob_base_fee = Self::calculate_base_fee_per_blob_gas( - parent_block.unwrap().header().excess_blob_gas().unwrap(), - ); - - U256::from(blob_base_fee) - } - - fn calculate_base_fee_per_blob_gas(parent_excess_blob_gas: u64) -> u64 { - Self::fake_exponential( - MIN_BASE_FEE_PER_BLOB_GAS, - parent_excess_blob_gas, - BLOB_BASE_FEE_UPDATE_FRACTION, - ) - } - //https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#helpers - fn fake_exponential(factor: u64, numerator: u64, denominator: u64) -> u64 { - let mut i = 1; - let mut output = 0; - let mut numerator_accum = factor * denominator; - while numerator_accum > 0 { - output += numerator_accum; - numerator_accum = numerator_accum * numerator / (denominator * i); - i += 1; - } - output / denominator + let excess_blob_gas = parent_block.unwrap().header().excess_blob_gas().unwrap(); + let is_prague = block.header().timestamp() >= self.fork_schedule.prague_timestamp; + U256::from(BlobExcessGasAndPrice::new(excess_blob_gas, is_prague).blob_gasprice) } pub async fn get_block_by_hash(&self, hash: B256, full_tx: bool) -> Option { diff --git a/core/src/fork_schedule.rs b/core/src/fork_schedule.rs new file mode 100644 index 00000000..60c1900b --- /dev/null +++ b/core/src/fork_schedule.rs @@ -0,0 +1,6 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Copy, Serialize, Deserialize, Default, Debug)] +pub struct ForkSchedule { + pub prague_timestamp: u64, +} diff --git a/core/src/lib.rs b/core/src/lib.rs index 1c24b63b..74533830 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -2,6 +2,7 @@ pub mod client; pub mod consensus; pub mod errors; pub mod execution; +pub mod fork_schedule; pub mod network_spec; pub mod time; pub mod types; diff --git a/core/src/network_spec.rs b/core/src/network_spec.rs index 12ce5b03..13561e4d 100644 --- a/core/src/network_spec.rs +++ b/core/src/network_spec.rs @@ -1,11 +1,13 @@ use alloy::{network::Network, rpc::types::Log}; use revm::primitives::{BlockEnv, TxEnv}; +use crate::fork_schedule::ForkSchedule; + pub trait NetworkSpec: Network { fn encode_receipt(receipt: &Self::ReceiptResponse) -> Vec; fn is_hash_valid(block: &Self::BlockResponse) -> bool; fn receipt_contains(list: &[Self::ReceiptResponse], elem: &Self::ReceiptResponse) -> bool; fn receipt_logs(receipt: &Self::ReceiptResponse) -> Vec; fn tx_env(request: &Self::TransactionRequest) -> TxEnv; - fn block_env(block: &Self::BlockResponse) -> BlockEnv; + fn block_env(block: &Self::BlockResponse, fork_schedule: &ForkSchedule) -> BlockEnv; } diff --git a/ethereum/src/builder.rs b/ethereum/src/builder.rs index 7f31ff4f..bc02c426 100644 --- a/ethereum/src/builder.rs +++ b/ethereum/src/builder.rs @@ -206,6 +206,7 @@ impl EthereumClientBuilder { data_dir: None, chain: base_config.chain, forks: base_config.forks, + execution_forks: base_config.execution_forks, max_checkpoint_age: base_config.max_checkpoint_age, fallback, load_external_fallback, @@ -226,6 +227,7 @@ impl EthereumClientBuilder { Client::>::new( &config.execution_rpc.clone(), consensus, + config.execution_forks.clone(), #[cfg(not(target_arch = "wasm32"))] socket, ) diff --git a/ethereum/src/config/base.rs b/ethereum/src/config/base.rs index f8491f48..59de0ad6 100644 --- a/ethereum/src/config/base.rs +++ b/ethereum/src/config/base.rs @@ -3,6 +3,7 @@ use std::net::{IpAddr, Ipv4Addr}; use std::path::PathBuf; use alloy::primitives::B256; +use helios_core::fork_schedule::ForkSchedule; use serde::Serialize; use helios_consensus_core::types::Forks; @@ -18,6 +19,7 @@ pub struct BaseConfig { pub default_checkpoint: B256, pub chain: ChainConfig, pub forks: Forks, + pub execution_forks: ForkSchedule, pub max_checkpoint_age: u64, pub data_dir: Option, pub load_external_fallback: bool, @@ -35,6 +37,7 @@ impl Default for BaseConfig { forks: Default::default(), max_checkpoint_age: 0, data_dir: None, + execution_forks: ForkSchedule::default(), load_external_fallback: false, strict_checkpoint_age: false, } diff --git a/ethereum/src/config/mod.rs b/ethereum/src/config/mod.rs index 6a9dcb78..dac662f4 100644 --- a/ethereum/src/config/mod.rs +++ b/ethereum/src/config/mod.rs @@ -7,6 +7,7 @@ use figment::{ providers::{Format, Serialized, Toml}, Figment, }; +use helios_core::fork_schedule::ForkSchedule; use serde::Deserialize; use helios_consensus_core::types::Forks; @@ -34,6 +35,7 @@ pub struct Config { pub data_dir: Option, pub chain: ChainConfig, pub forks: Forks, + pub execution_forks: ForkSchedule, pub max_checkpoint_age: u64, pub fallback: Option, pub load_external_fallback: bool, @@ -84,6 +86,7 @@ impl Config { default_checkpoint: self.default_checkpoint, chain: self.chain.clone(), forks: self.forks.clone(), + execution_forks: self.execution_forks, max_checkpoint_age: self.max_checkpoint_age, data_dir: self.data_dir.clone(), load_external_fallback: self.load_external_fallback, @@ -103,6 +106,7 @@ impl From for Config { default_checkpoint: base.default_checkpoint, chain: base.chain, forks: base.forks, + execution_forks: base.execution_forks, max_checkpoint_age: base.max_checkpoint_age, data_dir: base.data_dir, fallback: None, diff --git a/ethereum/src/config/networks.rs b/ethereum/src/config/networks.rs index ef308405..1dd61372 100644 --- a/ethereum/src/config/networks.rs +++ b/ethereum/src/config/networks.rs @@ -7,6 +7,7 @@ use alloy::primitives::{b256, fixed_bytes}; #[cfg(not(target_arch = "wasm32"))] use dirs::home_dir; use eyre::Result; +use helios_core::fork_schedule::ForkSchedule; use serde::{Deserialize, Serialize}; use strum::EnumIter; @@ -110,6 +111,9 @@ pub fn mainnet() -> BaseConfig { fork_version: fixed_bytes!("05000000"), }, }, + execution_forks: ForkSchedule { + prague_timestamp: u64::MAX, + }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] data_dir: Some(data_dir(Network::Mainnet)), @@ -151,10 +155,13 @@ pub fn sepolia() -> BaseConfig { fork_version: fixed_bytes!("90000073"), }, electra: Fork { - epoch: u64::MAX, + epoch: 222464, fork_version: fixed_bytes!("90000074"), }, }, + execution_forks: ForkSchedule { + prague_timestamp: 1741159776, + }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] data_dir: Some(data_dir(Network::Sepolia)), @@ -196,10 +203,13 @@ pub fn holesky() -> BaseConfig { fork_version: fixed_bytes!("05017000"), }, electra: Fork { - epoch: u64::MAX, + epoch: 115968, fork_version: fixed_bytes!("06017000"), }, }, + execution_forks: ForkSchedule { + prague_timestamp: 1740434112, + }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] data_dir: Some(data_dir(Network::Holesky)), @@ -245,6 +255,9 @@ pub fn pectra_devnet() -> BaseConfig { fork_version: fixed_bytes!("60585557"), }, }, + execution_forks: ForkSchedule { + prague_timestamp: 1738607700, + }, max_checkpoint_age: 1_209_600, // 14 days #[cfg(not(target_arch = "wasm32"))] data_dir: Some(data_dir(Network::PectraDevnet)), diff --git a/ethereum/src/spec.rs b/ethereum/src/spec.rs index 5f0b9e47..55ba1f30 100644 --- a/ethereum/src/spec.rs +++ b/ethereum/src/spec.rs @@ -9,7 +9,7 @@ use alloy::{ }; use revm::primitives::{BlobExcessGasAndPrice, BlockEnv, TxEnv}; -use helios_core::network_spec::NetworkSpec; +use helios_core::{fork_schedule::ForkSchedule, network_spec::NetworkSpec}; #[derive(Clone, Copy, Debug)] pub struct Ethereum; @@ -112,7 +112,7 @@ impl NetworkSpec for Ethereum { tx_env } - fn block_env(block: &Self::BlockResponse) -> BlockEnv { + fn block_env(block: &Self::BlockResponse, fork_schedule: &ForkSchedule) -> BlockEnv { let mut block_env = BlockEnv::default(); block_env.number = U256::from(block.header.number()); block_env.coinbase = block.header.beneficiary(); @@ -121,10 +121,12 @@ impl NetworkSpec for Ethereum { block_env.basefee = U256::from(block.header.base_fee_per_gas().unwrap_or(0_u64)); block_env.difficulty = block.header.difficulty(); block_env.prevrandao = block.header.mix_hash(); + + let is_prague = block.header.timestamp >= fork_schedule.prague_timestamp; block_env.blob_excess_gas_and_price = block .header .excess_blob_gas() - .map(|v| BlobExcessGasAndPrice::new(v.into())); + .map(|v| BlobExcessGasAndPrice::new(v.into(), is_prague)); block_env } diff --git a/opstack/src/builder.rs b/opstack/src/builder.rs index b686649a..b1223b16 100644 --- a/opstack/src/builder.rs +++ b/opstack/src/builder.rs @@ -1,7 +1,7 @@ -use std::net::SocketAddr; - use eyre::Result; +use helios_core::fork_schedule::ForkSchedule; use reqwest::{IntoUrl, Url}; +use std::net::SocketAddr; use crate::{ config::Network, @@ -81,10 +81,16 @@ impl OpStackClientBuilder { verify_unsafe_signer: self.verify_unsafe_singer.unwrap_or_default(), } }; + + let fork_schedule = ForkSchedule { + prague_timestamp: u64::MAX, + }; + let consensus = ConsensusClient::new(&config); OpStackClient::new( &config.execution_rpc.to_string(), consensus, + fork_schedule, #[cfg(not(target_arch = "wasm32"))] config.rpc_socket, ) diff --git a/opstack/src/spec.rs b/opstack/src/spec.rs index cdbac40b..72850c6a 100644 --- a/opstack/src/spec.rs +++ b/opstack/src/spec.rs @@ -7,7 +7,7 @@ use alloy::{ rpc::types::{AccessList, Log, TransactionRequest}, }; -use helios_core::network_spec::NetworkSpec; +use helios_core::{fork_schedule::ForkSchedule, network_spec::NetworkSpec}; use op_alloy_consensus::{ OpDepositReceipt, OpDepositReceiptWithBloom, OpReceiptEnvelope, OpTxEnvelope, OpTxType, OpTypedTransaction, @@ -151,7 +151,7 @@ impl NetworkSpec for OpStack { tx_env } - fn block_env(block: &Self::BlockResponse) -> BlockEnv { + fn block_env(block: &Self::BlockResponse, fork_schedule: &ForkSchedule) -> BlockEnv { let mut block_env = BlockEnv::default(); block_env.number = U256::from(block.header.number()); block_env.coinbase = block.header.beneficiary(); @@ -160,10 +160,12 @@ impl NetworkSpec for OpStack { block_env.basefee = U256::from(block.header.base_fee_per_gas().unwrap_or(0_u64)); block_env.difficulty = block.header.difficulty(); block_env.prevrandao = block.header.mix_hash(); + + let is_prague = block.header.timestamp >= fork_schedule.prague_timestamp; block_env.blob_excess_gas_and_price = block .header .excess_blob_gas() - .map(|v| BlobExcessGasAndPrice::new(v.into())); + .map(|v| BlobExcessGasAndPrice::new(v.into(), is_prague)); block_env } From a23adcfd1d48cd8edd1e01ea60d9329ea3f724e0 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Mon, 10 Feb 2025 16:33:48 -0500 Subject: [PATCH 8/8] remove not needed clones --- core/src/client/node.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/client/node.rs b/core/src/client/node.rs index 7f99d669..4e2b38b3 100644 --- a/core/src/client/node.rs +++ b/core/src/client/node.rs @@ -35,7 +35,7 @@ impl> Node { let state = State::new(block_recv, finalized_block_recv, 256, execution_rpc); let execution = Arc::new( - ExecutionClient::new(execution_rpc, state, fork_schedule.clone()) + ExecutionClient::new(execution_rpc, state, fork_schedule) .map_err(ClientError::InternalError)?, ); @@ -57,7 +57,7 @@ impl> Node { let mut evm = Evm::new( self.execution.clone(), self.chain_id(), - self.fork_schedule.clone(), + self.fork_schedule, block, ); evm.call(tx).await.map_err(ClientError::EvmError) @@ -69,7 +69,7 @@ impl> Node { let mut evm = Evm::new( self.execution.clone(), self.chain_id(), - self.fork_schedule.clone(), + self.fork_schedule, BlockTag::Latest, );