From 313e2d946cd98f75c34268bb8527d11841443be0 Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Thu, 30 Apr 2026 16:22:17 +0200 Subject: [PATCH] Fmt --- .../src/block_production/gloas.rs | 42 +++++++------- .../src/inclusion_list_verification.rs | 4 ++ .../gossip_verified_bid.rs | 5 +- .../src/payload_bid_verification/tests.rs | 56 ++++++++++--------- .../payload_envelope_verification/import.rs | 48 ++++++++-------- .../execution_layer/src/engine_api/http.rs | 4 +- beacon_node/execution_layer/src/lib.rs | 6 +- .../lighthouse_network/src/types/pubsub.rs | 9 +-- common/eth2/src/types.rs | 3 +- consensus/types/src/state/beacon_state.rs | 4 +- .../types/src/state/inclusion_list_cache.rs | 8 ++- 11 files changed, 97 insertions(+), 92 deletions(-) diff --git a/beacon_node/beacon_chain/src/block_production/gloas.rs b/beacon_node/beacon_chain/src/block_production/gloas.rs index 3449e80980..929b51142b 100644 --- a/beacon_node/beacon_chain/src/block_production/gloas.rs +++ b/beacon_node/beacon_chain/src/block_production/gloas.rs @@ -33,8 +33,8 @@ use types::{ ExecutionPayloadEnvelope, ExecutionPayloadGloas, ExecutionRequests, FullPayload, Graffiti, Hash256, PayloadAttestation, ProposerSlashing, RelativeEpoch, SignedBeaconBlock, SignedBlsToExecutionChange, SignedExecutionPayloadBid, SignedExecutionPayloadBidGloas, - SignedExecutionPayloadBidHeze, SignedExecutionPayloadEnvelope, SignedVoluntaryExit, - Slot, SyncAggregate, Withdrawal, Withdrawals, + SignedExecutionPayloadBidHeze, SignedExecutionPayloadEnvelope, SignedVoluntaryExit, Slot, + SyncAggregate, Withdrawal, Withdrawals, }; use crate::pending_payload_envelopes::PendingEnvelopeData; @@ -607,26 +607,24 @@ impl BeaconChain { .unwrap_or_default(); let heze_bid = match signed_execution_payload_bid { SignedExecutionPayloadBid::Heze(bid) => bid, - SignedExecutionPayloadBid::Gloas(gloas_bid) => { - SignedExecutionPayloadBidHeze { - message: ExecutionPayloadBidHeze { - parent_block_hash: gloas_bid.message.parent_block_hash, - parent_block_root: gloas_bid.message.parent_block_root, - block_hash: gloas_bid.message.block_hash, - prev_randao: gloas_bid.message.prev_randao, - fee_recipient: gloas_bid.message.fee_recipient, - gas_limit: gloas_bid.message.gas_limit, - builder_index: gloas_bid.message.builder_index, - slot: gloas_bid.message.slot, - value: gloas_bid.message.value, - execution_payment: gloas_bid.message.execution_payment, - blob_kzg_commitments: gloas_bid.message.blob_kzg_commitments, - execution_requests_root: gloas_bid.message.execution_requests_root, - inclusion_list_bits, - }, - signature: gloas_bid.signature, - } - } + SignedExecutionPayloadBid::Gloas(gloas_bid) => SignedExecutionPayloadBidHeze { + message: ExecutionPayloadBidHeze { + parent_block_hash: gloas_bid.message.parent_block_hash, + parent_block_root: gloas_bid.message.parent_block_root, + block_hash: gloas_bid.message.block_hash, + prev_randao: gloas_bid.message.prev_randao, + fee_recipient: gloas_bid.message.fee_recipient, + gas_limit: gloas_bid.message.gas_limit, + builder_index: gloas_bid.message.builder_index, + slot: gloas_bid.message.slot, + value: gloas_bid.message.value, + execution_payment: gloas_bid.message.execution_payment, + blob_kzg_commitments: gloas_bid.message.blob_kzg_commitments, + execution_requests_root: gloas_bid.message.execution_requests_root, + inclusion_list_bits, + }, + signature: gloas_bid.signature, + }, }; BeaconBlock::Heze(BeaconBlockHeze { slot, diff --git a/beacon_node/beacon_chain/src/inclusion_list_verification.rs b/beacon_node/beacon_chain/src/inclusion_list_verification.rs index 13164102dc..18d68d7ea7 100644 --- a/beacon_node/beacon_chain/src/inclusion_list_verification.rs +++ b/beacon_node/beacon_chain/src/inclusion_list_verification.rs @@ -57,6 +57,10 @@ impl GossipVerifiedInclusionList { return Err(GossipInclusionListError::TooManyTransactions); } + // TODO(focil): Spec says message.slot must equal current_slot with + // MAXIMUM_GOSSIP_CLOCK_DISPARITY allowance. We currently also accept current_slot - 1 + // and add an attestation-deadline check that is not in the spec. + // See: https://github.com/ethereum/consensus-specs/blob/master/specs/heze/p2p-interface.md#inclusion_list if message_slot != current_slot && message_slot != current_slot - 1 { return Err(GossipInclusionListError::InvalidSlot { message_slot, diff --git a/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs b/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs index 0e66cc98df..183177f6d2 100644 --- a/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs +++ b/beacon_node/beacon_chain/src/payload_bid_verification/gossip_verified_bid.rs @@ -251,9 +251,8 @@ mod tests { use kzg::KzgCommitment; use ssz_types::VariableList; use types::{ - Address, BeaconState, ChainSpec, EthSpec, ExecutionPayloadBidGloas, - ExecutionPayloadBidRef, MinimalEthSpec, ProposerPreferences, SignedProposerPreferences, - Slot, + Address, BeaconState, ChainSpec, EthSpec, ExecutionPayloadBidGloas, ExecutionPayloadBidRef, + MinimalEthSpec, ProposerPreferences, SignedProposerPreferences, Slot, }; use super::verify_bid_consistency; diff --git a/beacon_node/beacon_chain/src/payload_bid_verification/tests.rs b/beacon_node/beacon_chain/src/payload_bid_verification/tests.rs index ccc6f0cf7c..bbd62b2a64 100644 --- a/beacon_node/beacon_chain/src/payload_bid_verification/tests.rs +++ b/beacon_node/beacon_chain/src/payload_bid_verification/tests.rs @@ -166,10 +166,12 @@ impl TestContext { ); let message = bid.signing_root(domain); let signature = self.keypairs[bid.builder_index as usize].sk.sign(message); - Arc::new(SignedExecutionPayloadBid::Gloas(SignedExecutionPayloadBidGloas { - message: bid, - signature, - })) + Arc::new(SignedExecutionPayloadBid::Gloas( + SignedExecutionPayloadBidGloas { + message: bid, + signature, + }, + )) } fn gossip_ctx(&self) -> GossipVerificationContext<'_, T> { @@ -423,16 +425,18 @@ fn execution_payment_nonzero() { let slot = Slot::new(0); seed_preferences(&ctx, slot, Address::ZERO, 30_000_000); - let bid = Arc::new(SignedExecutionPayloadBid::Gloas(SignedExecutionPayloadBidGloas { - message: ExecutionPayloadBidGloas { - slot, - gas_limit: 30_000_000, - execution_payment: 42, - parent_block_root: ctx.genesis_block_root, - ..ExecutionPayloadBidGloas::default() + let bid = Arc::new(SignedExecutionPayloadBid::Gloas( + SignedExecutionPayloadBidGloas { + message: ExecutionPayloadBidGloas { + slot, + gas_limit: 30_000_000, + execution_payment: 42, + parent_block_root: ctx.genesis_block_root, + ..ExecutionPayloadBidGloas::default() + }, + signature: Signature::empty(), }, - signature: Signature::empty(), - })); + )); let result = GossipVerifiedPayloadBid::new(bid, &gossip); assert!(matches!( result, @@ -579,19 +583,21 @@ fn invalid_blob_kzg_commitments() { .map(|_| KzgCommitment::empty_for_testing()) .collect(); - let bid = Arc::new(SignedExecutionPayloadBid::Gloas(SignedExecutionPayloadBidGloas { - message: ExecutionPayloadBidGloas { - slot, - builder_index: 0, - fee_recipient: Address::ZERO, - gas_limit: 30_000_000, - value: 0, - parent_block_root: ctx.genesis_block_root, - blob_kzg_commitments: VariableList::new(commitments).unwrap(), - ..ExecutionPayloadBidGloas::default() + let bid = Arc::new(SignedExecutionPayloadBid::Gloas( + SignedExecutionPayloadBidGloas { + message: ExecutionPayloadBidGloas { + slot, + builder_index: 0, + fee_recipient: Address::ZERO, + gas_limit: 30_000_000, + value: 0, + parent_block_root: ctx.genesis_block_root, + blob_kzg_commitments: VariableList::new(commitments).unwrap(), + ..ExecutionPayloadBidGloas::default() + }, + signature: Signature::empty(), }, - signature: Signature::empty(), - })); + )); let result = GossipVerifiedPayloadBid::new(bid, &gossip); assert!(matches!( result, diff --git a/beacon_node/beacon_chain/src/payload_envelope_verification/import.rs b/beacon_node/beacon_chain/src/payload_envelope_verification/import.rs index 2f77319a1e..a7926ba998 100644 --- a/beacon_node/beacon_chain/src/payload_envelope_verification/import.rs +++ b/beacon_node/beacon_chain/src/payload_envelope_verification/import.rs @@ -102,33 +102,33 @@ impl BeaconChain { .spec .is_focil_enabled_for_epoch(block_slot.epoch(T::EthSpec::slots_per_epoch())) { - let payload_block_hash = envelope.envelope.message().payload.block_hash; - let il_slot = block_slot.saturating_sub(1_u64); - let il_txs = chain_ref - .inclusion_list_cache - .read() - .get_inclusion_list_transactions(il_slot, true) - .unwrap_or_default() - .into_iter() - .map(|tx| tx.to_vec()) - .collect::>>(); + let payload_block_hash = envelope.envelope.message().payload.block_hash; + let il_slot = block_slot.saturating_sub(1_u64); + let il_txs = chain_ref + .inclusion_list_cache + .read() + .get_inclusion_list_transactions(il_slot, true) + .unwrap_or_default() + .into_iter() + .map(|tx| tx.to_vec()) + .collect::>>(); - if let Some(execution_layer) = chain_ref.execution_layer.as_ref() { - let satisfied = execution_layer - .is_inclusion_list_satisfied(payload_block_hash, il_txs) - .await - .unwrap_or(false); + if let Some(execution_layer) = chain_ref.execution_layer.as_ref() { + let satisfied = execution_layer + .is_inclusion_list_satisfied(payload_block_hash, il_txs) + .await + .unwrap_or(false); - if let Err(e) = chain_ref - .record_payload_inclusion_list_satisfaction(block_root, satisfied) - .await - { - warn!( - error = ?e, - "Failed to record IL satisfaction" - ); - } + if let Err(e) = chain_ref + .record_payload_inclusion_list_satisfaction(block_root, satisfied) + .await + { + warn!( + error = ?e, + "Failed to record IL satisfaction" + ); } + } } match executed_envelope { diff --git a/beacon_node/execution_layer/src/engine_api/http.rs b/beacon_node/execution_layer/src/engine_api/http.rs index 58d95e80ff..379b4d1ca9 100644 --- a/beacon_node/execution_layer/src/engine_api/http.rs +++ b/beacon_node/execution_layer/src/engine_api/http.rs @@ -756,9 +756,7 @@ impl HttpJsonRpc { pub async fn update_payload_with_inclusion_list(&self) {} - pub async fn get_inclusion_list( - &self, - ) -> Result>, Error> { + pub async fn get_inclusion_list(&self) -> Result>, Error> { let params = json!([]); self.rpc_request( diff --git a/beacon_node/execution_layer/src/lib.rs b/beacon_node/execution_layer/src/lib.rs index 50f9f3d700..d192bd2e01 100644 --- a/beacon_node/execution_layer/src/lib.rs +++ b/beacon_node/execution_layer/src/lib.rs @@ -2008,11 +2008,7 @@ impl ExecutionLayer { pub async fn get_inclusion_list(&self) -> Result, Error> { debug!("Requesting inclusion list from EL"); - let raw_transactions = self - .engine() - .api - .get_inclusion_list::() - .await?; + let raw_transactions = self.engine().api.get_inclusion_list::().await?; let mut transactions = vec![]; diff --git a/beacon_node/lighthouse_network/src/types/pubsub.rs b/beacon_node/lighthouse_network/src/types/pubsub.rs index 257b16de96..79c75d233a 100644 --- a/beacon_node/lighthouse_network/src/types/pubsub.rs +++ b/beacon_node/lighthouse_network/src/types/pubsub.rs @@ -16,9 +16,9 @@ use types::{ SignedBeaconBlockCapella, SignedBeaconBlockDeneb, SignedBeaconBlockElectra, SignedBeaconBlockFulu, SignedBeaconBlockGloas, SignedBeaconBlockHeze, SignedBlsToExecutionChange, SignedContributionAndProof, SignedExecutionPayloadBid, - SignedExecutionPayloadBidGloas, SignedExecutionPayloadBidHeze, - SignedExecutionPayloadEnvelope, SignedInclusionList, SignedProposerPreferences, - SignedVoluntaryExit, SingleAttestation, SubnetId, SyncCommitteeMessage, SyncSubnetId, + SignedExecutionPayloadBidGloas, SignedExecutionPayloadBidHeze, SignedExecutionPayloadEnvelope, + SignedInclusionList, SignedProposerPreferences, SignedVoluntaryExit, SingleAttestation, + SubnetId, SyncCommitteeMessage, SyncSubnetId, }; #[derive(Debug, Clone, PartialEq)] @@ -616,7 +616,8 @@ impl std::fmt::Display for PubsubMessage { write!( f, "Execution payload bid: slot: {:?} value: {:?}", - data.message().slot(), data.message().value() + data.message().slot(), + data.message().value() ) } PubsubMessage::ProposerPreferences(data) => { diff --git a/common/eth2/src/types.rs b/common/eth2/src/types.rs index a588788eab..0e5ca32b95 100644 --- a/common/eth2/src/types.rs +++ b/common/eth2/src/types.rs @@ -1179,8 +1179,7 @@ pub struct SseExtendedPayloadAttributesGeneric { pub type SseExtendedPayloadAttributes = SseExtendedPayloadAttributesGeneric; pub type VersionedSsePayloadAttributes = ForkVersionedResponse; -pub type VersionedSseExecutionPayloadBid = - ForkVersionedResponse>; +pub type VersionedSseExecutionPayloadBid = ForkVersionedResponse>; pub type VersionedSsePayloadAttestationMessage = ForkVersionedResponse; impl<'de> ContextDeserialize<'de, ForkName> for SsePayloadAttributes { diff --git a/consensus/types/src/state/beacon_state.rs b/consensus/types/src/state/beacon_state.rs index 866be498b2..c7b97ab787 100644 --- a/consensus/types/src/state/beacon_state.rs +++ b/consensus/types/src/state/beacon_state.rs @@ -1025,9 +1025,7 @@ impl BeaconState { .map(|i| indices[i % indices.len()] as u64) .collect(); - Ok(InclusionListCommittee::::from( - il_committee.try_into()?, - )) + Ok(InclusionListCommittee::::from(il_committee.try_into()?)) } /// Returns the block root which decided the proposer shuffling for the epoch passed in parameter. This root diff --git a/consensus/types/src/state/inclusion_list_cache.rs b/consensus/types/src/state/inclusion_list_cache.rs index 42e50c838f..f09e674c41 100644 --- a/consensus/types/src/state/inclusion_list_cache.rs +++ b/consensus/types/src/state/inclusion_list_cache.rs @@ -5,7 +5,10 @@ use ssz_types::BitVector; use std::collections::{HashMap, HashSet}; use tracing::info; -/// Map from slot to inclusion lists +/// Map from slot to inclusion lists. +// TODO(focil): Spec keys InclusionListStore by (slot, committee_root), not just slot. +// A reorg that changes committee membership for the same slot would conflate ILs. +// See: https://github.com/ethereum/consensus-specs/blob/master/specs/heze/inclusion-list.md#inclusionliststore #[derive(Debug, Default, Clone, PartialEq)] pub struct InclusionListCache { inner_map: HashMap>, @@ -18,6 +21,9 @@ struct Inner { pub inclusion_lists: HashSet>, pub inclusion_lists_seen: HashSet, pub inclusion_list_equivocators: HashSet, + // TODO(focil): Spec tracks timeliness per IL root, not per validator index. + // Functionally equivalent for non-equivocating validators. + // See: https://github.com/ethereum/consensus-specs/blob/master/specs/heze/inclusion-list.md#inclusionliststore pub inclusion_list_timeliness: HashMap, pub inclusion_list_transactions: HashSet>, pub timely_transactions: HashSet>,