From a6bdc474db0147c4194123bbd71dcfb562b36ae4 Mon Sep 17 00:00:00 2001 From: Lion - dapplion <35266934+dapplion@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:26:43 -0300 Subject: [PATCH 01/20] Log range sync download errors (#6991) Currently range sync download log errors just say `error: rpc_error` which isn't helpful. The actual error is suppressed unless logged somewhere else. Log the actual error that caused the batch download to fail as part of the log that states that the batch download failed. --- .../network/src/sync/backfill_sync/mod.rs | 6 ++--- beacon_node/network/src/sync/manager.rs | 22 ++++++++++++------- .../network/src/sync/range_sync/chain.rs | 6 +++-- .../network/src/sync/range_sync/range.rs | 5 +++-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/beacon_node/network/src/sync/backfill_sync/mod.rs b/beacon_node/network/src/sync/backfill_sync/mod.rs index cd3f0dcbeb..509caf7316 100644 --- a/beacon_node/network/src/sync/backfill_sync/mod.rs +++ b/beacon_node/network/src/sync/backfill_sync/mod.rs @@ -10,8 +10,7 @@ use crate::network_beacon_processor::ChainSegmentProcessId; use crate::sync::manager::BatchProcessResult; -use crate::sync::network_context::RangeRequestId; -use crate::sync::network_context::SyncNetworkContext; +use crate::sync::network_context::{RangeRequestId, RpcResponseError, SyncNetworkContext}; use crate::sync::range_sync::{ BatchConfig, BatchId, BatchInfo, BatchOperationOutcome, BatchProcessingResult, BatchState, }; @@ -375,6 +374,7 @@ impl BackFillSync { batch_id: BatchId, peer_id: &PeerId, request_id: Id, + err: RpcResponseError, ) -> Result<(), BackFillError> { if let Some(batch) = self.batches.get_mut(&batch_id) { // A batch could be retried without the peer failing the request (disconnecting/ @@ -385,7 +385,7 @@ impl BackFillSync { if !batch.is_expecting_block(&request_id) { return Ok(()); } - debug!(batch_epoch = %batch_id, error = "rpc_error", "Batch failed"); + debug!(batch_epoch = %batch_id, error = ?err, "Batch download failed"); if let Some(active_requests) = self.active_requests.get_mut(peer_id) { active_requests.remove(&batch_id); } diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 671fa1e3b4..1e6d21d68a 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -1288,7 +1288,7 @@ impl SyncManager { } } } - Err(_) => match range_request_id.requester { + Err(e) => match range_request_id.requester { RangeRequestId::RangeSync { chain_id, batch_id } => { self.range_sync.inject_error( &mut self.network, @@ -1296,16 +1296,22 @@ impl SyncManager { batch_id, chain_id, range_request_id.id, + e, ); self.update_sync_state(); } - RangeRequestId::BackfillSync { batch_id } => match self - .backfill_sync - .inject_error(&mut self.network, batch_id, &peer_id, range_request_id.id) - { - Ok(_) => {} - Err(_) => self.update_sync_state(), - }, + RangeRequestId::BackfillSync { batch_id } => { + match self.backfill_sync.inject_error( + &mut self.network, + batch_id, + &peer_id, + range_request_id.id, + e, + ) { + Ok(_) => {} + Err(_) => self.update_sync_state(), + } + } }, } } diff --git a/beacon_node/network/src/sync/range_sync/chain.rs b/beacon_node/network/src/sync/range_sync/chain.rs index 70c7b6f98f..24045e901b 100644 --- a/beacon_node/network/src/sync/range_sync/chain.rs +++ b/beacon_node/network/src/sync/range_sync/chain.rs @@ -2,7 +2,7 @@ use super::batch::{BatchInfo, BatchProcessingResult, BatchState}; use super::RangeSyncType; use crate::metrics; use crate::network_beacon_processor::ChainSegmentProcessId; -use crate::sync::network_context::RangeRequestId; +use crate::sync::network_context::{RangeRequestId, RpcResponseError}; use crate::sync::{network_context::SyncNetworkContext, BatchOperationOutcome, BatchProcessResult}; use beacon_chain::block_verification_types::RpcBlock; use beacon_chain::BeaconChainTypes; @@ -879,6 +879,7 @@ impl SyncingChain { batch_id: BatchId, peer_id: &PeerId, request_id: Id, + err: RpcResponseError, ) -> ProcessingResult { let batch_state = self.visualize_batch_state(); if let Some(batch) = self.batches.get_mut(&batch_id) { @@ -901,9 +902,10 @@ impl SyncingChain { debug!( batch_epoch = %batch_id, batch_state = ?batch.state(), + error = ?err, %peer_id, %request_id, - "Batch failed. RPC Error" + "Batch download error" ); if let Some(active_requests) = self.peers.get_mut(peer_id) { active_requests.remove(&batch_id); diff --git a/beacon_node/network/src/sync/range_sync/range.rs b/beacon_node/network/src/sync/range_sync/range.rs index e4a20f6349..ab9a88e4ac 100644 --- a/beacon_node/network/src/sync/range_sync/range.rs +++ b/beacon_node/network/src/sync/range_sync/range.rs @@ -44,7 +44,7 @@ use super::chain_collection::{ChainCollection, SyncChainStatus}; use super::sync_type::RangeSyncType; use crate::metrics; use crate::status::ToStatusMessage; -use crate::sync::network_context::SyncNetworkContext; +use crate::sync::network_context::{RpcResponseError, SyncNetworkContext}; use crate::sync::BatchProcessResult; use beacon_chain::block_verification_types::RpcBlock; use beacon_chain::{BeaconChain, BeaconChainTypes}; @@ -348,10 +348,11 @@ where batch_id: BatchId, chain_id: ChainId, request_id: Id, + err: RpcResponseError, ) { // check that this request is pending match self.chains.call_by_id(chain_id, |chain| { - chain.inject_error(network, batch_id, &peer_id, request_id) + chain.inject_error(network, batch_id, &peer_id, request_id, err) }) { Ok((removed_chain, sync_type)) => { if let Some((removed_chain, remove_reason)) = removed_chain { From 574b204bdb39fbfd7939c901a595647794b89274 Mon Sep 17 00:00:00 2001 From: Daniel Knopik <107140945+dknopik@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:44:48 +0100 Subject: [PATCH 02/20] decouple `eth2` from `store` and `lighthouse_network` (#6680) - #6452 (partially) Remove dependencies on `store` and `lighthouse_network` from `eth2`. This was achieved as follows: - depend on `enr` and `multiaddr` directly instead of using `lighthouse_network`'s reexports. - make `lighthouse_network` responsible for converting between API and internal types. - in two cases, remove complex internal types and use the generic `serde_json::Value` instead - this is not ideal, but should be fine for now, as this affects two internal non-spec endpoints which are meant for debugging, unstable, and subject to change without notice anyway. Inspired by #6679. The alternative is to move all relevant types to `eth2` or `types` instead - what do you think? --- Cargo.lock | 9 +- .../beacon_chain/src/attestation_rewards.rs | 6 +- .../beacon_chain/src/beacon_block_reward.rs | 2 +- .../src/sync_committee_rewards.rs | 2 +- beacon_node/beacon_chain/tests/rewards.rs | 4 +- beacon_node/execution_layer/Cargo.toml | 1 - beacon_node/http_api/Cargo.toml | 1 - beacon_node/http_api/src/database.rs | 12 +- beacon_node/http_api/src/lib.rs | 38 +++--- beacon_node/http_api/src/peer.rs | 13 ++ .../http_api/src/standard_block_rewards.rs | 2 +- .../http_api/src/sync_committee_rewards.rs | 3 +- beacon_node/http_api/tests/tests.rs | 15 --- beacon_node/lighthouse_network/Cargo.toml | 1 + .../src/peer_manager/peerdb/peer_info.rs | 23 +++- .../lighthouse_network/src/types/mod.rs | 3 +- common/eth2/Cargo.toml | 6 +- common/eth2/src/lib.rs | 40 +++---- common/eth2/src/lighthouse.rs | 47 +------- .../src/lighthouse/attestation_rewards.rs | 55 --------- .../src/lighthouse/standard_block_rewards.rs | 26 ---- .../src/lighthouse/sync_committee_rewards.rs | 13 -- .../eth2/src/lighthouse}/sync_state.rs | 0 common/eth2/src/types.rs | 112 ++++++++++++++---- common/warp_utils/Cargo.toml | 1 - testing/validator_test_rig/Cargo.toml | 1 - 26 files changed, 190 insertions(+), 246 deletions(-) create mode 100644 beacon_node/http_api/src/peer.rs delete mode 100644 common/eth2/src/lighthouse/attestation_rewards.rs delete mode 100644 common/eth2/src/lighthouse/standard_block_rewards.rs delete mode 100644 common/eth2/src/lighthouse/sync_committee_rewards.rs rename {beacon_node/lighthouse_network/src/types => common/eth2/src/lighthouse}/sync_state.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index d559c2f1fe..2bbbb5e864 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2518,14 +2518,16 @@ version = "0.1.0" dependencies = [ "derivative", "either", + "enr", "eth2_keystore", "ethereum_serde_utils", "ethereum_ssz", "ethereum_ssz_derive", "futures", "futures-util", - "lighthouse_network", + "libp2p-identity", "mediatype", + "multiaddr", "pretty_reqwest_error", "proto_array", "reqwest", @@ -2535,7 +2537,6 @@ dependencies = [ "serde_json", "slashing_protection", "ssz_types", - "store", "tokio", "types", "zeroize", @@ -2980,7 +2981,6 @@ dependencies = [ "builder_client", "bytes", "eth2", - "eth2_network_config", "ethereum_serde_utils", "ethereum_ssz", "ethers-core", @@ -5309,6 +5309,7 @@ dependencies = [ "dirs", "discv5", "either", + "eth2", "ethereum_ssz", "ethereum_ssz_derive", "fnv", @@ -9486,7 +9487,6 @@ name = "validator_test_rig" version = "0.1.0" dependencies = [ "eth2", - "logging", "mockito", "regex", "sensitive_url", @@ -9583,7 +9583,6 @@ dependencies = [ "bytes", "eth2", "headers", - "metrics", "safe_arith", "serde", "serde_array_query", diff --git a/beacon_node/beacon_chain/src/attestation_rewards.rs b/beacon_node/beacon_chain/src/attestation_rewards.rs index 97fe8dccd4..c235143336 100644 --- a/beacon_node/beacon_chain/src/attestation_rewards.rs +++ b/beacon_node/beacon_chain/src/attestation_rewards.rs @@ -1,7 +1,7 @@ use crate::{BeaconChain, BeaconChainError, BeaconChainTypes}; -use eth2::lighthouse::attestation_rewards::{IdealAttestationRewards, TotalAttestationRewards}; -use eth2::lighthouse::StandardAttestationRewards; -use eth2::types::ValidatorId; +use eth2::types::{ + IdealAttestationRewards, StandardAttestationRewards, TotalAttestationRewards, ValidatorId, +}; use safe_arith::SafeArith; use serde_utils::quoted_u64::Quoted; use state_processing::common::base::{self, SqrtTotalActiveBalance}; diff --git a/beacon_node/beacon_chain/src/beacon_block_reward.rs b/beacon_node/beacon_chain/src/beacon_block_reward.rs index 591102126f..8808a3f121 100644 --- a/beacon_node/beacon_chain/src/beacon_block_reward.rs +++ b/beacon_node/beacon_chain/src/beacon_block_reward.rs @@ -1,6 +1,6 @@ use crate::{BeaconChain, BeaconChainError, BeaconChainTypes, StateSkipConfig}; use attesting_indices_base::get_attesting_indices; -use eth2::lighthouse::StandardBlockReward; +use eth2::types::StandardBlockReward; use safe_arith::SafeArith; use state_processing::common::attesting_indices_base; use state_processing::{ diff --git a/beacon_node/beacon_chain/src/sync_committee_rewards.rs b/beacon_node/beacon_chain/src/sync_committee_rewards.rs index e3ff5f4ab2..cf4cf1fff2 100644 --- a/beacon_node/beacon_chain/src/sync_committee_rewards.rs +++ b/beacon_node/beacon_chain/src/sync_committee_rewards.rs @@ -1,6 +1,6 @@ use crate::{BeaconChain, BeaconChainError, BeaconChainTypes}; -use eth2::lighthouse::SyncCommitteeReward; +use eth2::types::SyncCommitteeReward; use safe_arith::SafeArith; use state_processing::per_block_processing::altair::sync_committee::compute_sync_aggregate_rewards; use std::collections::HashMap; diff --git a/beacon_node/beacon_chain/tests/rewards.rs b/beacon_node/beacon_chain/tests/rewards.rs index 06e0cf890e..b75b06caff 100644 --- a/beacon_node/beacon_chain/tests/rewards.rs +++ b/beacon_node/beacon_chain/tests/rewards.rs @@ -9,9 +9,7 @@ use beacon_chain::{ types::{Epoch, EthSpec, Keypair, MinimalEthSpec}, BlockError, ChainConfig, StateSkipConfig, WhenSlotSkipped, }; -use eth2::lighthouse::attestation_rewards::TotalAttestationRewards; -use eth2::lighthouse::StandardAttestationRewards; -use eth2::types::ValidatorId; +use eth2::types::{StandardAttestationRewards, TotalAttestationRewards, ValidatorId}; use state_processing::{BlockReplayError, BlockReplayer}; use std::array::IntoIter; use std::collections::HashMap; diff --git a/beacon_node/execution_layer/Cargo.toml b/beacon_node/execution_layer/Cargo.toml index 580eac3c88..f56159c7b5 100644 --- a/beacon_node/execution_layer/Cargo.toml +++ b/beacon_node/execution_layer/Cargo.toml @@ -12,7 +12,6 @@ arc-swap = "1.6.0" builder_client = { path = "../builder_client" } bytes = { workspace = true } eth2 = { workspace = true } -eth2_network_config = { workspace = true } ethereum_serde_utils = { workspace = true } ethereum_ssz = { workspace = true } ethers-core = { workspace = true } diff --git a/beacon_node/http_api/Cargo.toml b/beacon_node/http_api/Cargo.toml index a4352f1c3d..b13517f27e 100644 --- a/beacon_node/http_api/Cargo.toml +++ b/beacon_node/http_api/Cargo.toml @@ -50,7 +50,6 @@ warp_utils = { workspace = true } [dev-dependencies] genesis = { workspace = true } proto_array = { workspace = true } -serde_json = { workspace = true } [[test]] name = "bn_http_api_tests" diff --git a/beacon_node/http_api/src/database.rs b/beacon_node/http_api/src/database.rs index aa8b0e8ffc..8a50ec45b0 100644 --- a/beacon_node/http_api/src/database.rs +++ b/beacon_node/http_api/src/database.rs @@ -1,7 +1,17 @@ use beacon_chain::store::metadata::CURRENT_SCHEMA_VERSION; use beacon_chain::{BeaconChain, BeaconChainTypes}; -use eth2::lighthouse::DatabaseInfo; +use serde::Serialize; use std::sync::Arc; +use store::{AnchorInfo, BlobInfo, Split, StoreConfig}; + +#[derive(Debug, Serialize)] +pub struct DatabaseInfo { + pub schema_version: u64, + pub config: StoreConfig, + pub split: Split, + pub anchor: AnchorInfo, + pub blob_info: BlobInfo, +} pub fn info( chain: Arc>, diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index b6ad8da128..1b8cdc5605 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -16,6 +16,7 @@ mod builder_states; mod database; mod light_client; mod metrics; +mod peer; mod produce_block; mod proposer_duties; mod publish_attestations; @@ -3022,15 +3023,13 @@ pub fn serve( }; // the eth2 API spec implies only peers we have been connected to at some point should be included. - if let Some(dir) = peer_info.connection_direction().as_ref() { + if let Some(&dir) = peer_info.connection_direction() { return Ok(api_types::GenericResponse::from(api_types::PeerData { peer_id: peer_id.to_string(), enr: peer_info.enr().map(|enr| enr.to_base64()), last_seen_p2p_address: address, - direction: api_types::PeerDirection::from_connection_direction(dir), - state: api_types::PeerState::from_peer_connection_status( - peer_info.connection_status(), - ), + direction: dir.into(), + state: peer_info.connection_status().clone().into(), })); } } @@ -3071,12 +3070,9 @@ pub fn serve( }; // the eth2 API spec implies only peers we have been connected to at some point should be included. - if let Some(dir) = peer_info.connection_direction() { - let direction = - api_types::PeerDirection::from_connection_direction(dir); - let state = api_types::PeerState::from_peer_connection_status( - peer_info.connection_status(), - ); + if let Some(&dir) = peer_info.connection_direction() { + let direction = dir.into(); + let state = peer_info.connection_status().clone().into(); let state_matches = query.state.as_ref().is_none_or(|states| { states.iter().any(|state_param| *state_param == state) @@ -3128,9 +3124,8 @@ pub fn serve( .read() .peers() .for_each(|(_, peer_info)| { - let state = api_types::PeerState::from_peer_connection_status( - peer_info.connection_status(), - ); + let state = + api_types::PeerState::from(peer_info.connection_status().clone()); match state { api_types::PeerState::Connected => connected += 1, api_types::PeerState::Connecting => connecting += 1, @@ -4089,7 +4084,7 @@ pub fn serve( .peers .read() .peers() - .map(|(peer_id, peer_info)| eth2::lighthouse::Peer { + .map(|(peer_id, peer_info)| peer::Peer { peer_id: peer_id.to_string(), peer_info: peer_info.clone(), }) @@ -4109,15 +4104,14 @@ pub fn serve( |task_spawner: TaskSpawner, network_globals: Arc>| { task_spawner.blocking_json_task(Priority::P1, move || { - Ok(network_globals - .peers - .read() - .connected_peers() - .map(|(peer_id, peer_info)| eth2::lighthouse::Peer { + let mut peers = vec![]; + for (peer_id, peer_info) in network_globals.peers.read().connected_peers() { + peers.push(peer::Peer { peer_id: peer_id.to_string(), peer_info: peer_info.clone(), - }) - .collect::>()) + }); + } + Ok(peers) }) }, ); diff --git a/beacon_node/http_api/src/peer.rs b/beacon_node/http_api/src/peer.rs new file mode 100644 index 0000000000..c9aea9d87c --- /dev/null +++ b/beacon_node/http_api/src/peer.rs @@ -0,0 +1,13 @@ +use lighthouse_network::PeerInfo; +use serde::Serialize; +use types::EthSpec; + +/// Information returned by `peers` and `connected_peers`. +#[derive(Debug, Clone, Serialize)] +#[serde(bound = "E: EthSpec")] +pub(crate) struct Peer { + /// The Peer's ID + pub peer_id: String, + /// The PeerInfo associated with the peer. + pub peer_info: PeerInfo, +} diff --git a/beacon_node/http_api/src/standard_block_rewards.rs b/beacon_node/http_api/src/standard_block_rewards.rs index 372a2765da..2f78649d78 100644 --- a/beacon_node/http_api/src/standard_block_rewards.rs +++ b/beacon_node/http_api/src/standard_block_rewards.rs @@ -2,7 +2,7 @@ use crate::sync_committee_rewards::get_state_before_applying_block; use crate::BlockId; use crate::ExecutionOptimistic; use beacon_chain::{BeaconChain, BeaconChainTypes}; -use eth2::lighthouse::StandardBlockReward; +use eth2::types::StandardBlockReward; use std::sync::Arc; use warp_utils::reject::unhandled_error; /// The difference between block_rewards and beacon_block_rewards is the later returns block diff --git a/beacon_node/http_api/src/sync_committee_rewards.rs b/beacon_node/http_api/src/sync_committee_rewards.rs index e5a9d9daea..d7e8a1f9ef 100644 --- a/beacon_node/http_api/src/sync_committee_rewards.rs +++ b/beacon_node/http_api/src/sync_committee_rewards.rs @@ -1,7 +1,6 @@ use crate::{BlockId, ExecutionOptimistic}; use beacon_chain::{BeaconChain, BeaconChainError, BeaconChainTypes}; -use eth2::lighthouse::SyncCommitteeReward; -use eth2::types::ValidatorId; +use eth2::types::{SyncCommitteeReward, ValidatorId}; use state_processing::BlockReplayer; use std::sync::Arc; use tracing::debug; diff --git a/beacon_node/http_api/tests/tests.rs b/beacon_node/http_api/tests/tests.rs index 2020130d18..ddeda8b66d 100644 --- a/beacon_node/http_api/tests/tests.rs +++ b/beacon_node/http_api/tests/tests.rs @@ -5686,19 +5686,6 @@ impl ApiTester { self } - pub async fn test_get_lighthouse_database_info(self) -> Self { - let info = self.client.get_lighthouse_database_info().await.unwrap(); - - assert_eq!(info.anchor, self.chain.store.get_anchor_info()); - assert_eq!(info.split, self.chain.store.get_split_info()); - assert_eq!( - info.schema_version, - store::metadata::CURRENT_SCHEMA_VERSION.as_u64() - ); - - self - } - pub async fn test_post_lighthouse_database_reconstruct(self) -> Self { let response = self .client @@ -7254,8 +7241,6 @@ async fn lighthouse_endpoints() { .await .test_get_lighthouse_staking() .await - .test_get_lighthouse_database_info() - .await .test_post_lighthouse_database_reconstruct() .await .test_post_lighthouse_liveness() diff --git a/beacon_node/lighthouse_network/Cargo.toml b/beacon_node/lighthouse_network/Cargo.toml index d60bfc3735..8cae529de0 100644 --- a/beacon_node/lighthouse_network/Cargo.toml +++ b/beacon_node/lighthouse_network/Cargo.toml @@ -13,6 +13,7 @@ directory = { workspace = true } dirs = { workspace = true } discv5 = { workspace = true } either = { workspace = true } +eth2 = { workspace = true } ethereum_ssz = { workspace = true } ethereum_ssz_derive = { workspace = true } fnv = { workspace = true } diff --git a/beacon_node/lighthouse_network/src/peer_manager/peerdb/peer_info.rs b/beacon_node/lighthouse_network/src/peer_manager/peerdb/peer_info.rs index 4cbff59ce2..4cb94ca383 100644 --- a/beacon_node/lighthouse_network/src/peer_manager/peerdb/peer_info.rs +++ b/beacon_node/lighthouse_network/src/peer_manager/peerdb/peer_info.rs @@ -4,6 +4,7 @@ use super::sync_status::SyncStatus; use crate::discovery::Eth2Enr; use crate::{rpc::MetaData, types::Subnet}; use discv5::Enr; +use eth2::types::{PeerDirection, PeerState}; use libp2p::core::multiaddr::{Multiaddr, Protocol}; use serde::{ ser::{SerializeStruct, Serializer}, @@ -522,7 +523,7 @@ impl PeerInfo { } /// Connection Direction of connection. -#[derive(Debug, Clone, Serialize, AsRefStr)] +#[derive(Debug, Clone, Copy, Serialize, AsRefStr)] #[strum(serialize_all = "snake_case")] pub enum ConnectionDirection { /// The connection was established by a peer dialing us. @@ -531,6 +532,15 @@ pub enum ConnectionDirection { Outgoing, } +impl From for PeerDirection { + fn from(direction: ConnectionDirection) -> Self { + match direction { + ConnectionDirection::Incoming => PeerDirection::Inbound, + ConnectionDirection::Outgoing => PeerDirection::Outbound, + } + } +} + /// Connection Status of the peer. #[derive(Debug, Clone, Default)] pub enum PeerConnectionStatus { @@ -624,3 +634,14 @@ impl Serialize for PeerConnectionStatus { } } } + +impl From for PeerState { + fn from(status: PeerConnectionStatus) -> Self { + match status { + Connected { .. } => PeerState::Connected, + Dialing { .. } => PeerState::Connecting, + Disconnecting { .. } => PeerState::Disconnecting, + Disconnected { .. } | Banned { .. } | Unknown => PeerState::Disconnected, + } + } +} diff --git a/beacon_node/lighthouse_network/src/types/mod.rs b/beacon_node/lighthouse_network/src/types/mod.rs index db92f05b8f..868cdb6eb9 100644 --- a/beacon_node/lighthouse_network/src/types/mod.rs +++ b/beacon_node/lighthouse_network/src/types/mod.rs @@ -1,7 +1,6 @@ mod globals; mod pubsub; mod subnet; -mod sync_state; mod topics; use types::{BitVector, EthSpec}; @@ -11,10 +10,10 @@ pub type EnrSyncCommitteeBitfield = BitVector<::SyncCommitteeSu pub type Enr = discv5::enr::Enr; +pub use eth2::lighthouse::sync_state::{BackFillState, SyncState}; pub use globals::NetworkGlobals; pub use pubsub::{PubsubMessage, SnappyTransform}; pub use subnet::{Subnet, SubnetDiscovery}; -pub use sync_state::{BackFillState, SyncState}; pub use topics::{ all_topics_at_fork, core_topics_to_subscribe, is_fork_non_core_topic, subnet_from_topic_hash, GossipEncoding, GossipKind, GossipTopic, TopicConfig, diff --git a/common/eth2/Cargo.toml b/common/eth2/Cargo.toml index a1bc9d025b..35dd806fb3 100644 --- a/common/eth2/Cargo.toml +++ b/common/eth2/Cargo.toml @@ -3,19 +3,20 @@ name = "eth2" version = "0.1.0" authors = ["Paul Hauner "] edition = { workspace = true } -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] derivative = { workspace = true } either = { workspace = true } +enr = { version = "0.13.0", features = ["ed25519"] } eth2_keystore = { workspace = true } ethereum_serde_utils = { workspace = true } ethereum_ssz = { workspace = true } ethereum_ssz_derive = { workspace = true } futures = { workspace = true } futures-util = "0.3.8" -lighthouse_network = { workspace = true } +libp2p-identity = { version = "0.2", features = ["peerid"] } mediatype = "0.19.13" +multiaddr = "0.18.2" pretty_reqwest_error = { workspace = true } proto_array = { workspace = true } reqwest = { workspace = true } @@ -25,7 +26,6 @@ serde = { workspace = true } serde_json = { workspace = true } slashing_protection = { workspace = true } ssz_types = { workspace = true } -store = { workspace = true } types = { workspace = true } zeroize = { workspace = true } diff --git a/common/eth2/src/lib.rs b/common/eth2/src/lib.rs index 73e9d57abc..358fe12a84 100644 --- a/common/eth2/src/lib.rs +++ b/common/eth2/src/lib.rs @@ -16,11 +16,12 @@ pub mod types; use self::mixin::{RequestAccept, ResponseOptional}; use self::types::{Error as ResponseError, *}; +use ::types::fork_versioned_response::ExecutionOptimisticFinalizedForkVersionedResponse; use derivative::Derivative; use either::Either; use futures::Stream; use futures_util::StreamExt; -use lighthouse_network::PeerId; +use libp2p_identity::PeerId; use pretty_reqwest_error::PrettyReqwestError; pub use reqwest; use reqwest::{ @@ -36,7 +37,6 @@ use std::fmt; use std::future::Future; use std::path::PathBuf; use std::time::Duration; -use store::fork_versioned_response::ExecutionOptimisticFinalizedForkVersionedResponse; pub const V1: EndpointVersion = EndpointVersion(1); pub const V2: EndpointVersion = EndpointVersion(2); @@ -329,7 +329,6 @@ impl BeaconNodeHttpClient { } /// Perform a HTTP POST request, returning a JSON response. - #[cfg(feature = "lighthouse")] async fn post_with_response( &self, url: U, @@ -1602,33 +1601,34 @@ impl BeaconNodeHttpClient { /// `POST beacon/rewards/sync_committee` pub async fn post_beacon_rewards_sync_committee( &self, - rewards: &[Option>], - ) -> Result<(), Error> { + block_id: BlockId, + validators: &[ValidatorId], + ) -> Result>, Error> { let mut path = self.eth_path(V1)?; path.path_segments_mut() .map_err(|()| Error::InvalidUrl(self.server.clone()))? .push("beacon") .push("rewards") - .push("sync_committee"); + .push("sync_committee") + .push(&block_id.to_string()); - self.post(path, &rewards).await?; - - Ok(()) + self.post_with_response(path, &validators).await } /// `GET beacon/rewards/blocks` - pub async fn get_beacon_rewards_blocks(&self, epoch: Epoch) -> Result<(), Error> { + pub async fn get_beacon_rewards_blocks( + &self, + block_id: BlockId, + ) -> Result, Error> { let mut path = self.eth_path(V1)?; path.path_segments_mut() .map_err(|()| Error::InvalidUrl(self.server.clone()))? .push("beacon") .push("rewards") - .push("blocks"); - - path.query_pairs_mut() - .append_pair("epoch", &epoch.to_string()); + .push("blocks") + .push(&block_id.to_string()); self.get(path).await } @@ -1636,19 +1636,19 @@ impl BeaconNodeHttpClient { /// `POST beacon/rewards/attestations` pub async fn post_beacon_rewards_attestations( &self, - attestations: &[ValidatorId], - ) -> Result<(), Error> { + epoch: Epoch, + validators: &[ValidatorId], + ) -> Result { let mut path = self.eth_path(V1)?; path.path_segments_mut() .map_err(|()| Error::InvalidUrl(self.server.clone()))? .push("beacon") .push("rewards") - .push("attestations"); + .push("attestations") + .push(&epoch.to_string()); - self.post(path, &attestations).await?; - - Ok(()) + self.post_with_response(path, &validators).await } // GET builder/states/{state_id}/expected_withdrawals diff --git a/common/eth2/src/lighthouse.rs b/common/eth2/src/lighthouse.rs index badc4857c4..a9f2f471b0 100644 --- a/common/eth2/src/lighthouse.rs +++ b/common/eth2/src/lighthouse.rs @@ -1,52 +1,33 @@ //! This module contains endpoints that are non-standard and only available on Lighthouse servers. mod attestation_performance; -pub mod attestation_rewards; mod block_packing_efficiency; mod block_rewards; -mod standard_block_rewards; -mod sync_committee_rewards; +pub mod sync_state; use crate::{ - types::{ - DepositTreeSnapshot, Epoch, EthSpec, FinalizedExecutionBlock, GenericResponse, ValidatorId, - }, + lighthouse::sync_state::SyncState, + types::{DepositTreeSnapshot, Epoch, FinalizedExecutionBlock, GenericResponse, ValidatorId}, BeaconNodeHttpClient, DepositData, Error, Eth1Data, Hash256, Slot, }; use proto_array::core::ProtoArray; use serde::{Deserialize, Serialize}; use ssz::four_byte_option_impl; use ssz_derive::{Decode, Encode}; -use store::{AnchorInfo, BlobInfo, Split, StoreConfig}; pub use attestation_performance::{ AttestationPerformance, AttestationPerformanceQuery, AttestationPerformanceStatistics, }; -pub use attestation_rewards::StandardAttestationRewards; pub use block_packing_efficiency::{ BlockPackingEfficiency, BlockPackingEfficiencyQuery, ProposerInfo, UniqueAttestation, }; pub use block_rewards::{AttestationRewards, BlockReward, BlockRewardMeta, BlockRewardsQuery}; -pub use lighthouse_network::{types::SyncState, PeerInfo}; -pub use standard_block_rewards::StandardBlockReward; -pub use sync_committee_rewards::SyncCommitteeReward; // Define "legacy" implementations of `Option` which use four bytes for encoding the union // selector. four_byte_option_impl!(four_byte_option_u64, u64); four_byte_option_impl!(four_byte_option_hash256, Hash256); -/// Information returned by `peers` and `connected_peers`. -// TODO: this should be deserializable.. -#[derive(Debug, Clone, Serialize)] -#[serde(bound = "E: EthSpec")] -pub struct Peer { - /// The Peer's ID - pub peer_id: String, - /// The PeerInfo associated with the peer. - pub peer_info: PeerInfo, -} - /// The results of validators voting during an epoch. /// /// Provides information about the current and previous epochs. @@ -234,15 +215,6 @@ impl From for FinalizedExecutionBlock { } } -#[derive(Debug, Serialize, Deserialize)] -pub struct DatabaseInfo { - pub schema_version: u64, - pub config: StoreConfig, - pub split: Split, - pub anchor: AnchorInfo, - pub blob_info: BlobInfo, -} - impl BeaconNodeHttpClient { /// `GET lighthouse/health` pub async fn get_lighthouse_health(&self) -> Result, Error> { @@ -380,19 +352,6 @@ impl BeaconNodeHttpClient { self.get_opt::<(), _>(path).await.map(|opt| opt.is_some()) } - /// `GET lighthouse/database/info` - pub async fn get_lighthouse_database_info(&self) -> Result { - let mut path = self.server.full.clone(); - - path.path_segments_mut() - .map_err(|()| Error::InvalidUrl(self.server.clone()))? - .push("lighthouse") - .push("database") - .push("info"); - - self.get(path).await - } - /// `POST lighthouse/database/reconstruct` pub async fn post_lighthouse_database_reconstruct(&self) -> Result { let mut path = self.server.full.clone(); diff --git a/common/eth2/src/lighthouse/attestation_rewards.rs b/common/eth2/src/lighthouse/attestation_rewards.rs deleted file mode 100644 index fa3f93d06f..0000000000 --- a/common/eth2/src/lighthouse/attestation_rewards.rs +++ /dev/null @@ -1,55 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serde_utils::quoted_u64::Quoted; - -// Details about the rewards paid for attestations -// All rewards in GWei - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct IdealAttestationRewards { - // Validator's effective balance in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub effective_balance: u64, - // Ideal attester's reward for head vote in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub head: u64, - // Ideal attester's reward for target vote in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub target: u64, - // Ideal attester's reward for source vote in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub source: u64, - // Ideal attester's inclusion_delay reward in gwei (phase0 only) - #[serde(skip_serializing_if = "Option::is_none")] - pub inclusion_delay: Option>, - // Ideal attester's inactivity penalty in gwei - #[serde(with = "serde_utils::quoted_i64")] - pub inactivity: i64, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct TotalAttestationRewards { - // one entry for every validator based on their attestations in the epoch - #[serde(with = "serde_utils::quoted_u64")] - pub validator_index: u64, - // attester's reward for head vote in gwei - #[serde(with = "serde_utils::quoted_i64")] - pub head: i64, - // attester's reward for target vote in gwei - #[serde(with = "serde_utils::quoted_i64")] - pub target: i64, - // attester's reward for source vote in gwei - #[serde(with = "serde_utils::quoted_i64")] - pub source: i64, - // attester's inclusion_delay reward in gwei (phase0 only) - #[serde(skip_serializing_if = "Option::is_none")] - pub inclusion_delay: Option>, - // attester's inactivity penalty in gwei - #[serde(with = "serde_utils::quoted_i64")] - pub inactivity: i64, -} - -#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] -pub struct StandardAttestationRewards { - pub ideal_rewards: Vec, - pub total_rewards: Vec, -} diff --git a/common/eth2/src/lighthouse/standard_block_rewards.rs b/common/eth2/src/lighthouse/standard_block_rewards.rs deleted file mode 100644 index 15fcdc6066..0000000000 --- a/common/eth2/src/lighthouse/standard_block_rewards.rs +++ /dev/null @@ -1,26 +0,0 @@ -use serde::{Deserialize, Serialize}; - -// Details about the rewards for a single block -// All rewards in GWei -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -pub struct StandardBlockReward { - // proposer of the block, the proposer index who receives these rewards - #[serde(with = "serde_utils::quoted_u64")] - pub proposer_index: u64, - // total block reward in gwei, - // equal to attestations + sync_aggregate + proposer_slashings + attester_slashings - #[serde(with = "serde_utils::quoted_u64")] - pub total: u64, - // block reward component due to included attestations in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub attestations: u64, - // block reward component due to included sync_aggregate in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub sync_aggregate: u64, - // block reward component due to included proposer_slashings in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub proposer_slashings: u64, - // block reward component due to included attester_slashings in gwei - #[serde(with = "serde_utils::quoted_u64")] - pub attester_slashings: u64, -} diff --git a/common/eth2/src/lighthouse/sync_committee_rewards.rs b/common/eth2/src/lighthouse/sync_committee_rewards.rs deleted file mode 100644 index 66a721dc22..0000000000 --- a/common/eth2/src/lighthouse/sync_committee_rewards.rs +++ /dev/null @@ -1,13 +0,0 @@ -use serde::{Deserialize, Serialize}; - -// Details about the rewards paid to sync committee members for attesting headers -// All rewards in GWei - -#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] -pub struct SyncCommitteeReward { - #[serde(with = "serde_utils::quoted_u64")] - pub validator_index: u64, - // sync committee reward in gwei for the validator - #[serde(with = "serde_utils::quoted_i64")] - pub reward: i64, -} diff --git a/beacon_node/lighthouse_network/src/types/sync_state.rs b/common/eth2/src/lighthouse/sync_state.rs similarity index 100% rename from beacon_node/lighthouse_network/src/types/sync_state.rs rename to common/eth2/src/lighthouse/sync_state.rs diff --git a/common/eth2/src/types.rs b/common/eth2/src/types.rs index 59374f629d..5cdbf80b05 100644 --- a/common/eth2/src/types.rs +++ b/common/eth2/src/types.rs @@ -5,11 +5,13 @@ use crate::{ Error as ServerError, CONSENSUS_BLOCK_VALUE_HEADER, CONSENSUS_VERSION_HEADER, EXECUTION_PAYLOAD_BLINDED_HEADER, EXECUTION_PAYLOAD_VALUE_HEADER, }; -use lighthouse_network::{ConnectionDirection, Enr, Multiaddr, PeerConnectionStatus}; +use enr::{CombinedKey, Enr}; use mediatype::{names, MediaType, MediaTypeList}; +use multiaddr::Multiaddr; use reqwest::header::HeaderMap; use serde::{Deserialize, Deserializer, Serialize}; use serde_json::Value; +use serde_utils::quoted_u64::Quoted; use ssz::{Decode, DecodeError}; use ssz_derive::{Decode, Encode}; use std::fmt::{self, Display}; @@ -578,7 +580,7 @@ pub struct ChainHeadData { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct IdentityData { pub peer_id: String, - pub enr: Enr, + pub enr: Enr, pub p2p_addresses: Vec, pub discovery_addresses: Vec, pub metadata: MetaData, @@ -861,19 +863,6 @@ pub enum PeerState { Disconnecting, } -impl PeerState { - pub fn from_peer_connection_status(status: &PeerConnectionStatus) -> Self { - match status { - PeerConnectionStatus::Connected { .. } => PeerState::Connected, - PeerConnectionStatus::Dialing { .. } => PeerState::Connecting, - PeerConnectionStatus::Disconnecting { .. } => PeerState::Disconnecting, - PeerConnectionStatus::Disconnected { .. } - | PeerConnectionStatus::Banned { .. } - | PeerConnectionStatus::Unknown => PeerState::Disconnected, - } - } -} - impl FromStr for PeerState { type Err = String; @@ -906,15 +895,6 @@ pub enum PeerDirection { Outbound, } -impl PeerDirection { - pub fn from_connection_direction(direction: &ConnectionDirection) -> Self { - match direction { - ConnectionDirection::Incoming => PeerDirection::Inbound, - ConnectionDirection::Outgoing => PeerDirection::Outbound, - } - } -} - impl FromStr for PeerDirection { type Err = String; @@ -2066,6 +2046,90 @@ pub struct BlobsBundle { pub blobs: BlobsList, } +/// Details about the rewards paid to sync committee members for attesting headers +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] +pub struct SyncCommitteeReward { + #[serde(with = "serde_utils::quoted_u64")] + pub validator_index: u64, + /// sync committee reward in gwei for the validator + #[serde(with = "serde_utils::quoted_i64")] + pub reward: i64, +} + +/// Details about the rewards for a single block +#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)] +pub struct StandardBlockReward { + /// proposer of the block, the proposer index who receives these rewards + #[serde(with = "serde_utils::quoted_u64")] + pub proposer_index: u64, + /// total block reward in gwei, + /// equal to attestations + sync_aggregate + proposer_slashings + attester_slashings + #[serde(with = "serde_utils::quoted_u64")] + pub total: u64, + /// block reward component due to included attestations in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub attestations: u64, + /// block reward component due to included sync_aggregate in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub sync_aggregate: u64, + /// block reward component due to included proposer_slashings in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub proposer_slashings: u64, + /// block reward component due to included attester_slashings in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub attester_slashings: u64, +} + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct IdealAttestationRewards { + /// Validator's effective balance in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub effective_balance: u64, + /// Ideal attester's reward for head vote in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub head: u64, + /// Ideal attester's reward for target vote in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub target: u64, + /// Ideal attester's reward for source vote in gwei + #[serde(with = "serde_utils::quoted_u64")] + pub source: u64, + /// Ideal attester's inclusion_delay reward in gwei (phase0 only) + #[serde(skip_serializing_if = "Option::is_none")] + pub inclusion_delay: Option>, + /// Ideal attester's inactivity penalty in gwei + #[serde(with = "serde_utils::quoted_i64")] + pub inactivity: i64, +} + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct TotalAttestationRewards { + /// one entry for every validator based on their attestations in the epoch + #[serde(with = "serde_utils::quoted_u64")] + pub validator_index: u64, + /// attester's reward for head vote in gwei + #[serde(with = "serde_utils::quoted_i64")] + pub head: i64, + /// attester's reward for target vote in gwei + #[serde(with = "serde_utils::quoted_i64")] + pub target: i64, + /// attester's reward for source vote in gwei + #[serde(with = "serde_utils::quoted_i64")] + pub source: i64, + /// attester's inclusion_delay reward in gwei (phase0 only) + #[serde(skip_serializing_if = "Option::is_none")] + pub inclusion_delay: Option>, + /// attester's inactivity penalty in gwei + #[serde(with = "serde_utils::quoted_i64")] + pub inactivity: i64, +} + +#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] +pub struct StandardAttestationRewards { + pub ideal_rewards: Vec, + pub total_rewards: Vec, +} + #[cfg(test)] mod test { use super::*; diff --git a/common/warp_utils/Cargo.toml b/common/warp_utils/Cargo.toml index ec2d23686b..32a540a69d 100644 --- a/common/warp_utils/Cargo.toml +++ b/common/warp_utils/Cargo.toml @@ -9,7 +9,6 @@ edition = { workspace = true } bytes = { workspace = true } eth2 = { workspace = true } headers = "0.3.2" -metrics = { workspace = true } safe_arith = { workspace = true } serde = { workspace = true } serde_array_query = "0.1.0" diff --git a/testing/validator_test_rig/Cargo.toml b/testing/validator_test_rig/Cargo.toml index bdbdac95d8..f28a423433 100644 --- a/testing/validator_test_rig/Cargo.toml +++ b/testing/validator_test_rig/Cargo.toml @@ -5,7 +5,6 @@ edition = { workspace = true } [dependencies] eth2 = { workspace = true } -logging = { workspace = true } mockito = { workspace = true } regex = { workspace = true } sensitive_url = { workspace = true } From c095a0a58feb22e619c391aa957c9330f98b3e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Oliveira?= Date: Mon, 17 Mar 2025 00:22:19 +0000 Subject: [PATCH 03/20] update gossipsub to the latest upstream revision (#7130) I feel it's preferable to do this explicitly by updating the revision on `Cargo.toml` rather than implicitly by letting `Cargo.lock` control the revision of the branch. --- Cargo.lock | 8 ++++---- Cargo.toml | 1 + beacon_node/lighthouse_network/Cargo.toml | 2 +- beacon_node/lighthouse_network/src/service/mod.rs | 2 +- beacon_node/network/Cargo.toml | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2bbbb5e864..f196d29e5c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1915,7 +1915,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18e4fdb82bd54a12e42fb58a800dcae6b9e13982238ce2296dc3570b92148e1f" dependencies = [ "data-encoding", - "syn 2.0.100", + "syn 1.0.109", ] [[package]] @@ -4761,7 +4761,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -4883,8 +4883,8 @@ dependencies = [ [[package]] name = "libp2p-gossipsub" -version = "0.48.1" -source = "git+https://github.com/sigp/rust-libp2p.git?branch=sigp-gossipsub#3e24b1bbec5fae182595aee0958f823be87afaad" +version = "0.49.0" +source = "git+https://github.com/sigp/rust-libp2p.git?rev=7a36e4c#7a36e4cde83041f1bd5f2078c4d3934ccb16777e" dependencies = [ "async-channel 2.3.1", "asynchronous-codec", diff --git a/Cargo.toml b/Cargo.toml index bad374201d..37ecd28eba 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -144,6 +144,7 @@ fnv = "1" fs2 = "0.4" futures = "0.3" graffiti_file = { path = "validator_client/graffiti_file" } +gossipsub = { package = "libp2p-gossipsub", git = "https://github.com/sigp/rust-libp2p.git", rev = "7a36e4c" } hex = "0.4" hashlink = "0.9.0" hyper = "1" diff --git a/beacon_node/lighthouse_network/Cargo.toml b/beacon_node/lighthouse_network/Cargo.toml index 8cae529de0..4f1825af20 100644 --- a/beacon_node/lighthouse_network/Cargo.toml +++ b/beacon_node/lighthouse_network/Cargo.toml @@ -18,7 +18,7 @@ ethereum_ssz = { workspace = true } ethereum_ssz_derive = { workspace = true } fnv = { workspace = true } futures = { workspace = true } -gossipsub = { package = "libp2p-gossipsub", git = "https://github.com/sigp/rust-libp2p.git", branch = "sigp-gossipsub" } +gossipsub = { workspace = true } hex = { workspace = true } itertools = { workspace = true } libp2p-mplex = "0.43" diff --git a/beacon_node/lighthouse_network/src/service/mod.rs b/beacon_node/lighthouse_network/src/service/mod.rs index 0bf281fd75..3f0b5b96ef 100644 --- a/beacon_node/lighthouse_network/src/service/mod.rs +++ b/beacon_node/lighthouse_network/src/service/mod.rs @@ -996,7 +996,7 @@ impl Network { } } - if let PublishError::InsufficientPeers = e { + if let PublishError::NoPeersSubscribedToTopic = e { self.gossip_cache.insert(topic, message_data); } } diff --git a/beacon_node/network/Cargo.toml b/beacon_node/network/Cargo.toml index 4250f8f8bb..4e36953880 100644 --- a/beacon_node/network/Cargo.toml +++ b/beacon_node/network/Cargo.toml @@ -9,7 +9,7 @@ bls = { workspace = true } eth2 = { workspace = true } eth2_network_config = { workspace = true } genesis = { workspace = true } -gossipsub = { package = "libp2p-gossipsub", git = "https://github.com/sigp/rust-libp2p.git", branch = "sigp-gossipsub" } +gossipsub = { workspace = true } k256 = "0.13.4" kzg = { workspace = true } matches = "0.1.8" From 5cda1641ea2f88b766ccbe788267aaf55af7cb2b Mon Sep 17 00:00:00 2001 From: ThreeHrSleep <151536303+ThreeHrSleep@users.noreply.github.com> Date: Mon, 17 Mar 2025 06:55:55 +0530 Subject: [PATCH 04/20] Log `file appender` initialization errors properly (#7137) It'll help us debug the issue with rolling file appender initialization (`Failed to initialize libp2p rolling file appender`) cc: @macladson --- common/logging/src/lib.rs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/common/logging/src/lib.rs b/common/logging/src/lib.rs index 39615cd656..403f682a06 100644 --- a/common/logging/src/lib.rs +++ b/common/logging/src/lib.rs @@ -140,14 +140,20 @@ pub fn create_libp2p_discv5_tracing_layer( discv5_writer = discv5_writer.compression(Compression::Gzip); } - let Ok(libp2p_writer) = libp2p_writer.build() else { - eprintln!("Failed to initialize libp2p rolling file appender"); - std::process::exit(1); + let libp2p_writer = match libp2p_writer.build() { + Ok(writer) => writer, + Err(e) => { + eprintln!("Failed to initialize libp2p rolling file appender: {e}"); + std::process::exit(1); + } }; - let Ok(discv5_writer) = discv5_writer.build() else { - eprintln!("Failed to initialize discv5 rolling file appender"); - std::process::exit(1); + let discv5_writer = match discv5_writer.build() { + Ok(writer) => writer, + Err(e) => { + eprintln!("Failed to initialize discv5 rolling file appender: {e}"); + std::process::exit(1); + } }; let (libp2p_non_blocking_writer, _libp2p_guard) = NonBlocking::new(libp2p_writer); From 50b5a72c581149cc021ad1c62b3f92c0ba14020f Mon Sep 17 00:00:00 2001 From: Jun Song <87601811+syjn99@users.noreply.github.com> Date: Mon, 17 Mar 2025 10:46:50 +0900 Subject: [PATCH 05/20] feat: implement new beacon APIs(accessors for pending_deposits/pending_partial_withdrawals) (#7006) Resolves #7003 Added two endpoints as https://github.com/ethereum/beacon-APIs/pull/500 proposed: - `/eth/v1/beacon/states/{state_id}/pending_deposits` - `/eth/v1/beacon/states/{state_id}/pending_partial_withdrawals` --- beacon_node/http_api/src/lib.rs | 68 ++++++++++++++++++++++++++++ beacon_node/http_api/tests/tests.rs | 70 +++++++++++++++++++++++++++++ common/eth2/src/lib.rs | 39 ++++++++++++++++ 3 files changed, 177 insertions(+) diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index b516a49446..0d89ca76ac 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -1119,6 +1119,72 @@ pub fn serve( }, ); + // GET beacon/states/{state_id}/pending_deposits + let get_beacon_state_pending_deposits = beacon_states_path + .clone() + .and(warp::path("pending_deposits")) + .and(warp::path::end()) + .then( + |state_id: StateId, + task_spawner: TaskSpawner, + chain: Arc>| { + task_spawner.blocking_json_task(Priority::P1, move || { + let (data, execution_optimistic, finalized) = state_id + .map_state_and_execution_optimistic_and_finalized( + &chain, + |state, execution_optimistic, finalized| { + let Ok(deposits) = state.pending_deposits() else { + return Err(warp_utils::reject::custom_bad_request( + "Pending deposits not found".to_string(), + )); + }; + + Ok((deposits.clone(), execution_optimistic, finalized)) + }, + )?; + + Ok(api_types::ExecutionOptimisticFinalizedResponse { + data, + execution_optimistic: Some(execution_optimistic), + finalized: Some(finalized), + }) + }) + }, + ); + + // GET beacon/states/{state_id}/pending_partial_withdrawals + let get_beacon_state_pending_partial_withdrawals = beacon_states_path + .clone() + .and(warp::path("pending_partial_withdrawals")) + .and(warp::path::end()) + .then( + |state_id: StateId, + task_spawner: TaskSpawner, + chain: Arc>| { + task_spawner.blocking_json_task(Priority::P1, move || { + let (data, execution_optimistic, finalized) = state_id + .map_state_and_execution_optimistic_and_finalized( + &chain, + |state, execution_optimistic, finalized| { + let Ok(withdrawals) = state.pending_partial_withdrawals() else { + return Err(warp_utils::reject::custom_bad_request( + "Pending withdrawals not found".to_string(), + )); + }; + + Ok((withdrawals.clone(), execution_optimistic, finalized)) + }, + )?; + + Ok(api_types::ExecutionOptimisticFinalizedResponse { + data, + execution_optimistic: Some(execution_optimistic), + finalized: Some(finalized), + }) + }) + }, + ); + // GET beacon/headers // // Note: this endpoint only returns information about blocks in the canonical chain. Given that @@ -4667,6 +4733,8 @@ pub fn serve( .uor(get_beacon_state_committees) .uor(get_beacon_state_sync_committees) .uor(get_beacon_state_randao) + .uor(get_beacon_state_pending_deposits) + .uor(get_beacon_state_pending_partial_withdrawals) .uor(get_beacon_headers) .uor(get_beacon_headers_block_id) .uor(get_beacon_block) diff --git a/beacon_node/http_api/tests/tests.rs b/beacon_node/http_api/tests/tests.rs index f7dbedc9ca..a1241f4929 100644 --- a/beacon_node/http_api/tests/tests.rs +++ b/beacon_node/http_api/tests/tests.rs @@ -1192,6 +1192,60 @@ impl ApiTester { self } + pub async fn test_beacon_states_pending_deposits(self) -> Self { + for state_id in self.interesting_state_ids() { + let mut state_opt = state_id + .state(&self.chain) + .ok() + .map(|(state, _execution_optimistic, _finalized)| state); + + let result = self + .client + .get_beacon_states_pending_deposits(state_id.0) + .await + .unwrap() + .map(|res| res.data); + + if result.is_none() && state_opt.is_none() { + continue; + } + + let state = state_opt.as_mut().expect("result should be none"); + let expected = state.pending_deposits().unwrap(); + + assert_eq!(result.unwrap(), expected.to_vec()); + } + + self + } + + pub async fn test_beacon_states_pending_partial_withdrawals(self) -> Self { + for state_id in self.interesting_state_ids() { + let mut state_opt = state_id + .state(&self.chain) + .ok() + .map(|(state, _execution_optimistic, _finalized)| state); + + let result = self + .client + .get_beacon_states_pending_partial_withdrawals(state_id.0) + .await + .unwrap() + .map(|res| res.data); + + if result.is_none() && state_opt.is_none() { + continue; + } + + let state = state_opt.as_mut().expect("result should be none"); + let expected = state.pending_partial_withdrawals().unwrap(); + + assert_eq!(result.unwrap(), expected.to_vec()); + } + + self + } + pub async fn test_beacon_headers_all_slots(self) -> Self { for slot in 0..CHAIN_LENGTH { let slot = Slot::from(slot); @@ -6316,6 +6370,22 @@ async fn beacon_get_state_info() { .await; } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn beacon_get_state_info_electra() { + let mut config = ApiTesterConfig::default(); + config.spec.altair_fork_epoch = Some(Epoch::new(0)); + config.spec.bellatrix_fork_epoch = Some(Epoch::new(0)); + config.spec.capella_fork_epoch = Some(Epoch::new(0)); + config.spec.deneb_fork_epoch = Some(Epoch::new(0)); + config.spec.electra_fork_epoch = Some(Epoch::new(0)); + ApiTester::new_from_config(config) + .await + .test_beacon_states_pending_deposits() + .await + .test_beacon_states_pending_partial_withdrawals() + .await; +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn beacon_get_blocks() { ApiTester::new() diff --git a/common/eth2/src/lib.rs b/common/eth2/src/lib.rs index 73e9d57abc..a0f7a74527 100644 --- a/common/eth2/src/lib.rs +++ b/common/eth2/src/lib.rs @@ -782,6 +782,45 @@ impl BeaconNodeHttpClient { self.get_opt(path).await } + /// `GET beacon/states/{state_id}/pending_deposits` + /// + /// Returns `Ok(None)` on a 404 error. + pub async fn get_beacon_states_pending_deposits( + &self, + state_id: StateId, + ) -> Result>>, Error> { + let mut path = self.eth_path(V1)?; + + path.path_segments_mut() + .map_err(|()| Error::InvalidUrl(self.server.clone()))? + .push("beacon") + .push("states") + .push(&state_id.to_string()) + .push("pending_deposits"); + + self.get_opt(path).await + } + + /// `GET beacon/states/{state_id}/pending_partial_withdrawals` + /// + /// Returns `Ok(None)` on a 404 error. + pub async fn get_beacon_states_pending_partial_withdrawals( + &self, + state_id: StateId, + ) -> Result>>, Error> + { + let mut path = self.eth_path(V1)?; + + path.path_segments_mut() + .map_err(|()| Error::InvalidUrl(self.server.clone()))? + .push("beacon") + .push("states") + .push(&state_id.to_string()) + .push("pending_partial_withdrawals"); + + self.get_opt(path).await + } + /// `GET beacon/light_client/updates` /// /// Returns `Ok(None)` on a 404 error. From 9db29b023beb777ae6edd7e9b714eb6015d48ed8 Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Sun, 16 Mar 2025 20:39:35 -0600 Subject: [PATCH 06/20] Ensure finalized block is the correct fork variant when constructing light client updates (#7085) --- consensus/types/src/light_client_update.rs | 40 ++++++++++++++++------ testing/simulator/src/checks.rs | 19 ++++++++++ 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/consensus/types/src/light_client_update.rs b/consensus/types/src/light_client_update.rs index 0dd91edc3c..e1fce47975 100644 --- a/consensus/types/src/light_client_update.rs +++ b/consensus/types/src/light_client_update.rs @@ -213,12 +213,16 @@ impl LightClientUpdate { .map_err(|_| Error::InconsistentFork)? { ForkName::Base => return Err(Error::AltairForkNotActive), - ForkName::Altair | ForkName::Bellatrix => { + fork_name @ ForkName::Altair | fork_name @ ForkName::Bellatrix => { let attested_header = LightClientHeaderAltair::block_to_light_client_header(attested_block)?; let finalized_header = if let Some(finalized_block) = finalized_block { - LightClientHeaderAltair::block_to_light_client_header(finalized_block)? + if finalized_block.fork_name_unchecked() == fork_name { + LightClientHeaderAltair::block_to_light_client_header(finalized_block)? + } else { + LightClientHeaderAltair::default() + } } else { LightClientHeaderAltair::default() }; @@ -233,12 +237,16 @@ impl LightClientUpdate { signature_slot: block_slot, }) } - ForkName::Capella => { + fork_name @ ForkName::Capella => { let attested_header = LightClientHeaderCapella::block_to_light_client_header(attested_block)?; let finalized_header = if let Some(finalized_block) = finalized_block { - LightClientHeaderCapella::block_to_light_client_header(finalized_block)? + if finalized_block.fork_name_unchecked() == fork_name { + LightClientHeaderCapella::block_to_light_client_header(finalized_block)? + } else { + LightClientHeaderCapella::default() + } } else { LightClientHeaderCapella::default() }; @@ -253,12 +261,16 @@ impl LightClientUpdate { signature_slot: block_slot, }) } - ForkName::Deneb => { + fork_name @ ForkName::Deneb => { let attested_header = LightClientHeaderDeneb::block_to_light_client_header(attested_block)?; let finalized_header = if let Some(finalized_block) = finalized_block { - LightClientHeaderDeneb::block_to_light_client_header(finalized_block)? + if finalized_block.fork_name_unchecked() == fork_name { + LightClientHeaderDeneb::block_to_light_client_header(finalized_block)? + } else { + LightClientHeaderDeneb::default() + } } else { LightClientHeaderDeneb::default() }; @@ -273,12 +285,16 @@ impl LightClientUpdate { signature_slot: block_slot, }) } - ForkName::Electra => { + fork_name @ ForkName::Electra => { let attested_header = LightClientHeaderElectra::block_to_light_client_header(attested_block)?; let finalized_header = if let Some(finalized_block) = finalized_block { - LightClientHeaderElectra::block_to_light_client_header(finalized_block)? + if finalized_block.fork_name_unchecked() == fork_name { + LightClientHeaderElectra::block_to_light_client_header(finalized_block)? + } else { + LightClientHeaderElectra::default() + } } else { LightClientHeaderElectra::default() }; @@ -293,12 +309,16 @@ impl LightClientUpdate { signature_slot: block_slot, }) } - ForkName::Fulu => { + fork_name @ ForkName::Fulu => { let attested_header = LightClientHeaderFulu::block_to_light_client_header(attested_block)?; let finalized_header = if let Some(finalized_block) = finalized_block { - LightClientHeaderFulu::block_to_light_client_header(finalized_block)? + if finalized_block.fork_name_unchecked() == fork_name { + LightClientHeaderFulu::block_to_light_client_header(finalized_block)? + } else { + LightClientHeaderFulu::default() + } } else { LightClientHeaderFulu::default() }; diff --git a/testing/simulator/src/checks.rs b/testing/simulator/src/checks.rs index 03cc17fab3..35c2508b53 100644 --- a/testing/simulator/src/checks.rs +++ b/testing/simulator/src/checks.rs @@ -264,6 +264,11 @@ pub(crate) async fn verify_light_client_updates( let slot = Slot::new(slot); let previous_slot = slot - 1; + let sync_committee_period = slot + .epoch(E::slots_per_epoch()) + .sync_committee_period(&E::default_spec()) + .unwrap(); + let previous_slot_block = client .get_beacon_blocks::(BlockId::Slot(previous_slot)) .await @@ -329,6 +334,20 @@ pub(crate) async fn verify_light_client_updates( "Existing finality update too old: signature slot {signature_slot}, current slot {slot:?}" )); } + + let light_client_updates = client + .get_beacon_light_client_updates::(sync_committee_period, 1) + .await + .map_err(|e| format!("Error while getting light client update: {:?}", e))? + .ok_or(format!("Light client update not found {slot:?}"))?; + + // Ensure we're only storing a single light client update for the given sync committee period + if light_client_updates.len() != 1 { + return Err(format!( + "{} light client updates was returned when only one was expected.", + light_client_updates.len() + )); + } } Ok(()) From d96123b028828e5976441637ab5b55c60da8a9da Mon Sep 17 00:00:00 2001 From: Mac L Date: Mon, 17 Mar 2025 09:55:41 +0400 Subject: [PATCH 07/20] Remove unnecessary `filter_layer` in logger builder (#7149) https://github.com/sigp/lighthouse/issues/7146 Removes `filter_layer` from the builder as this was acting as a "global minimum". We don't actually need this, since we are using more granular control in `stdout_logging_layer` and `file_logging_layer`. Removing this restores control of the logfiles level back to the `--logfile-debug-level` flag (and defaults to debug). --- lighthouse/environment/src/tracing_common.rs | 8 +------- lighthouse/src/main.rs | 2 -- testing/simulator/src/basic_sim.rs | 2 -- testing/simulator/src/fallback_sim.rs | 2 -- 4 files changed, 1 insertion(+), 13 deletions(-) diff --git a/lighthouse/environment/src/tracing_common.rs b/lighthouse/environment/src/tracing_common.rs index ad9060a8ff..893f50dae5 100644 --- a/lighthouse/environment/src/tracing_common.rs +++ b/lighthouse/environment/src/tracing_common.rs @@ -3,7 +3,7 @@ use clap::ArgMatches; use logging::Libp2pDiscv5TracingLayer; use logging::{tracing_logging_layer::LoggingLayer, SSELoggingComponents}; use std::process; -use tracing_subscriber::filter::{EnvFilter, FilterFn, LevelFilter}; +use tracing_subscriber::filter::{FilterFn, LevelFilter}; use types::EthSpec; pub fn construct_logger( @@ -12,7 +12,6 @@ pub fn construct_logger( environment_builder: EnvironmentBuilder, ) -> ( EnvironmentBuilder, - EnvFilter, Libp2pDiscv5TracingLayer, LoggingLayer, LoggingLayer, @@ -32,16 +31,11 @@ pub fn construct_logger( let (builder, file_logging_layer, stdout_logging_layer, sse_logging_layer_opt) = environment_builder.init_tracing(logger_config.clone(), logfile_prefix); - let filter_layer = EnvFilter::try_from_default_env() - .or_else(|_| EnvFilter::try_new(logger_config.debug_level.to_string().to_lowercase())) - .unwrap(); - let dependency_log_filter = FilterFn::new(filter_dependency_log as fn(&tracing::Metadata<'_>) -> bool); ( builder, - filter_layer, libp2p_discv5_layer, file_logging_layer, stdout_logging_layer, diff --git a/lighthouse/src/main.rs b/lighthouse/src/main.rs index 8df4831503..a2432e282d 100644 --- a/lighthouse/src/main.rs +++ b/lighthouse/src/main.rs @@ -592,7 +592,6 @@ fn run( let ( builder, - filter_layer, libp2p_discv5_layer, file_logging_layer, stdout_logging_layer, @@ -622,7 +621,6 @@ fn run( let logging = tracing_subscriber::registry() .with(dependency_log_filter) - .with(filter_layer) .with(file_logging_layer.with_filter(logger_config.logfile_debug_level)) .with(stdout_logging_layer.with_filter(logger_config.debug_level)) .with(MetricsLayer) diff --git a/testing/simulator/src/basic_sim.rs b/testing/simulator/src/basic_sim.rs index fff5c71a87..4cd599f845 100644 --- a/testing/simulator/src/basic_sim.rs +++ b/testing/simulator/src/basic_sim.rs @@ -90,7 +90,6 @@ pub fn run_basic_sim(matches: &ArgMatches) -> Result<(), String> { let ( env_builder, - filter_layer, _libp2p_discv5_layer, file_logging_layer, stdout_logging_layer, @@ -119,7 +118,6 @@ pub fn run_basic_sim(matches: &ArgMatches) -> Result<(), String> { ); if let Err(e) = tracing_subscriber::registry() - .with(filter_layer) .with(file_logging_layer.with_filter(logger_config.logfile_debug_level)) .with(stdout_logging_layer.with_filter(logger_config.debug_level)) .with(MetricsLayer) diff --git a/testing/simulator/src/fallback_sim.rs b/testing/simulator/src/fallback_sim.rs index 98a6a34ffa..384699c64c 100644 --- a/testing/simulator/src/fallback_sim.rs +++ b/testing/simulator/src/fallback_sim.rs @@ -94,7 +94,6 @@ pub fn run_fallback_sim(matches: &ArgMatches) -> Result<(), String> { let ( env_builder, - filter_layer, libp2p_discv5_layer, file_logging_layer, stdout_logging_layer, @@ -124,7 +123,6 @@ pub fn run_fallback_sim(matches: &ArgMatches) -> Result<(), String> { if let Err(e) = tracing_subscriber::registry() .with(dependency_log_filter) - .with(filter_layer) .with(file_logging_layer.with_filter(logger_config.logfile_debug_level)) .with(stdout_logging_layer.with_filter(logger_config.debug_level)) .with(libp2p_discv5_layer) From a1b1d7ae589f36e8b1c0637ff1b17a1bf5272d57 Mon Sep 17 00:00:00 2001 From: Mac L Date: Mon, 17 Mar 2025 11:27:38 +0400 Subject: [PATCH 08/20] Remove `discv5` logs from logfile output (#7150) #7146 Set `dep_logs` to false when building the `file_logging_layer`. This will remove both `discv5` and `libp2p` logs from the output. --- lighthouse/environment/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lighthouse/environment/src/lib.rs b/lighthouse/environment/src/lib.rs index 005d2734c7..f427836751 100644 --- a/lighthouse/environment/src/lib.rs +++ b/lighthouse/environment/src/lib.rs @@ -248,7 +248,7 @@ impl EnvironmentBuilder { config.log_format.clone(), config.logfile_format.clone(), config.extra_info, - true, + false, ) } Err(e) => { @@ -264,7 +264,7 @@ impl EnvironmentBuilder { config.log_format.clone(), config.logfile_format.clone(), config.extra_info, - true, + false, ) } } @@ -280,7 +280,7 @@ impl EnvironmentBuilder { config.log_format.clone(), config.logfile_format.clone(), config.extra_info, - true, + false, ) } }; From 8ce9edc584f6be88136c77bd230f27300ac73d0a Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Mon, 17 Mar 2025 07:18:22 -0600 Subject: [PATCH 09/20] Add block ban flag `--invalid-block-roots` (#7042) --- beacon_node/beacon_chain/src/beacon_chain.rs | 18 +++++++++ .../beacon_chain/src/block_verification.rs | 9 +++++ beacon_node/beacon_chain/src/chain_config.rs | 17 +++++++- .../gossip_methods.rs | 1 + .../network_beacon_processor/sync_methods.rs | 12 ++++++ beacon_node/src/cli.rs | 8 ++++ beacon_node/src/config.rs | 39 +++++++++++++++++- lighthouse/tests/beacon_node.rs | 40 +++++++++++++++++++ 8 files changed, 140 insertions(+), 4 deletions(-) diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index 891a32a6d0..6ce0c00d10 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -2857,6 +2857,15 @@ impl BeaconChain { chain_segment: Vec>, notify_execution_layer: NotifyExecutionLayer, ) -> ChainSegmentResult { + for block in chain_segment.iter() { + if let Err(error) = self.check_invalid_block_roots(block.block_root()) { + return ChainSegmentResult::Failed { + imported_blocks: vec![], + error, + }; + } + } + let mut imported_blocks = vec![]; // Filter uninteresting blocks from the chain segment in a blocking task. @@ -3340,6 +3349,15 @@ impl BeaconChain { self.remove_notified(&block_root, r) } + /// Check for known and configured invalid block roots before processing. + pub fn check_invalid_block_roots(&self, block_root: Hash256) -> Result<(), BlockError> { + if self.config.invalid_block_roots.contains(&block_root) { + Err(BlockError::KnownInvalidExecutionPayload(block_root)) + } else { + Ok(()) + } + } + /// Returns `Ok(block_root)` if the given `unverified_block` was successfully verified and /// imported into the chain. /// diff --git a/beacon_node/beacon_chain/src/block_verification.rs b/beacon_node/beacon_chain/src/block_verification.rs index 1265276376..1bac6cac0a 100644 --- a/beacon_node/beacon_chain/src/block_verification.rs +++ b/beacon_node/beacon_chain/src/block_verification.rs @@ -282,6 +282,9 @@ pub enum BlockError { /// problems to worry about than losing peers, and we're doing the network a favour by /// disconnecting. ParentExecutionPayloadInvalid { parent_root: Hash256 }, + /// This is a known invalid block that was listed in Lighthouses configuration. + /// At the moment this error is only relevant as part of the Holesky network recovery efforts. + KnownInvalidExecutionPayload(Hash256), /// The block is a slashable equivocation from the proposer. /// /// ## Peer scoring @@ -862,6 +865,9 @@ impl GossipVerifiedBlock { return Err(BlockError::DuplicateFullyImported(block_root)); } + // Do not process a block that is known to be invalid. + chain.check_invalid_block_roots(block_root)?; + // Do not process a block that doesn't descend from the finalized root. // // We check this *before* we load the parent so that we can return a more detailed error. @@ -1081,6 +1087,9 @@ impl SignatureVerifiedBlock { .fork_name(&chain.spec) .map_err(BlockError::InconsistentFork)?; + // Check whether the block is a banned block prior to loading the parent. + chain.check_invalid_block_roots(block_root)?; + let (mut parent, block) = load_parent(block, chain)?; let state = cheap_state_advance_to_obtain_committees::<_, BlockError>( diff --git a/beacon_node/beacon_chain/src/chain_config.rs b/beacon_node/beacon_chain/src/chain_config.rs index 4ca2db2aaa..d45f0b5cc8 100644 --- a/beacon_node/beacon_chain/src/chain_config.rs +++ b/beacon_node/beacon_chain/src/chain_config.rs @@ -1,7 +1,8 @@ pub use proto_array::{DisallowedReOrgOffsets, ReOrgThreshold}; use serde::{Deserialize, Serialize}; -use std::time::Duration; -use types::{Checkpoint, Epoch}; +use std::str::FromStr; +use std::{collections::HashSet, sync::LazyLock, time::Duration}; +use types::{Checkpoint, Epoch, Hash256}; pub const DEFAULT_RE_ORG_HEAD_THRESHOLD: ReOrgThreshold = ReOrgThreshold(20); pub const DEFAULT_RE_ORG_PARENT_THRESHOLD: ReOrgThreshold = ReOrgThreshold(160); @@ -19,6 +20,12 @@ pub const FORK_CHOICE_LOOKAHEAD_FACTOR: u32 = 24; /// Default sync tolerance epochs. pub const DEFAULT_SYNC_TOLERANCE_EPOCHS: u64 = 2; +/// Invalid block root to be banned from processing and importing on Holesky network by default. +pub static INVALID_HOLESKY_BLOCK_ROOT: LazyLock = LazyLock::new(|| { + Hash256::from_str("2db899881ed8546476d0b92c6aa9110bea9a4cd0dbeb5519eb0ea69575f1f359") + .expect("valid block root") +}); + #[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize)] pub struct ChainConfig { /// Maximum number of slots to skip when importing an attestation. @@ -100,6 +107,11 @@ pub struct ChainConfig { /// The max distance between the head block and the current slot at which Lighthouse will /// consider itself synced and still serve validator-related requests. pub sync_tolerance_epochs: u64, + /// Block roots of "banned" blocks which Lighthouse will refuse to import. + /// + /// On Holesky there is a block which is added to this set by default but which can be removed + /// by using `--invalid-block-roots ""`. + pub invalid_block_roots: HashSet, } impl Default for ChainConfig { @@ -136,6 +148,7 @@ impl Default for ChainConfig { blob_publication_batches: 4, blob_publication_batch_interval: Duration::from_millis(300), sync_tolerance_epochs: DEFAULT_SYNC_TOLERANCE_EPOCHS, + invalid_block_roots: HashSet::new(), } } } diff --git a/beacon_node/network/src/network_beacon_processor/gossip_methods.rs b/beacon_node/network/src/network_beacon_processor/gossip_methods.rs index 090b963cbc..0956c153a6 100644 --- a/beacon_node/network/src/network_beacon_processor/gossip_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/gossip_methods.rs @@ -1457,6 +1457,7 @@ impl NetworkBeaconProcessor { | Err(e @ BlockError::InconsistentFork(_)) | Err(e @ BlockError::ExecutionPayloadError(_)) | Err(e @ BlockError::ParentExecutionPayloadInvalid { .. }) + | Err(e @ BlockError::KnownInvalidExecutionPayload(_)) | Err(e @ BlockError::GenesisBlock) => { warn!(self.log, "Could not verify block for gossip. Rejecting the block"; "error" => %e); diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index 338f2bc4c8..eb03d3c01b 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -800,6 +800,18 @@ impl NetworkBeaconProcessor { peer_action: Some(PeerAction::LowToleranceError), }) } + // Penalise peers for sending us banned blocks. + BlockError::KnownInvalidExecutionPayload(block_root) => { + warn!( + self.log, + "Received block known to be invalid"; + "block_root" => ?block_root, + ); + Err(ChainSegmentFailed { + message: format!("Banned block: {block_root:?}"), + peer_action: Some(PeerAction::Fatal), + }) + } other => { debug!( self.log, "Invalid block received"; diff --git a/beacon_node/src/cli.rs b/beacon_node/src/cli.rs index 518ad2f041..d29c3e2127 100644 --- a/beacon_node/src/cli.rs +++ b/beacon_node/src/cli.rs @@ -1621,5 +1621,13 @@ pub fn cli_app() -> Command { .action(ArgAction::Set) .display_order(0) ) + .arg( + Arg::new("invalid-block-roots") + .long("invalid-block-roots") + .value_name("FILE") + .help("Path to a comma separated file containing block roots that should be treated as invalid during block verification.") + .action(ArgAction::Set) + .hide(true) + ) .group(ArgGroup::new("enable_http").args(["http", "gui", "staking"]).multiple(true)) } diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index 494f8e8882..f1db7590e8 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -2,7 +2,7 @@ use account_utils::{read_input_from_user, STDIN_INPUTS_FLAG}; use beacon_chain::chain_config::{ DisallowedReOrgOffsets, ReOrgThreshold, DEFAULT_PREPARE_PAYLOAD_LOOKAHEAD_FACTOR, DEFAULT_RE_ORG_HEAD_THRESHOLD, DEFAULT_RE_ORG_MAX_EPOCHS_SINCE_FINALIZATION, - DEFAULT_RE_ORG_PARENT_THRESHOLD, + DEFAULT_RE_ORG_PARENT_THRESHOLD, INVALID_HOLESKY_BLOCK_ROOT, }; use beacon_chain::graffiti_calculator::GraffitiOrigin; use beacon_chain::TrustedSetup; @@ -20,9 +20,10 @@ use lighthouse_network::{multiaddr::Protocol, Enr, Multiaddr, NetworkConfig, Pee use sensitive_url::SensitiveUrl; use slog::{info, warn, Logger}; use std::cmp::max; +use std::collections::HashSet; use std::fmt::Debug; use std::fs; -use std::io::IsTerminal; +use std::io::{IsTerminal, Read}; use std::net::Ipv6Addr; use std::net::{IpAddr, Ipv4Addr, ToSocketAddrs}; use std::num::NonZeroU16; @@ -903,6 +904,40 @@ pub fn get_config( .max_gossip_aggregate_batch_size = clap_utils::parse_required(cli_args, "beacon-processor-aggregate-batch-size")?; + if let Some(invalid_block_roots_file_path) = + clap_utils::parse_optional::(cli_args, "invalid-block-roots")? + { + let mut file = std::fs::File::open(invalid_block_roots_file_path) + .map_err(|e| format!("Failed to open invalid-block-roots file: {}", e))?; + let mut contents = String::new(); + file.read_to_string(&mut contents) + .map_err(|e| format!("Failed to read invalid-block-roots file {}", e))?; + let invalid_block_roots: HashSet = contents + .split(',') + .filter_map( + |s| match Hash256::from_str(s.strip_prefix("0x").unwrap_or(s).trim()) { + Ok(block_root) => Some(block_root), + Err(e) => { + warn!( + log, + "Unable to parse invalid block root"; + "block_root" => s, + "error" => ?e, + ); + None + } + }, + ) + .collect(); + client_config.chain.invalid_block_roots = invalid_block_roots; + } else if spec + .config_name + .as_ref() + .is_some_and(|network_name| network_name == "holesky") + { + client_config.chain.invalid_block_roots = HashSet::from([*INVALID_HOLESKY_BLOCK_ROOT]); + } + Ok(client_config) } diff --git a/lighthouse/tests/beacon_node.rs b/lighthouse/tests/beacon_node.rs index a636919a44..90d9fc0b49 100644 --- a/lighthouse/tests/beacon_node.rs +++ b/lighthouse/tests/beacon_node.rs @@ -2773,3 +2773,43 @@ fn beacon_node_backend_override() { assert_eq!(config.store.backend, BeaconNodeBackend::LevelDb); }); } + +#[test] +fn invalid_block_roots_flag() { + let dir = TempDir::new().expect("Unable to create temporary directory"); + let mut file = + File::create(dir.path().join("invalid-block-roots")).expect("Unable to create file"); + file.write_all(b"2db899881ed8546476d0b92c6aa9110bea9a4cd0dbeb5519eb0ea69575f1f359, 2db899881ed8546476d0b92c6aa9110bea9a4cd0dbeb5519eb0ea69575f1f358, 0x3db899881ed8546476d0b92c6aa9110bea9a4cd0dbeb5519eb0ea69575f1f358") + .expect("Unable to write to file"); + CommandLineTest::new() + .flag( + "invalid-block-roots", + dir.path().join("invalid-block-roots").as_os_str().to_str(), + ) + .run_with_zero_port() + .with_config(|config| assert_eq!(config.chain.invalid_block_roots.len(), 3)) +} + +#[test] +fn invalid_block_roots_default_holesky() { + use beacon_node::beacon_chain::chain_config::INVALID_HOLESKY_BLOCK_ROOT; + CommandLineTest::new() + .flag("network", Some("holesky")) + .run_with_zero_port() + .with_config(|config| { + assert_eq!(config.chain.invalid_block_roots.len(), 1); + assert!(config + .chain + .invalid_block_roots + .contains(&*INVALID_HOLESKY_BLOCK_ROOT)); + }) +} + +#[test] +fn invalid_block_roots_default_mainnet() { + CommandLineTest::new() + .run_with_zero_port() + .with_config(|config| { + assert!(config.chain.invalid_block_roots.is_empty()); + }) +} From 4de062626b28948cdb275cdb9730a2da0b0e9225 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Tue, 18 Mar 2025 13:10:21 +1100 Subject: [PATCH 10/20] State cache tweaks (#7095) Backport of: - https://github.com/sigp/lighthouse/pull/7067 For: - https://github.com/sigp/lighthouse/issues/7039 - Prevent writing to state cache when migrating the database - Add `state-cache-headroom` flag to control pruning - Prune old epoch boundary states ahead of mid-epoch states - Never prune head block's state - Avoid caching ancestor states unless they are on an epoch boundary - Log when states enter/exit the cache Co-authored-by: Eitan Seri-Levi --- .../beacon_chain/src/attestation_rewards.rs | 4 +- .../beacon_chain/src/attester_cache.rs | 4 +- beacon_node/beacon_chain/src/beacon_chain.rs | 23 ++- beacon_node/beacon_chain/src/builder.rs | 7 +- .../beacon_chain/src/canonical_head.rs | 6 + beacon_node/beacon_chain/src/fork_revert.rs | 3 +- .../src/light_client_server_cache.rs | 5 +- beacon_node/beacon_chain/src/migrate.rs | 3 +- beacon_node/beacon_chain/src/test_utils.rs | 2 +- .../tests/attestation_verification.rs | 22 ++- beacon_node/beacon_chain/tests/rewards.rs | 10 +- beacon_node/beacon_chain/tests/store_tests.rs | 50 ++++-- .../tests/sync_committee_verification.rs | 8 +- .../http_api/src/attestation_performance.rs | 5 +- .../http_api/src/block_packing_efficiency.rs | 4 +- beacon_node/http_api/src/block_rewards.rs | 8 +- beacon_node/http_api/src/state_id.rs | 4 +- .../http_api/src/sync_committee_rewards.rs | 4 +- beacon_node/src/cli.rs | 9 + beacon_node/src/config.rs | 6 + beacon_node/store/src/config.rs | 4 + beacon_node/store/src/hot_cold_store.rs | 167 ++++++++++++------ beacon_node/store/src/iter.rs | 11 +- beacon_node/store/src/state_cache.rs | 64 +++++-- book/src/help_bn.md | 3 + consensus/fork_choice/tests/tests.rs | 5 +- .../src/per_block_processing/tests.rs | 6 +- lighthouse/tests/beacon_node.rs | 15 ++ testing/ef_tests/src/cases/fork_choice.rs | 10 +- 29 files changed, 358 insertions(+), 114 deletions(-) diff --git a/beacon_node/beacon_chain/src/attestation_rewards.rs b/beacon_node/beacon_chain/src/attestation_rewards.rs index 4f7c480c8c..46dda286f1 100644 --- a/beacon_node/beacon_chain/src/attestation_rewards.rs +++ b/beacon_node/beacon_chain/src/attestation_rewards.rs @@ -47,8 +47,10 @@ impl BeaconChain { .state_root_at_slot(state_slot)? .ok_or(BeaconChainError::NoStateForSlot(state_slot))?; + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let state = self - .get_state(&state_root, Some(state_slot))? + .get_state(&state_root, Some(state_slot), true)? .ok_or(BeaconChainError::MissingBeaconState(state_root))?; if state.fork_name_unchecked().altair_enabled() { diff --git a/beacon_node/beacon_chain/src/attester_cache.rs b/beacon_node/beacon_chain/src/attester_cache.rs index 7f356bd621..ae715afcd0 100644 --- a/beacon_node/beacon_chain/src/attester_cache.rs +++ b/beacon_node/beacon_chain/src/attester_cache.rs @@ -325,8 +325,10 @@ impl AttesterCache { return Ok(value); } + // We use `cache_state = true` here because if we are attesting to the state it's likely + // to be recent and useful for other things. let mut state: BeaconState = chain - .get_state(&state_root, None)? + .get_state(&state_root, None, true)? .ok_or(Error::MissingBeaconState(state_root))?; if state.slot() > slot { diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index 6ce0c00d10..b24211009e 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -815,8 +815,10 @@ impl BeaconChain { let block = self .get_blinded_block(&block_root)? .ok_or(Error::MissingBeaconBlock(block_root))?; + // This method is only used in tests, so we may as well cache states to make CI go brr. + // TODO(release-v7) move this method out of beacon chain and into `store_tests`` or something equivalent. let state = self - .get_state(&block.state_root(), Some(block.slot()))? + .get_state(&block.state_root(), Some(block.slot()), true)? .ok_or_else(|| Error::MissingBeaconState(block.state_root()))?; let iter = BlockRootsIterator::owned(&self.store, state); Ok(std::iter::once(Ok((block_root, block.slot()))) @@ -1343,8 +1345,9 @@ impl BeaconChain { &self, state_root: &Hash256, slot: Option, + update_cache: bool, ) -> Result>, Error> { - Ok(self.store.get_state(state_root, slot)?) + Ok(self.store.get_state(state_root, slot, update_cache)?) } /// Return the sync committee at `slot + 1` from the canonical chain. @@ -1519,8 +1522,14 @@ impl BeaconChain { })? .ok_or(Error::NoStateForSlot(slot))?; + // This branch is mostly reached from the HTTP API when doing analysis, or in niche + // situations when producing a block. In the HTTP API case we assume the user wants + // to cache states so that future calls are faster, and that if the cache is + // struggling due to non-finality that they will dial down inessential calls. In the + // block proposal case we want to cache the state so that we can process the block + // quickly after it has been signed. Ok(self - .get_state(&state_root, Some(slot))? + .get_state(&state_root, Some(slot), true)? .ok_or(Error::NoStateForSlot(slot))?) } } @@ -6916,9 +6925,11 @@ impl BeaconChain { })?; let beacon_state_root = beacon_block.state_root(); + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let mut beacon_state = self .store - .get_state(&beacon_state_root, Some(beacon_block.slot()))? + .get_state(&beacon_state_root, Some(beacon_block.slot()), true)? .ok_or_else(|| { Error::DBInconsistent(format!("Missing state {:?}", beacon_state_root)) })?; @@ -7070,8 +7081,10 @@ impl BeaconChain { if signed_beacon_block.slot() % T::EthSpec::slots_per_epoch() == 0 { let block = self.get_blinded_block(&block_hash).unwrap().unwrap(); + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let state = self - .get_state(&block.state_root(), Some(block.slot())) + .get_state(&block.state_root(), Some(block.slot()), true) .unwrap() .unwrap(); finalized_blocks.insert(state.finalized_checkpoint().root); diff --git a/beacon_node/beacon_chain/src/builder.rs b/beacon_node/beacon_chain/src/builder.rs index 8d62478bea..02b566971a 100644 --- a/beacon_node/beacon_chain/src/builder.rs +++ b/beacon_node/beacon_chain/src/builder.rs @@ -298,8 +298,13 @@ where .get_blinded_block(&chain.genesis_block_root) .map_err(|e| descriptive_db_error("genesis block", &e))? .ok_or("Genesis block not found in store")?; + // We're resuming from some state in the db so it makes sense to cache it. let genesis_state = store - .get_state(&genesis_block.state_root(), Some(genesis_block.slot())) + .get_state( + &genesis_block.state_root(), + Some(genesis_block.slot()), + true, + ) .map_err(|e| descriptive_db_error("genesis state", &e))? .ok_or("Genesis state not found in store")?; diff --git a/beacon_node/beacon_chain/src/canonical_head.rs b/beacon_node/beacon_chain/src/canonical_head.rs index 4e21372efb..4d2ff11b38 100644 --- a/beacon_node/beacon_chain/src/canonical_head.rs +++ b/beacon_node/beacon_chain/src/canonical_head.rs @@ -784,6 +784,12 @@ impl BeaconChain { .execution_status .is_optimistic_or_invalid(); + // Update the state cache so it doesn't mistakenly prune the new head. + self.store + .state_cache + .lock() + .update_head_block_root(new_cached_head.head_block_root()); + // Detect and potentially report any re-orgs. let reorg_distance = detect_reorg( &old_snapshot.beacon_state, diff --git a/beacon_node/beacon_chain/src/fork_revert.rs b/beacon_node/beacon_chain/src/fork_revert.rs index 8d1c29f46f..48ff87fe3c 100644 --- a/beacon_node/beacon_chain/src/fork_revert.rs +++ b/beacon_node/beacon_chain/src/fork_revert.rs @@ -116,8 +116,9 @@ pub fn reset_fork_choice_to_finalization, Cold: It // Advance finalized state to finalized epoch (to handle skipped slots). let finalized_state_root = finalized_block.state_root(); + // The enshrined finalized state should be in the state cache. let mut finalized_state = store - .get_state(&finalized_state_root, Some(finalized_block.slot())) + .get_state(&finalized_state_root, Some(finalized_block.slot()), true) .map_err(|e| format!("Error loading finalized state: {:?}", e))? .ok_or_else(|| { format!( diff --git a/beacon_node/beacon_chain/src/light_client_server_cache.rs b/beacon_node/beacon_chain/src/light_client_server_cache.rs index 78442d8df0..dd25da0847 100644 --- a/beacon_node/beacon_chain/src/light_client_server_cache.rs +++ b/beacon_node/beacon_chain/src/light_client_server_cache.rs @@ -319,8 +319,11 @@ impl LightClientServerCache { metrics::inc_counter(&metrics::LIGHT_CLIENT_SERVER_CACHE_PREV_BLOCK_CACHE_MISS); // Compute the value, handling potential errors. + // This state should already be cached. By electing not to cache it here + // we remove any chance of the light client server from affecting the state cache. + // We'd like the light client server to be as minimally invasive as possible. let mut state = store - .get_state(block_state_root, Some(block_slot))? + .get_state(block_state_root, Some(block_slot), false)? .ok_or_else(|| { BeaconChainError::DBInconsistent(format!("Missing state {:?}", block_state_root)) })?; diff --git a/beacon_node/beacon_chain/src/migrate.rs b/beacon_node/beacon_chain/src/migrate.rs index bc4b8e1ed8..a8543fab9b 100644 --- a/beacon_node/beacon_chain/src/migrate.rs +++ b/beacon_node/beacon_chain/src/migrate.rs @@ -320,7 +320,8 @@ impl, Cold: ItemStore> BackgroundMigrator state, other => { error!( diff --git a/beacon_node/beacon_chain/src/test_utils.rs b/beacon_node/beacon_chain/src/test_utils.rs index 24c85b3e07..fa26c9dbd9 100644 --- a/beacon_node/beacon_chain/src/test_utils.rs +++ b/beacon_node/beacon_chain/src/test_utils.rs @@ -890,7 +890,7 @@ where pub fn get_hot_state(&self, state_hash: BeaconStateHash) -> Option> { self.chain .store - .load_hot_state(&state_hash.into()) + .load_hot_state(&state_hash.into(), true) .unwrap() .map(|(state, _)| state) } diff --git a/beacon_node/beacon_chain/tests/attestation_verification.rs b/beacon_node/beacon_chain/tests/attestation_verification.rs index dcc63ddf62..30eec539fc 100644 --- a/beacon_node/beacon_chain/tests/attestation_verification.rs +++ b/beacon_node/beacon_chain/tests/attestation_verification.rs @@ -36,6 +36,9 @@ pub const VALIDATOR_COUNT: usize = 256; pub const CAPELLA_FORK_EPOCH: usize = 1; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + /// A cached set of keys. static KEYPAIRS: LazyLock> = LazyLock::new(|| types::test_utils::generate_deterministic_keypairs(VALIDATOR_COUNT)); @@ -1225,7 +1228,11 @@ async fn attestation_that_skips_epochs() { let mut state = harness .chain - .get_state(&earlier_block.state_root(), Some(earlier_slot)) + .get_state( + &earlier_block.state_root(), + Some(earlier_slot), + CACHE_STATE_IN_TESTS, + ) .expect("should not error getting state") .expect("should find state"); @@ -1329,9 +1336,14 @@ async fn attestation_validator_receive_proposer_reward_and_withdrawals() { .await; let current_slot = harness.get_current_slot(); + let mut state = harness .chain - .get_state(&earlier_block.state_root(), Some(earlier_slot)) + .get_state( + &earlier_block.state_root(), + Some(earlier_slot), + CACHE_STATE_IN_TESTS, + ) .expect("should not error getting state") .expect("should find state"); @@ -1399,7 +1411,11 @@ async fn attestation_to_finalized_block() { let mut state = harness .chain - .get_state(&earlier_block.state_root(), Some(earlier_slot)) + .get_state( + &earlier_block.state_root(), + Some(earlier_slot), + CACHE_STATE_IN_TESTS, + ) .expect("should not error getting state") .expect("should find state"); diff --git a/beacon_node/beacon_chain/tests/rewards.rs b/beacon_node/beacon_chain/tests/rewards.rs index 41e6467b0f..710752d9cc 100644 --- a/beacon_node/beacon_chain/tests/rewards.rs +++ b/beacon_node/beacon_chain/tests/rewards.rs @@ -20,6 +20,9 @@ use types::{ChainSpec, ForkName, Slot}; pub const VALIDATOR_COUNT: usize = 64; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + type E = MinimalEthSpec; static KEYPAIRS: LazyLock> = @@ -116,8 +119,13 @@ async fn test_sync_committee_rewards() { .get_blinded_block(&block.parent_root()) .unwrap() .unwrap(); + let parent_state = chain - .get_state(&parent_block.state_root(), Some(parent_block.slot())) + .get_state( + &parent_block.state_root(), + Some(parent_block.slot()), + CACHE_STATE_IN_TESTS, + ) .unwrap() .unwrap(); diff --git a/beacon_node/beacon_chain/tests/store_tests.rs b/beacon_node/beacon_chain/tests/store_tests.rs index 7a2df76970..d1950ab7ce 100644 --- a/beacon_node/beacon_chain/tests/store_tests.rs +++ b/beacon_node/beacon_chain/tests/store_tests.rs @@ -39,6 +39,9 @@ use types::*; pub const LOW_VALIDATOR_COUNT: usize = 24; pub const HIGH_VALIDATOR_COUNT: usize = 64; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + /// A cached set of keys. static KEYPAIRS: LazyLock> = LazyLock::new(|| types::test_utils::generate_deterministic_keypairs(HIGH_VALIDATOR_COUNT)); @@ -758,6 +761,7 @@ async fn delete_blocks_and_states() { .get_state( &faulty_head_block.state_root(), Some(faulty_head_block.slot()), + CACHE_STATE_IN_TESTS, ) .expect("no db error") .expect("faulty head state exists"); @@ -771,7 +775,12 @@ async fn delete_blocks_and_states() { break; } store.delete_state(&state_root, slot).unwrap(); - assert_eq!(store.get_state(&state_root, Some(slot)).unwrap(), None); + assert_eq!( + store + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) + .unwrap(), + None + ); } // Double-deleting should also be OK (deleting non-existent things is fine) @@ -1055,7 +1064,11 @@ fn get_state_for_block(harness: &TestHarness, block_root: Hash256) -> BeaconStat .unwrap(); harness .chain - .get_state(&head_block.state_root(), Some(head_block.slot())) + .get_state( + &head_block.state_root(), + Some(head_block.slot()), + CACHE_STATE_IN_TESTS, + ) .unwrap() .unwrap() } @@ -1892,7 +1905,10 @@ fn check_all_states_exist<'a>( states: impl Iterator, ) { for &state_hash in states { - let state = harness.chain.get_state(&state_hash.into(), None).unwrap(); + let state = harness + .chain + .get_state(&state_hash.into(), None, CACHE_STATE_IN_TESTS) + .unwrap(); assert!( state.is_some(), "expected state {:?} to be in DB", @@ -1910,7 +1926,7 @@ fn check_no_states_exist<'a>( assert!( harness .chain - .get_state(&state_root.into(), None) + .get_state(&state_root.into(), None, CACHE_STATE_IN_TESTS) .unwrap() .is_none(), "state {:?} should not be in the DB", @@ -2344,7 +2360,7 @@ async fn weak_subjectivity_sync_test(slots: Vec, checkpoint_slot: Slot) { .get_or_reconstruct_blobs(&wss_block_root) .unwrap(); let wss_state = full_store - .get_state(&wss_state_root, Some(checkpoint_slot)) + .get_state(&wss_state_root, Some(checkpoint_slot), CACHE_STATE_IN_TESTS) .unwrap() .unwrap(); @@ -2460,7 +2476,7 @@ async fn weak_subjectivity_sync_test(slots: Vec, checkpoint_slot: Slot) { // Check that the new block's state can be loaded correctly. let mut state = beacon_chain .store - .get_state(&state_root, Some(slot)) + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) .unwrap() .unwrap(); assert_eq!(state.update_tree_hash_cache().unwrap(), state_root); @@ -2594,7 +2610,10 @@ async fn weak_subjectivity_sync_test(slots: Vec, checkpoint_slot: Slot) { .unwrap() .map(Result::unwrap) { - let mut state = store.get_state(&state_root, Some(slot)).unwrap().unwrap(); + let mut state = store + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) + .unwrap() + .unwrap(); assert_eq!(state.slot(), slot); assert_eq!(state.canonical_root().unwrap(), state_root); } @@ -3424,9 +3443,10 @@ async fn prune_historic_states() { let store = get_store(&db_path); let harness = get_harness(store.clone(), LOW_VALIDATOR_COUNT); let genesis_state_root = harness.chain.genesis_state_root; + let genesis_state = harness .chain - .get_state(&genesis_state_root, None) + .get_state(&genesis_state_root, None, CACHE_STATE_IN_TESTS) .unwrap() .unwrap(); @@ -3447,7 +3467,10 @@ async fn prune_historic_states() { .map(Result::unwrap) .collect::>(); for &(state_root, slot) in &first_epoch_state_roots { - assert!(store.get_state(&state_root, Some(slot)).unwrap().is_some()); + assert!(store + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) + .unwrap() + .is_some()); } store @@ -3462,7 +3485,10 @@ async fn prune_historic_states() { // Ensure all epoch 0 states other than the genesis have been pruned. for &(state_root, slot) in &first_epoch_state_roots { assert_eq!( - store.get_state(&state_root, Some(slot)).unwrap().is_some(), + store + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) + .unwrap() + .is_some(), slot == 0 ); } @@ -3588,7 +3614,7 @@ fn check_chain_dump(harness: &TestHarness, expected_len: u64) { harness .chain .store - .get_state(&checkpoint.beacon_state_root(), None) + .get_state(&checkpoint.beacon_state_root(), None, CACHE_STATE_IN_TESTS) .expect("no error") .expect("state exists") .slot(), @@ -3650,7 +3676,7 @@ fn check_iterators(harness: &TestHarness) { harness .chain .store - .get_state(&state_root, Some(slot)) + .get_state(&state_root, Some(slot), CACHE_STATE_IN_TESTS) .unwrap() .is_some(), "state {:?} from canonical chain should be in DB", diff --git a/beacon_node/beacon_chain/tests/sync_committee_verification.rs b/beacon_node/beacon_chain/tests/sync_committee_verification.rs index 6d30b8a4e3..c8bbcce20d 100644 --- a/beacon_node/beacon_chain/tests/sync_committee_verification.rs +++ b/beacon_node/beacon_chain/tests/sync_committee_verification.rs @@ -21,6 +21,9 @@ pub type E = MainnetEthSpec; pub const VALIDATOR_COUNT: usize = 256; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + /// A cached set of keys. static KEYPAIRS: LazyLock> = LazyLock::new(|| types::test_utils::generate_deterministic_keypairs(VALIDATOR_COUNT)); @@ -755,7 +758,10 @@ async fn unaggregated_gossip_verification() { // Load the block and state for the given root. let block = chain.get_block(&root).await.unwrap().unwrap(); - let mut state = chain.get_state(&block.state_root(), None).unwrap().unwrap(); + let mut state = chain + .get_state(&block.state_root(), None, CACHE_STATE_IN_TESTS) + .unwrap() + .unwrap(); // Advance the state to simulate a pre-state for block production. let slot = valid_sync_committee_message.slot + 1; diff --git a/beacon_node/http_api/src/attestation_performance.rs b/beacon_node/http_api/src/attestation_performance.rs index 2f3f340445..23ab5e3752 100644 --- a/beacon_node/http_api/src/attestation_performance.rs +++ b/beacon_node/http_api/src/attestation_performance.rs @@ -126,8 +126,11 @@ pub fn get_attestation_performance( // Load state for block replay. let state_root = prior_block.state_root(); + + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let state = chain - .get_state(&state_root, Some(prior_slot)) + .get_state(&state_root, Some(prior_slot), true) .and_then(|maybe_state| maybe_state.ok_or(BeaconChainError::MissingBeaconState(state_root))) .map_err(unhandled_error)?; diff --git a/beacon_node/http_api/src/block_packing_efficiency.rs b/beacon_node/http_api/src/block_packing_efficiency.rs index 431547f10b..249a6732dc 100644 --- a/beacon_node/http_api/src/block_packing_efficiency.rs +++ b/beacon_node/http_api/src/block_packing_efficiency.rs @@ -285,8 +285,10 @@ pub fn get_block_packing_efficiency( // Load state for block replay. let starting_state_root = first_block.state_root(); + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let starting_state = chain - .get_state(&starting_state_root, Some(prior_slot)) + .get_state(&starting_state_root, Some(prior_slot), true) .and_then(|maybe_state| { maybe_state.ok_or(BeaconChainError::MissingBeaconState(starting_state_root)) }) diff --git a/beacon_node/http_api/src/block_rewards.rs b/beacon_node/http_api/src/block_rewards.rs index 0cc878bb48..8466da4de1 100644 --- a/beacon_node/http_api/src/block_rewards.rs +++ b/beacon_node/http_api/src/block_rewards.rs @@ -43,8 +43,10 @@ pub fn get_block_rewards( .map_err(unhandled_error)? .ok_or_else(|| custom_bad_request(format!("prior state at slot {} unknown", prior_slot)))?; + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let mut state = chain - .get_state(&state_root, Some(prior_slot)) + .get_state(&state_root, Some(prior_slot), true) .and_then(|maybe_state| maybe_state.ok_or(BeaconChainError::MissingBeaconState(state_root))) .map_err(unhandled_error)?; @@ -133,8 +135,10 @@ pub fn compute_block_rewards( )) })?; + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let parent_state = chain - .get_state(&parent_block.state_root(), Some(parent_block.slot())) + .get_state(&parent_block.state_root(), Some(parent_block.slot()), true) .map_err(unhandled_error)? .ok_or_else(|| { custom_bad_request(format!( diff --git a/beacon_node/http_api/src/state_id.rs b/beacon_node/http_api/src/state_id.rs index 353390cdad..a9f66de467 100644 --- a/beacon_node/http_api/src/state_id.rs +++ b/beacon_node/http_api/src/state_id.rs @@ -189,8 +189,10 @@ impl StateId { _ => (self.root(chain)?, None), }; + // This branch is reached from the HTTP API. We assume the user wants + // to cache states so that future calls are faster. let state = chain - .get_state(&state_root, slot_opt) + .get_state(&state_root, slot_opt, true) .map_err(warp_utils::reject::unhandled_error) .and_then(|opt| { opt.ok_or_else(|| { diff --git a/beacon_node/http_api/src/sync_committee_rewards.rs b/beacon_node/http_api/src/sync_committee_rewards.rs index ec63372406..987dfdff59 100644 --- a/beacon_node/http_api/src/sync_committee_rewards.rs +++ b/beacon_node/http_api/src/sync_committee_rewards.rs @@ -58,8 +58,10 @@ pub fn get_state_before_applying_block( }) .map_err(|e| custom_not_found(format!("Parent block is not available! {:?}", e)))?; + // We are about to apply a new block to the chain. It's parent state + // is a useful/recent state, we elect to cache it. let parent_state = chain - .get_state(&parent_block.state_root(), Some(parent_block.slot())) + .get_state(&parent_block.state_root(), Some(parent_block.slot()), true) .and_then(|maybe_state| { maybe_state .ok_or_else(|| BeaconChainError::MissingBeaconState(parent_block.state_root())) diff --git a/beacon_node/src/cli.rs b/beacon_node/src/cli.rs index d29c3e2127..5de096b25f 100644 --- a/beacon_node/src/cli.rs +++ b/beacon_node/src/cli.rs @@ -776,6 +776,15 @@ pub fn cli_app() -> Command { .action(ArgAction::Set) .display_order(0) ) + .arg( + Arg::new("state-cache-headroom") + .long("state-cache-headroom") + .value_name("N") + .help("Minimum number of states to cull from the state cache when it gets full") + .default_value("1") + .action(ArgAction::Set) + .display_order(0) + ) .arg( Arg::new("block-cache-size") .long("block-cache-size") diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index f1db7590e8..cd92ee8fad 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -463,6 +463,12 @@ pub fn get_config( client_config.chain.epochs_per_migration = epochs_per_migration; } + if let Some(state_cache_headroom) = + clap_utils::parse_optional(cli_args, "state-cache-headroom")? + { + client_config.store.state_cache_headroom = state_cache_headroom; + } + if let Some(prune_blobs) = clap_utils::parse_optional(cli_args, "prune-blobs")? { client_config.store.prune_blobs = prune_blobs; } diff --git a/beacon_node/store/src/config.rs b/beacon_node/store/src/config.rs index 64765fd66a..a84573eb40 100644 --- a/beacon_node/store/src/config.rs +++ b/beacon_node/store/src/config.rs @@ -21,6 +21,7 @@ pub const DEFAULT_SLOTS_PER_RESTORE_POINT: u64 = 8192; pub const DEFAULT_EPOCHS_PER_STATE_DIFF: u64 = 8; pub const DEFAULT_BLOCK_CACHE_SIZE: NonZeroUsize = new_non_zero_usize(64); pub const DEFAULT_STATE_CACHE_SIZE: NonZeroUsize = new_non_zero_usize(128); +pub const DEFAULT_STATE_CACHE_HEADROOM: NonZeroUsize = new_non_zero_usize(1); pub const DEFAULT_COMPRESSION_LEVEL: i32 = 1; pub const DEFAULT_HISTORIC_STATE_CACHE_SIZE: NonZeroUsize = new_non_zero_usize(1); pub const DEFAULT_HDIFF_BUFFER_CACHE_SIZE: NonZeroUsize = new_non_zero_usize(16); @@ -35,6 +36,8 @@ pub struct StoreConfig { pub block_cache_size: NonZeroUsize, /// Maximum number of states to store in the in-memory state cache. pub state_cache_size: NonZeroUsize, + /// Minimum number of states to cull from the state cache upon fullness. + pub state_cache_headroom: NonZeroUsize, /// Compression level for blocks, state diffs and other compressed values. pub compression_level: i32, /// Maximum number of historic states to store in the in-memory historic state cache. @@ -107,6 +110,7 @@ impl Default for StoreConfig { Self { block_cache_size: DEFAULT_BLOCK_CACHE_SIZE, state_cache_size: DEFAULT_STATE_CACHE_SIZE, + state_cache_headroom: DEFAULT_STATE_CACHE_HEADROOM, historic_state_cache_size: DEFAULT_HISTORIC_STATE_CACHE_SIZE, hdiff_buffer_cache_size: DEFAULT_HDIFF_BUFFER_CACHE_SIZE, compression_level: DEFAULT_COMPRESSION_LEVEL, diff --git a/beacon_node/store/src/hot_cold_store.rs b/beacon_node/store/src/hot_cold_store.rs index 6dee0dc180..42d1fd31c2 100644 --- a/beacon_node/store/src/hot_cold_store.rs +++ b/beacon_node/store/src/hot_cold_store.rs @@ -73,7 +73,7 @@ pub struct HotColdDB, Cold: ItemStore> { /// Cache of beacon states. /// /// LOCK ORDERING: this lock must always be locked *after* the `split` if both are required. - state_cache: Mutex>, + pub state_cache: Mutex>, /// Cache of historic states and hierarchical diff buffers. /// /// This cache is never pruned. It is only populated in response to historical queries from the @@ -218,7 +218,10 @@ impl HotColdDB, MemoryStore> { blobs_db: MemoryStore::open(), hot_db: MemoryStore::open(), block_cache: Mutex::new(BlockCache::new(config.block_cache_size)), - state_cache: Mutex::new(StateCache::new(config.state_cache_size)), + state_cache: Mutex::new(StateCache::new( + config.state_cache_size, + config.state_cache_headroom, + )), historic_state_cache: Mutex::new(HistoricStateCache::new( config.hdiff_buffer_cache_size, config.historic_state_cache_size, @@ -264,7 +267,10 @@ impl HotColdDB, BeaconNodeBackend> { cold_db: BeaconNodeBackend::open(&config, cold_path)?, hot_db, block_cache: Mutex::new(BlockCache::new(config.block_cache_size)), - state_cache: Mutex::new(StateCache::new(config.state_cache_size)), + state_cache: Mutex::new(StateCache::new( + config.state_cache_size, + config.state_cache_headroom, + )), historic_state_cache: Mutex::new(HistoricStateCache::new( config.hdiff_buffer_cache_size, config.historic_state_cache_size, @@ -945,6 +951,7 @@ impl, Cold: ItemStore> HotColdDB &self, state_root: &Hash256, slot: Option, + update_cache: bool, ) -> Result>, Error> { metrics::inc_counter(&metrics::BEACON_STATE_GET_COUNT); @@ -956,10 +963,10 @@ impl, Cold: ItemStore> HotColdDB // chain. This way we avoid returning a state that doesn't match `state_root`. self.load_cold_state(state_root) } else { - self.get_hot_state(state_root) + self.get_hot_state(state_root, update_cache) } } else { - match self.get_hot_state(state_root)? { + match self.get_hot_state(state_root, update_cache)? { Some(state) => Ok(Some(state)), None => self.load_cold_state(state_root), } @@ -1014,22 +1021,28 @@ impl, Cold: ItemStore> HotColdDB } else { state_root }; + // It's a bit redundant but we elect to cache the state here and down below. let mut opt_state = self - .load_hot_state(&state_root)? + .load_hot_state(&state_root, true)? .map(|(state, _block_root)| (state_root, state)); if let Some((state_root, state)) = opt_state.as_mut() { state.update_tree_hash_cache()?; state.build_all_caches(&self.spec)?; - self.state_cache - .lock() - .put_state(*state_root, block_root, state)?; - debug!( - self.log, - "Cached state"; - "state_root" => ?state_root, - "slot" => state.slot(), - ); + if let PutStateOutcome::New(deleted_states) = + self.state_cache + .lock() + .put_state(*state_root, block_root, state)? + { + debug!( + self.log, + "Cached state"; + "location" => "get_advanced_hot_state", + "deleted_states" => ?deleted_states, + "state_root" => ?state_root, + "slot" => state.slot(), + ); + } } drop(split); Ok(opt_state) @@ -1126,6 +1139,8 @@ impl, Cold: ItemStore> HotColdDB /// Load an epoch boundary state by using the hot state summary look-up. /// /// Will fall back to the cold DB if a hot state summary is not found. + /// + /// NOTE: only used in tests at the moment pub fn load_epoch_boundary_state( &self, state_root: &Hash256, @@ -1136,9 +1151,11 @@ impl, Cold: ItemStore> HotColdDB }) = self.load_hot_state_summary(state_root)? { // NOTE: minor inefficiency here because we load an unnecessary hot state summary - let (state, _) = self.load_hot_state(&epoch_boundary_state_root)?.ok_or( - HotColdDBError::MissingEpochBoundaryState(epoch_boundary_state_root), - )?; + let (state, _) = self + .load_hot_state(&epoch_boundary_state_root, true)? + .ok_or(HotColdDBError::MissingEpochBoundaryState( + epoch_boundary_state_root, + ))?; Ok(Some(state)) } else { // Try the cold DB @@ -1463,24 +1480,34 @@ impl, Cold: ItemStore> HotColdDB state: &BeaconState, ops: &mut Vec, ) -> Result<(), Error> { - // Put the state in the cache. - let block_root = state.get_latest_block_root(*state_root); - // Avoid storing states in the database if they already exist in the state cache. // The exception to this is the finalized state, which must exist in the cache before it // is stored on disk. - if let PutStateOutcome::Duplicate = - self.state_cache - .lock() - .put_state(*state_root, block_root, state)? - { - debug!( - self.log, - "Skipping storage of cached state"; - "slot" => state.slot(), - "state_root" => ?state_root - ); - return Ok(()); + match self.state_cache.lock().put_state( + *state_root, + state.get_latest_block_root(*state_root), + state, + )? { + PutStateOutcome::New(deleted_states) => { + debug!( + self.log, + "Cached state"; + "location" => "store_hot_state", + "deleted_states" => ?deleted_states, + "state_root" => ?state_root, + "slot" => state.slot(), + ); + } + PutStateOutcome::Duplicate => { + debug!( + self.log, + "State already exists in state cache"; + "slot" => state.slot(), + "state_root" => ?state_root + ); + return Ok(()); + } + PutStateOutcome::Finalized => {} // Continue to store. } // On the epoch boundary, store the full state. @@ -1505,7 +1532,11 @@ impl, Cold: ItemStore> HotColdDB } /// Get a post-finalization state from the database or store. - pub fn get_hot_state(&self, state_root: &Hash256) -> Result>, Error> { + pub fn get_hot_state( + &self, + state_root: &Hash256, + update_cache: bool, + ) -> Result>, Error> { if let Some(state) = self.state_cache.lock().get_by_state_root(*state_root) { return Ok(Some(state)); } @@ -1519,20 +1550,35 @@ impl, Cold: ItemStore> HotColdDB ); } - let state_from_disk = self.load_hot_state(state_root)?; + let state_from_disk = self.load_hot_state(state_root, update_cache)?; if let Some((mut state, block_root)) = state_from_disk { state.update_tree_hash_cache()?; state.build_all_caches(&self.spec)?; - self.state_cache - .lock() - .put_state(*state_root, block_root, &state)?; - debug!( - self.log, - "Cached state"; - "state_root" => ?state_root, - "slot" => state.slot(), - ); + if update_cache { + if let PutStateOutcome::New(deleted_states) = + self.state_cache + .lock() + .put_state(*state_root, block_root, &state)? + { + debug!( + self.log, + "Cached state"; + "location" => "get_hot_state", + "deleted_states" => ?deleted_states, + "state_root" => ?state_root, + "slot" => state.slot(), + ); + } + } else { + debug!( + self.log, + "Did not cache state"; + "state_root" => ?state_root, + "slot" => state.slot(), + ); + } + Ok(Some(state)) } else { Ok(None) @@ -1548,6 +1594,7 @@ impl, Cold: ItemStore> HotColdDB pub fn load_hot_state( &self, state_root: &Hash256, + update_cache: bool, ) -> Result, Hash256)>, Error> { metrics::inc_counter(&metrics::BEACON_STATE_HOT_GET_COUNT); @@ -1579,17 +1626,19 @@ impl, Cold: ItemStore> HotColdDB let mut state = if slot % E::slots_per_epoch() == 0 { boundary_state } else { - // Cache ALL intermediate states that are reached during block replay. We may want - // to restrict this in future to only cache epoch boundary states. At worst we will - // cache up to 32 states for each state loaded, which should not flush out the cache - // entirely. + // If replaying blocks, and `update_cache` is true, also cache the epoch boundary + // state that this state is based on. It may be useful as the basis of more states + // in the same epoch. let state_cache_hook = |state_root, state: &mut BeaconState| { + if !update_cache || state.slot() % E::slots_per_epoch() != 0 { + return Ok(()); + } // Ensure all caches are built before attempting to cache. state.update_tree_hash_cache()?; state.build_all_caches(&self.spec)?; let latest_block_root = state.get_latest_block_root(state_root); - if let PutStateOutcome::New = + if let PutStateOutcome::New(_) = self.state_cache .lock() .put_state(state_root, latest_block_root, state)? @@ -1598,7 +1647,8 @@ impl, Cold: ItemStore> HotColdDB self.log, "Cached ancestor state"; "state_root" => ?state_root, - "slot" => slot, + "state_slot" => state.slot(), + "descendant_slot" => slot, ); } Ok(()) @@ -2668,10 +2718,15 @@ impl, Cold: ItemStore> HotColdDB return Ok(()); }; - // Load the split state so we can backtrack to find execution payloads. - let split_state = self.get_state(&split.state_root, Some(split.slot))?.ok_or( - HotColdDBError::MissingSplitState(split.state_root, split.slot), - )?; + // Load the split state so we can backtrack to find execution payloads. The split state + // should be in the state cache as the enshrined finalized state, so this should never + // cache miss. + let split_state = self + .get_state(&split.state_root, Some(split.slot), true)? + .ok_or(HotColdDBError::MissingSplitState( + split.state_root, + split.slot, + ))?; // The finalized block may or may not have its execution payload stored, depending on // whether it was at a skipped slot. However for a fully pruned database its parent @@ -3169,8 +3224,10 @@ pub fn migrate_database, Cold: ItemStore>( // Store slot -> state_root and state_root -> slot mappings. store.store_cold_state_summary(&state_root, slot, &mut cold_db_ops)?; } else { + // This is some state that we want to migrate to the freezer db. + // There is no reason to cache this state. let state: BeaconState = store - .get_hot_state(&state_root)? + .get_hot_state(&state_root, false)? .ok_or(HotColdDBError::MissingStateToFreeze(state_root))?; store.store_cold_state(&state_root, &state, &mut cold_db_ops)?; diff --git a/beacon_node/store/src/iter.rs b/beacon_node/store/src/iter.rs index 97a88c01c8..a344bea8d4 100644 --- a/beacon_node/store/src/iter.rs +++ b/beacon_node/store/src/iter.rs @@ -27,8 +27,10 @@ impl<'a, E: EthSpec, Hot: ItemStore, Cold: ItemStore> &self, store: &'a HotColdDB, ) -> Option> { + // Ancestor roots and their states are probably in the cold db + // but we set `update_cache` to false just in case let state = store - .get_state(&self.message().state_root(), Some(self.slot())) + .get_state(&self.message().state_root(), Some(self.slot()), false) .ok()??; Some(BlockRootsIterator::owned(store, state)) @@ -189,8 +191,10 @@ impl<'a, E: EthSpec, Hot: ItemStore, Cold: ItemStore> RootsIterator<'a, E, let block = store .get_blinded_block(&block_hash)? .ok_or_else(|| BeaconStateError::MissingBeaconBlock(block_hash.into()))?; + // We are querying some block from the database. It's not clear if the block's state is useful, + // we elect not to cache it. let state = store - .get_state(&block.state_root(), Some(block.slot()))? + .get_state(&block.state_root(), Some(block.slot()), false)? .ok_or_else(|| BeaconStateError::MissingBeaconState(block.state_root().into()))?; Ok(Self::owned(store, state)) } @@ -362,8 +366,9 @@ fn next_historical_root_backtrack_state, Cold: Ite if new_state_slot >= historic_state_upper_limit { let new_state_root = current_state.get_state_root(new_state_slot)?; + // We are backtracking through historical states, we don't want to cache these. Ok(store - .get_state(new_state_root, Some(new_state_slot))? + .get_state(new_state_root, Some(new_state_slot), false)? .ok_or_else(|| BeaconStateError::MissingBeaconState((*new_state_root).into()))?) } else { Err(Error::HistoryUnavailable) diff --git a/beacon_node/store/src/state_cache.rs b/beacon_node/store/src/state_cache.rs index 96e4de4639..281ecab152 100644 --- a/beacon_node/store/src/state_cache.rs +++ b/beacon_node/store/src/state_cache.rs @@ -33,26 +33,33 @@ pub struct SlotMap { #[derive(Debug)] pub struct StateCache { finalized_state: Option>, - states: LruCache>, + // Stores the tuple (state_root, state) as LruCache only returns the value on put and we need + // the state_root + states: LruCache)>, block_map: BlockMap, max_epoch: Epoch, + head_block_root: Hash256, + headroom: NonZeroUsize, } #[derive(Debug)] pub enum PutStateOutcome { Finalized, Duplicate, - New, + /// Includes deleted states as a result of this insertion + New(Vec), } #[allow(clippy::len_without_is_empty)] impl StateCache { - pub fn new(capacity: NonZeroUsize) -> Self { + pub fn new(capacity: NonZeroUsize, headroom: NonZeroUsize) -> Self { StateCache { finalized_state: None, states: LruCache::new(capacity), block_map: BlockMap::default(), max_epoch: Epoch::new(0), + head_block_root: Hash256::ZERO, + headroom, } } @@ -98,6 +105,13 @@ impl StateCache { Ok(()) } + /// Update the state cache's view of the enshrined head block. + /// + /// We never prune the unadvanced state for the head block. + pub fn update_head_block_root(&mut self, head_block_root: Hash256) { + self.head_block_root = head_block_root; + } + /// Rebase the given state on the finalized state in order to reduce its memory consumption. /// /// This function should only be called on states that are likely not to already share tree @@ -147,18 +161,26 @@ impl StateCache { self.max_epoch = std::cmp::max(state.current_epoch(), self.max_epoch); // If the cache is full, use the custom cull routine to make room. - if let Some(over_capacity) = self.len().checked_sub(self.capacity()) { - self.cull(over_capacity + 1); - } + let mut deleted_states = + if let Some(over_capacity) = self.len().checked_sub(self.capacity()) { + // The `over_capacity` should always be 0, but we add it here just in case. + self.cull(over_capacity + self.headroom.get()) + } else { + vec![] + }; // Insert the full state into the cache. - self.states.put(state_root, state.clone()); + if let Some((deleted_state_root, _)) = + self.states.put(state_root, (state_root, state.clone())) + { + deleted_states.push(deleted_state_root); + } // Record the connection from block root and slot to this state. let slot = state.slot(); self.block_map.insert(block_root, slot, state_root); - Ok(PutStateOutcome::New) + Ok(PutStateOutcome::New(deleted_states)) } pub fn get_by_state_root(&mut self, state_root: Hash256) -> Option> { @@ -167,7 +189,7 @@ impl StateCache { return Some(finalized_state.state.clone()); } } - self.states.get(&state_root).cloned() + self.states.get(&state_root).map(|(_, state)| state.clone()) } pub fn get_by_block_root( @@ -211,7 +233,7 @@ impl StateCache { /// - Mid-epoch unadvanced states. /// - Epoch-boundary states that are too old to be finalized. /// - Epoch-boundary states that could be finalized. - pub fn cull(&mut self, count: usize) { + pub fn cull(&mut self, count: usize) -> Vec { let cull_exempt = std::cmp::max( 1, self.len() * CULL_EXEMPT_NUMERATOR / CULL_EXEMPT_DENOMINATOR, @@ -222,7 +244,8 @@ impl StateCache { let mut mid_epoch_state_roots = vec![]; let mut old_boundary_state_roots = vec![]; let mut good_boundary_state_roots = vec![]; - for (&state_root, state) in self.states.iter().skip(cull_exempt) { + + for (&state_root, (_, state)) in self.states.iter().skip(cull_exempt) { let is_advanced = state.slot() > state.latest_block_header().slot; let is_boundary = state.slot() % E::slots_per_epoch() == 0; let could_finalize = @@ -236,7 +259,8 @@ impl StateCache { } } else if is_advanced { advanced_state_roots.push(state_root); - } else { + } else if state.get_latest_block_root(state_root) != self.head_block_root { + // Never prune the head state mid_epoch_state_roots.push(state_root); } @@ -248,15 +272,19 @@ impl StateCache { // Stage 2: delete. // This could probably be more efficient in how it interacts with the block map. - for state_root in advanced_state_roots - .iter() - .chain(mid_epoch_state_roots.iter()) - .chain(old_boundary_state_roots.iter()) - .chain(good_boundary_state_roots.iter()) + let state_roots_to_delete = advanced_state_roots + .into_iter() + .chain(old_boundary_state_roots) + .chain(mid_epoch_state_roots) + .chain(good_boundary_state_roots) .take(count) - { + .collect::>(); + + for state_root in &state_roots_to_delete { self.delete_state(state_root); } + + state_roots_to_delete } } diff --git a/book/src/help_bn.md b/book/src/help_bn.md index 0a132bc338..dd09d83fa3 100644 --- a/book/src/help_bn.md +++ b/book/src/help_bn.md @@ -385,6 +385,9 @@ Options: Number of validators per chunk stored on disk. --slots-per-restore-point DEPRECATED. This flag has no effect. + --state-cache-headroom + Minimum number of states to cull from the state cache when it gets + full [default: 1] --state-cache-size Specifies the size of the state cache [default: 32] --suggested-fee-recipient diff --git a/consensus/fork_choice/tests/tests.rs b/consensus/fork_choice/tests/tests.rs index b224cde048..95bdee574d 100644 --- a/consensus/fork_choice/tests/tests.rs +++ b/consensus/fork_choice/tests/tests.rs @@ -25,6 +25,9 @@ pub type E = MainnetEthSpec; pub const VALIDATOR_COUNT: usize = 64; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + /// Defines some delay between when an attestation is created and when it is mutated. pub enum MutationDelay { /// No delay between creation and mutation. @@ -373,7 +376,7 @@ impl ForkChoiceTest { let state = harness .chain .store - .get_state(&state_root, None) + .get_state(&state_root, None, CACHE_STATE_IN_TESTS) .unwrap() .unwrap(); let balances = state diff --git a/consensus/state_processing/src/per_block_processing/tests.rs b/consensus/state_processing/src/per_block_processing/tests.rs index c59449634a..34e9ff120d 100644 --- a/consensus/state_processing/src/per_block_processing/tests.rs +++ b/consensus/state_processing/src/per_block_processing/tests.rs @@ -22,6 +22,9 @@ pub const VALIDATOR_COUNT: usize = 64; pub const EPOCH_OFFSET: u64 = 4; pub const NUM_ATTESTATIONS: u64 = 1; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + /// A cached set of keys. static KEYPAIRS: LazyLock> = LazyLock::new(|| generate_deterministic_keypairs(MAX_VALIDATOR_COUNT)); @@ -1114,9 +1117,10 @@ async fn block_replayer_peeking_state_roots() { .get_blinded_block(&parent_block_root) .unwrap() .unwrap(); + // Cache the state to make CI go brr. let parent_state = harness .chain - .get_state(&parent_block.state_root(), Some(parent_block.slot())) + .get_state(&parent_block.state_root(), Some(parent_block.slot()), true) .unwrap() .unwrap(); diff --git a/lighthouse/tests/beacon_node.rs b/lighthouse/tests/beacon_node.rs index 90d9fc0b49..86104ce050 100644 --- a/lighthouse/tests/beacon_node.rs +++ b/lighthouse/tests/beacon_node.rs @@ -1883,6 +1883,21 @@ fn state_cache_size_flag() { .with_config(|config| assert_eq!(config.store.state_cache_size, new_non_zero_usize(64))); } #[test] +fn state_cache_headroom_default() { + CommandLineTest::new() + .run_with_zero_port() + .with_config(|config| assert_eq!(config.store.state_cache_headroom, new_non_zero_usize(1))); +} +#[test] +fn state_cache_headroom_flag() { + CommandLineTest::new() + .flag("state-cache-headroom", Some("16")) + .run_with_zero_port() + .with_config(|config| { + assert_eq!(config.store.state_cache_headroom, new_non_zero_usize(16)) + }); +} +#[test] fn historic_state_cache_size_flag() { CommandLineTest::new() .flag("historic-state-cache-size", Some("4")) diff --git a/testing/ef_tests/src/cases/fork_choice.rs b/testing/ef_tests/src/cases/fork_choice.rs index a1c74389a7..05804d7e36 100644 --- a/testing/ef_tests/src/cases/fork_choice.rs +++ b/testing/ef_tests/src/cases/fork_choice.rs @@ -29,6 +29,9 @@ use types::{ IndexedAttestation, KzgProof, ProposerPreparationData, SignedBeaconBlock, Slot, Uint256, }; +// When set to true, cache any states fetched from the db. +pub const CACHE_STATE_IN_TESTS: bool = true; + #[derive(Default, Debug, PartialEq, Clone, Deserialize, Decode)] #[serde(deny_unknown_fields)] pub struct PowBlock { @@ -546,10 +549,15 @@ impl Tester { .unwrap() { let parent_state_root = parent_block.state_root(); + let mut state = self .harness .chain - .get_state(&parent_state_root, Some(parent_block.slot())) + .get_state( + &parent_state_root, + Some(parent_block.slot()), + CACHE_STATE_IN_TESTS, + ) .unwrap() .unwrap(); From 58482586f5be05885f38d701e08fa6a38945c70a Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Tue, 18 Mar 2025 13:10:24 +1100 Subject: [PATCH 11/20] Support Hoodi testnet (#7145) Hardcode config for the upcoming `hoodi` testnet so we can run with `--network hoodi`. --- book/src/help_bn.md | 2 +- book/src/help_general.md | 2 +- book/src/help_vc.md | 2 +- book/src/help_vm.md | 2 +- book/src/help_vm_create.md | 2 +- book/src/help_vm_import.md | 2 +- book/src/help_vm_move.md | 2 +- common/eth2_config/src/lib.rs | 20 +++ .../hoodi/boot_enr.yaml | 13 ++ .../hoodi/config.yaml | 165 ++++++++++++++++++ .../hoodi/deposit_contract_block.txt | 1 + 11 files changed, 206 insertions(+), 7 deletions(-) create mode 100644 common/eth2_network_config/built_in_network_configs/hoodi/boot_enr.yaml create mode 100644 common/eth2_network_config/built_in_network_configs/hoodi/config.yaml create mode 100644 common/eth2_network_config/built_in_network_configs/hoodi/deposit_contract_block.txt diff --git a/book/src/help_bn.md b/book/src/help_bn.md index dd09d83fa3..1942f737df 100644 --- a/book/src/help_bn.md +++ b/book/src/help_bn.md @@ -290,7 +290,7 @@ Options: monitoring-endpoint. Default: 60s --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] --network-dir Data directory for network keys. Defaults to network/ inside the beacon node dir. diff --git a/book/src/help_general.md b/book/src/help_general.md index 996b048d10..f45f552f58 100644 --- a/book/src/help_general.md +++ b/book/src/help_general.md @@ -76,7 +76,7 @@ Options: set to 0, background file logging is disabled. [default: 200] --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] -t, --testnet-dir Path to directory containing eth2_testnet specs. Defaults to a hard-coded Lighthouse testnet. Only effective if there is no existing diff --git a/book/src/help_vc.md b/book/src/help_vc.md index f3ccdf2ae3..87f47a1eca 100644 --- a/book/src/help_vc.md +++ b/book/src/help_vc.md @@ -119,7 +119,7 @@ Options: monitoring-endpoint. [default: 60] --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] --proposer-nodes Comma-separated addresses to one or more beacon node HTTP APIs. These specify nodes that are used to send beacon block proposals. A failure diff --git a/book/src/help_vm.md b/book/src/help_vm.md index 50c204f371..edc0686c45 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -73,7 +73,7 @@ Options: set to 0, background file logging is disabled. [default: 200] --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] -t, --testnet-dir Path to directory containing eth2_testnet specs. Defaults to a hard-coded Lighthouse testnet. Only effective if there is no existing diff --git a/book/src/help_vm_create.md b/book/src/help_vm_create.md index 2743117eae..99de2fc66b 100644 --- a/book/src/help_vm_create.md +++ b/book/src/help_vm_create.md @@ -82,7 +82,7 @@ Options: If present, the mnemonic will be read in from this file. --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] --output-path The path to a directory where the validator and (optionally) deposits files will be created. The directory will be created if it does not diff --git a/book/src/help_vm_import.md b/book/src/help_vm_import.md index 68aab768ae..230c38be33 100644 --- a/book/src/help_vm_import.md +++ b/book/src/help_vm_import.md @@ -65,7 +65,7 @@ Options: set to 0, background file logging is disabled. [default: 200] --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] --password Password of the keystore file. --prefer-builder-proposals diff --git a/book/src/help_vm_move.md b/book/src/help_vm_move.md index 99eee32c78..8a769d5ce5 100644 --- a/book/src/help_vm_move.md +++ b/book/src/help_vm_move.md @@ -69,7 +69,7 @@ Options: set to 0, background file logging is disabled. [default: 200] --network Name of the Eth2 chain Lighthouse will sync and follow. [possible - values: mainnet, gnosis, chiado, sepolia, holesky] + values: mainnet, gnosis, chiado, sepolia, holesky, hoodi] --prefer-builder-proposals If this flag is set, Lighthouse will always prefer blocks constructed by builders, regardless of payload value. [possible values: true, diff --git a/common/eth2_config/src/lib.rs b/common/eth2_config/src/lib.rs index 50386feb8a..017bdf288d 100644 --- a/common/eth2_config/src/lib.rs +++ b/common/eth2_config/src/lib.rs @@ -35,6 +35,17 @@ const HOLESKY_GENESIS_STATE_SOURCE: GenesisStateSource = GenesisStateSource::Url genesis_state_root: "0x0ea3f6f9515823b59c863454675fefcd1d8b4f2dbe454db166206a41fda060a0", }; +const HOODI_GENESIS_STATE_SOURCE: GenesisStateSource = GenesisStateSource::Url { + urls: &[ + // This is an AWS S3 bucket hosted by Sigma Prime. See Paul Hauner for + // more details. + "https://sigp-public-genesis-states.s3.ap-southeast-2.amazonaws.com/hoodi/", + ], + checksum: "0x7f42257ef69e055496c964a753bb07e54001ccd57ab467ef72d67af086bcfce7", + genesis_validators_root: "0x212f13fc4df078b6cb7db228f1c8307566dcecf900867401a92023d7ba99cb5f", + genesis_state_root: "0x2683ebc120f91f740c7bed4c866672d01e1ba51b4cc360297138465ee5df40f0", +}; + const CHIADO_GENESIS_STATE_SOURCE: GenesisStateSource = GenesisStateSource::Url { // No default checkpoint sources are provided. urls: &[], @@ -328,5 +339,14 @@ define_hardcoded_nets!( "holesky", // Describes how the genesis state can be obtained. HOLESKY_GENESIS_STATE_SOURCE + ), + ( + // Network name (must be unique among all networks). + hoodi, + // The name of the directory in the `eth2_network_config/built_in_network_configs` + // directory where the configuration files are located for this network. + "hoodi", + // Describes how the genesis state can be obtained. + HOODI_GENESIS_STATE_SOURCE ) ); diff --git a/common/eth2_network_config/built_in_network_configs/hoodi/boot_enr.yaml b/common/eth2_network_config/built_in_network_configs/hoodi/boot_enr.yaml new file mode 100644 index 0000000000..33eaa7e8a9 --- /dev/null +++ b/common/eth2_network_config/built_in_network_configs/hoodi/boot_enr.yaml @@ -0,0 +1,13 @@ +# hoodi consensus layer bootnodes +# --------------------------------------- +# 1. Tag nodes with maintainer +# 2. Keep nodes updated +# 3. Review PRs: check ENR duplicates, fork-digest, connection. + +# EF +- enr:-Mq4QLkmuSwbGBUph1r7iHopzRpdqE-gcm5LNZfcE-6T37OCZbRHi22bXZkaqnZ6XdIyEDTelnkmMEQB8w6NbnJUt9GGAZWaowaYh2F0dG5ldHOIABgAAAAAAACEZXRoMpDS8Zl_YAAJEAAIAAAAAAAAgmlkgnY0gmlwhNEmfKCEcXVpY4IyyIlzZWNwMjU2azGhA0hGa4jZJZYQAS-z6ZFK-m4GCFnWS8wfjO0bpSQn6hyEiHN5bmNuZXRzAIN0Y3CCIyiDdWRwgiMo +- enr:-Ku4QLVumWTwyOUVS4ajqq8ZuZz2ik6t3Gtq0Ozxqecj0qNZWpMnudcvTs-4jrlwYRQMQwBS8Pvtmu4ZPP2Lx3i2t7YBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhNEmfKCJc2VjcDI1NmsxoQLdRlI8aCa_ELwTJhVN8k7km7IDc3pYu-FMYBs5_FiigIN1ZHCCIyk +- enr:-LK4QAYuLujoiaqCAs0-qNWj9oFws1B4iy-Hff1bRB7wpQCYSS-IIMxLWCn7sWloTJzC1SiH8Y7lMQ5I36ynGV1ASj4Eh2F0dG5ldHOIYAAAAAAAAACEZXRoMpDS8Zl_YAAJEAAIAAAAAAAAgmlkgnY0gmlwhIbRilSJc2VjcDI1NmsxoQOmI5MlAu3f5WEThAYOqoygpS2wYn0XS5NV2aYq7T0a04N0Y3CCIyiDdWRwgiMo +- enr:-Ku4QIC89sMC0o-irosD4_23lJJ4qCGOvdUz7SmoShWx0k6AaxCFTKviEHa-sa7-EzsiXpDp0qP0xzX6nKdXJX3X-IQBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhIbRilSJc2VjcDI1NmsxoQK_m0f1DzDc9Cjrspm36zuRa7072HSiMGYWLsKiVSbP34N1ZHCCIyk +- enr:-Ku4QNkWjw5tNzo8DtWqKm7CnDdIq_y7xppD6c1EZSwjB8rMOkSFA1wJPLoKrq5UvA7wcxIotH6Usx3PAugEN2JMncIBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpBd9cEGEAAJEP__________gmlkgnY0gmlwhIbHuBeJc2VjcDI1NmsxoQP3FwrhFYB60djwRjAoOjttq6du94DtkQuaN99wvgqaIYN1ZHCCIyk +- enr:-OS4QMJGE13xEROqvKN1xnnt7U-noc51VXyM6wFMuL9LMhQDfo1p1dF_zFdS4OsnXz_vIYk-nQWnqJMWRDKvkSK6_CwDh2F0dG5ldHOIAAAAADAAAACGY2xpZW502IpMaWdodGhvdXNljDcuMC4wLWJldGEuM4RldGgykNLxmX9gAAkQAAgAAAAAAACCaWSCdjSCaXCEhse4F4RxdWljgiMqiXNlY3AyNTZrMaECef77P8k5l3PC_raLw42OAzdXfxeQ-58BJriNaqiRGJSIc3luY25ldHMAg3RjcIIjKIN1ZHCCIyg diff --git a/common/eth2_network_config/built_in_network_configs/hoodi/config.yaml b/common/eth2_network_config/built_in_network_configs/hoodi/config.yaml new file mode 100644 index 0000000000..19d7797424 --- /dev/null +++ b/common/eth2_network_config/built_in_network_configs/hoodi/config.yaml @@ -0,0 +1,165 @@ +# Extends the mainnet preset +PRESET_BASE: mainnet +CONFIG_NAME: hoodi + +# Genesis +# --------------------------------------------------------------- +# `2**14` (= 16,384) +MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 16384 +# 2025-Mar-17 12:00:00 PM UTC +MIN_GENESIS_TIME: 1742212800 +GENESIS_FORK_VERSION: 0x10000910 +GENESIS_DELAY: 600 + + +# Forking +# --------------------------------------------------------------- +# Some forks are disabled for now: +# - These may be re-assigned to another fork-version later +# - Temporarily set to max uint64 value: 2**64 - 1 + +# Altair +ALTAIR_FORK_VERSION: 0x20000910 +ALTAIR_FORK_EPOCH: 0 +# Merge +BELLATRIX_FORK_VERSION: 0x30000910 +BELLATRIX_FORK_EPOCH: 0 +TERMINAL_TOTAL_DIFFICULTY: 0 +TERMINAL_BLOCK_HASH: 0x0000000000000000000000000000000000000000000000000000000000000000 +TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: 18446744073709551615 + +# Capella +CAPELLA_FORK_VERSION: 0x40000910 +CAPELLA_FORK_EPOCH: 0 + +# DENEB +DENEB_FORK_VERSION: 0x50000910 +DENEB_FORK_EPOCH: 0 + +# Electra +ELECTRA_FORK_VERSION: 0x60000910 +ELECTRA_FORK_EPOCH: 2048 + +# Fulu +FULU_FORK_VERSION: 0x70000910 +FULU_FORK_EPOCH: 18446744073709551615 + + +# Time parameters +# --------------------------------------------------------------- +# 12 seconds +SECONDS_PER_SLOT: 12 +# 14 (estimate from Eth1 mainnet) +SECONDS_PER_ETH1_BLOCK: 12 +# 2**8 (= 256) epochs ~27 hours +MIN_VALIDATOR_WITHDRAWABILITY_DELAY: 256 +# 2**8 (= 256) epochs ~27 hours +SHARD_COMMITTEE_PERIOD: 256 +# 2**11 (= 2,048) Eth1 blocks ~8 hours +ETH1_FOLLOW_DISTANCE: 2048 + +# Validator cycle +# --------------------------------------------------------------- +# 2**2 (= 4) +INACTIVITY_SCORE_BIAS: 4 +# 2**4 (= 16) +INACTIVITY_SCORE_RECOVERY_RATE: 16 +# 2**4 * 10**9 (= 16,000,000,000) Gwei +EJECTION_BALANCE: 16000000000 +# 2**2 (= 4) +MIN_PER_EPOCH_CHURN_LIMIT: 4 +# 2**16 (= 65,536) +CHURN_LIMIT_QUOTIENT: 65536 +# [New in Deneb:EIP7514] 2**3 (= 8) +MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: 8 + +# Fork choice +# --------------------------------------------------------------- +# 40% +PROPOSER_SCORE_BOOST: 40 +# 20% +REORG_HEAD_WEIGHT_THRESHOLD: 20 +# 160% +REORG_PARENT_WEIGHT_THRESHOLD: 160 +# `2` epochs +REORG_MAX_EPOCHS_SINCE_FINALIZATION: 2 + +# Deposit contract +# --------------------------------------------------------------- +DEPOSIT_CHAIN_ID: 560048 +DEPOSIT_NETWORK_ID: 560048 +DEPOSIT_CONTRACT_ADDRESS: 0x00000000219ab540356cBB839Cbe05303d7705Fa + +# Networking +# --------------------------------------------------------------- +# `10 * 2**20` (= 10485760, 10 MiB) +GOSSIP_MAX_SIZE: 10485760 +# `2**10` (= 1024) +MAX_REQUEST_BLOCKS: 1024 +# `2**8` (= 256) +EPOCHS_PER_SUBNET_SUBSCRIPTION: 256 +# `MIN_VALIDATOR_WITHDRAWABILITY_DELAY + CHURN_LIMIT_QUOTIENT // 2` (= 33024, ~5 months) +MIN_EPOCHS_FOR_BLOCK_REQUESTS: 33024 +# `10 * 2**20` (=10485760, 10 MiB) +MAX_CHUNK_SIZE: 10485760 +# 5s +TTFB_TIMEOUT: 5 +# 10s +RESP_TIMEOUT: 10 +ATTESTATION_PROPAGATION_SLOT_RANGE: 32 +# 500ms +MAXIMUM_GOSSIP_CLOCK_DISPARITY: 500 +MESSAGE_DOMAIN_INVALID_SNAPPY: 0x00000000 +MESSAGE_DOMAIN_VALID_SNAPPY: 0x01000000 +# 2 subnets per node +SUBNETS_PER_NODE: 2 +# 2**8 (= 64) +ATTESTATION_SUBNET_COUNT: 64 +ATTESTATION_SUBNET_EXTRA_BITS: 0 +# ceillog2(ATTESTATION_SUBNET_COUNT) + ATTESTATION_SUBNET_EXTRA_BITS +ATTESTATION_SUBNET_PREFIX_BITS: 6 + +# Deneb +# `2**7` (=128) +MAX_REQUEST_BLOCKS_DENEB: 128 +# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK +MAX_REQUEST_BLOB_SIDECARS: 768 +# `2**12` (= 4096 epochs, ~18 days) +MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: 4096 +# `6` +BLOB_SIDECAR_SUBNET_COUNT: 6 +## `uint64(6)` +MAX_BLOBS_PER_BLOCK: 6 + +# Electra +# 2**7 * 10**9 (= 128,000,000,000) +MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: 128000000000 +# 2**8 * 10**9 (= 256,000,000,000) +MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: 256000000000 +# `9` +BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: 9 +# `uint64(6)` +TARGET_BLOBS_PER_BLOCK_ELECTRA: 6 +# `uint64(9)` +MAX_BLOBS_PER_BLOCK_ELECTRA: 9 +# MAX_REQUEST_BLOCKS_DENEB * MAX_BLOBS_PER_BLOCK_ELECTRA +MAX_REQUEST_BLOB_SIDECARS_ELECTRA: 1152 + +# Whisk +# `Epoch(2**8)` +WHISK_EPOCHS_PER_SHUFFLING_PHASE: 256 +# `Epoch(2)` +WHISK_PROPOSER_SELECTION_GAP: 2 + +# Fulu +NUMBER_OF_COLUMNS: 128 +NUMBER_OF_CUSTODY_GROUPS: 128 +DATA_COLUMN_SIDECAR_SUBNET_COUNT: 128 +MAX_REQUEST_DATA_COLUMN_SIDECARS: 16384 +SAMPLES_PER_SLOT: 8 +CUSTODY_REQUIREMENT: 4 +MAX_BLOBS_PER_BLOCK_FULU: 12 +MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 4096 + +# EIP7732 +MAX_REQUEST_PAYLOADS: 128 diff --git a/common/eth2_network_config/built_in_network_configs/hoodi/deposit_contract_block.txt b/common/eth2_network_config/built_in_network_configs/hoodi/deposit_contract_block.txt new file mode 100644 index 0000000000..573541ac97 --- /dev/null +++ b/common/eth2_network_config/built_in_network_configs/hoodi/deposit_contract_block.txt @@ -0,0 +1 @@ +0 From 27aabe8159912bee00e4acde3eb9f76ddc79a1a0 Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Mon, 17 Mar 2025 23:21:05 -0600 Subject: [PATCH 12/20] Pseudo finalization endpoint (#7103) This is a backport of: - https://github.com/sigp/lighthouse/pull/7059 - https://github.com/sigp/lighthouse/pull/7071 For: - https://github.com/sigp/lighthouse/issues/7039 Introduce a new lighthouse endpoint that allows a user to force a pseudo finalization. This migrates data to the freezer db and prunes sidechains which may help reduce disk space issues on non finalized networks like Holesky We also ban peers that send us blocks that conflict with the manually finalized checkpoint. There were some CI fixes in https://github.com/sigp/lighthouse/pull/7071 that I tried including here Co-authored with: @jimmygchen @pawanjay176 @michaelsproul --- beacon_node/beacon_chain/src/beacon_chain.rs | 41 +++- .../beacon_chain/src/block_verification.rs | 17 +- beacon_node/beacon_chain/src/errors.rs | 7 +- beacon_node/beacon_chain/src/migrate.rs | 60 +++++- beacon_node/beacon_chain/tests/tests.rs | 186 +++++++++++++++++- beacon_node/http_api/src/lib.rs | 40 +++- .../network_beacon_processor/sync_methods.rs | 13 ++ common/eth2/src/types.rs | 7 + consensus/fork_choice/src/fork_choice.rs | 5 + 9 files changed, 353 insertions(+), 23 deletions(-) diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index b24211009e..f73c17f79c 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -42,7 +42,7 @@ use crate::light_client_optimistic_update_verification::{ Error as LightClientOptimisticUpdateError, VerifiedLightClientOptimisticUpdate, }; use crate::light_client_server_cache::LightClientServerCache; -use crate::migrate::BackgroundMigrator; +use crate::migrate::{BackgroundMigrator, ManualFinalizationNotification}; use crate::naive_aggregation_pool::{ AggregatedAttestationMap, Error as NaiveAggregationError, NaiveAggregationPool, SyncContributionAggregateMap, @@ -118,8 +118,8 @@ use std::sync::Arc; use std::time::Duration; use store::iter::{BlockRootsIterator, ParentRootBlockIterator, StateRootsIterator}; use store::{ - BlobSidecarListFromRoot, DatabaseBlock, Error as DBError, HotColdDB, KeyValueStore, - KeyValueStoreOp, StoreItem, StoreOp, + BlobSidecarListFromRoot, DatabaseBlock, Error as DBError, HotColdDB, HotStateSummary, + KeyValueStore, KeyValueStoreOp, StoreItem, StoreOp, }; use task_executor::{ShutdownReason, TaskExecutor}; use tokio::sync::oneshot; @@ -1711,6 +1711,41 @@ impl BeaconChain { } } + pub fn manually_finalize_state( + &self, + state_root: Hash256, + checkpoint: Checkpoint, + ) -> Result<(), Error> { + let HotStateSummary { + slot, + latest_block_root, + .. + } = self + .store + .load_hot_state_summary(&state_root) + .map_err(BeaconChainError::DBError)? + .ok_or(BeaconChainError::MissingHotStateSummary(state_root))?; + + if slot != checkpoint.epoch.start_slot(T::EthSpec::slots_per_epoch()) + || latest_block_root != *checkpoint.root + { + return Err(BeaconChainError::InvalidCheckpoint { + state_root, + checkpoint, + }); + } + + let notif = ManualFinalizationNotification { + state_root: state_root.into(), + checkpoint, + head_tracker: self.head_tracker.clone(), + genesis_block_root: self.genesis_block_root, + }; + + self.store_migrator.process_manual_finalization(notif); + Ok(()) + } + /// Returns an aggregated `Attestation`, if any, that has a matching `attestation.data`. /// /// The attestation will be obtained from `self.naive_aggregation_pool`. diff --git a/beacon_node/beacon_chain/src/block_verification.rs b/beacon_node/beacon_chain/src/block_verification.rs index 1bac6cac0a..4a5282a1d7 100644 --- a/beacon_node/beacon_chain/src/block_verification.rs +++ b/beacon_node/beacon_chain/src/block_verification.rs @@ -1767,7 +1767,22 @@ pub fn check_block_is_finalized_checkpoint_or_descendant< fork_choice: &BeaconForkChoice, block: B, ) -> Result { - if fork_choice.is_finalized_checkpoint_or_descendant(block.parent_root()) { + // If we have a split block newer than finalization then we also ban blocks which are not + // descended from that split block. It's important not to try checking `is_descendant` if + // finality is ahead of the split and the split block has been pruned, as `is_descendant` will + // return `false` in this case. + let finalized_slot = fork_choice + .finalized_checkpoint() + .epoch + .start_slot(T::EthSpec::slots_per_epoch()); + let split = chain.store.get_split_info(); + let is_descendant_from_split_block = split.slot == 0 + || split.slot <= finalized_slot + || fork_choice.is_descendant(split.block_root, block.parent_root()); + + if fork_choice.is_finalized_checkpoint_or_descendant(block.parent_root()) + && is_descendant_from_split_block + { Ok(block) } else { // If fork choice does *not* consider the parent to be a descendant of the finalized block, diff --git a/beacon_node/beacon_chain/src/errors.rs b/beacon_node/beacon_chain/src/errors.rs index 2e13ab4090..8509c52c8a 100644 --- a/beacon_node/beacon_chain/src/errors.rs +++ b/beacon_node/beacon_chain/src/errors.rs @@ -61,6 +61,7 @@ pub enum BeaconChainError { ForkChoiceStoreError(ForkChoiceStoreError), MissingBeaconBlock(Hash256), MissingBeaconState(Hash256), + MissingHotStateSummary(Hash256), SlotProcessingError(SlotProcessingError), EpochProcessingError(EpochProcessingError), StateAdvanceError(StateAdvanceError), @@ -181,9 +182,9 @@ pub enum BeaconChainError { execution_block_hash: Option, }, ForkchoiceUpdate(execution_layer::Error), - FinalizedCheckpointMismatch { - head_state: Checkpoint, - fork_choice: Hash256, + InvalidCheckpoint { + state_root: Hash256, + checkpoint: Checkpoint, }, InvalidSlot(Slot), HeadBlockNotFullyVerified { diff --git a/beacon_node/beacon_chain/src/migrate.rs b/beacon_node/beacon_chain/src/migrate.rs index a8543fab9b..d4ee0fc7c1 100644 --- a/beacon_node/beacon_chain/src/migrate.rs +++ b/beacon_node/beacon_chain/src/migrate.rs @@ -124,14 +124,22 @@ pub enum Notification { Finalization(FinalizationNotification), Reconstruction, PruneBlobs(Epoch), + ManualFinalization(ManualFinalizationNotification), +} + +pub struct ManualFinalizationNotification { + pub state_root: BeaconStateHash, + pub checkpoint: Checkpoint, + pub head_tracker: Arc, + pub genesis_block_root: Hash256, } pub struct FinalizationNotification { - finalized_state_root: BeaconStateHash, - finalized_checkpoint: Checkpoint, - head_tracker: Arc, - prev_migration: Arc>, - genesis_block_root: Hash256, + pub finalized_state_root: BeaconStateHash, + pub finalized_checkpoint: Checkpoint, + pub head_tracker: Arc, + pub prev_migration: Arc>, + pub genesis_block_root: Hash256, } impl, Cold: ItemStore> BackgroundMigrator { @@ -190,6 +198,14 @@ impl, Cold: ItemStore> BackgroundMigrator, Cold: ItemStore> BackgroundMigrator>, + notif: ManualFinalizationNotification, + log: &Logger, + ) { + // We create a "dummy" prev migration + let prev_migration = PrevMigration { + epoch: Epoch::new(1), + epochs_per_migration: 2, + }; + let notif = FinalizationNotification { + finalized_state_root: notif.state_root, + finalized_checkpoint: notif.checkpoint, + head_tracker: notif.head_tracker, + prev_migration: Arc::new(prev_migration.into()), + genesis_block_root: notif.genesis_block_root, + }; + Self::run_migration(db, notif, log); + } + /// Perform the actual work of `process_finalization`. fn run_migration( db: Arc>, @@ -423,16 +459,27 @@ impl, Cold: ItemStore> BackgroundMigrator reconstruction_notif = Some(notif), Notification::Finalization(fin) => finalization_notif = Some(fin), + Notification::ManualFinalization(fin) => manual_finalization_notif = Some(fin), Notification::PruneBlobs(dab) => prune_blobs_notif = Some(dab), } // Read the rest of the messages in the channel, taking the best of each type. for notif in rx.try_iter() { match notif { Notification::Reconstruction => reconstruction_notif = Some(notif), + Notification::ManualFinalization(fin) => { + if let Some(current) = manual_finalization_notif.as_mut() { + if fin.checkpoint.epoch > current.checkpoint.epoch { + *current = fin; + } + } else { + manual_finalization_notif = Some(fin); + } + } Notification::Finalization(fin) => { if let Some(current) = finalization_notif.as_mut() { if fin.finalized_checkpoint.epoch @@ -455,6 +502,9 @@ impl, Cold: ItemStore> BackgroundMigrator> = LazyLock::new(|| types::test_utils::generate_deterministic_keypairs(VALIDATOR_COUNT)); fn get_harness(validator_count: usize) -> BeaconChainHarness> { + get_harness_with_config( + validator_count, + ChainConfig { + reconstruct_historic_states: true, + ..Default::default() + }, + ) +} + +fn get_harness_with_config( + validator_count: usize, + chain_config: ChainConfig, +) -> BeaconChainHarness> { let harness = BeaconChainHarness::builder(MinimalEthSpec) .default_spec() - .chain_config(ChainConfig { - reconstruct_historic_states: true, - ..ChainConfig::default() - }) + .chain_config(chain_config) .keypairs(KEYPAIRS[0..validator_count].to_vec()) .fresh_ephemeral_store() .mock_execution_layer() @@ -869,3 +881,165 @@ async fn block_roots_skip_slot_behaviour() { "WhenSlotSkipped::Prev should return None on a future slot" ); } + +async fn pseudo_finalize_test_generic( + epochs_per_migration: u64, + expect_true_finalization_migration: bool, +) { + // This test ensures that after pseudo finalization, we can still finalize the chain without issues + let num_blocks_produced = MinimalEthSpec::slots_per_epoch() * 5; + + let chain_config = ChainConfig { + reconstruct_historic_states: true, + epochs_per_migration, + ..Default::default() + }; + let harness = get_harness_with_config(VALIDATOR_COUNT, chain_config); + + let one_third = VALIDATOR_COUNT / 3; + let attesters = (0..one_third).collect(); + + // extend the chain, but don't finalize + harness + .extend_chain( + num_blocks_produced as usize, + BlockStrategy::OnCanonicalHead, + AttestationStrategy::SomeValidators(attesters), + ) + .await; + + harness.advance_slot(); + + let head = harness.chain.head_snapshot(); + let state = &head.beacon_state; + let split = harness.chain.store.get_split_info(); + + assert_eq!( + state.slot(), + num_blocks_produced, + "head should be at the current slot" + ); + assert_eq!( + state.current_epoch(), + num_blocks_produced / MinimalEthSpec::slots_per_epoch(), + "head should be at the expected epoch" + ); + assert_eq!( + state.current_justified_checkpoint().epoch, + 0, + "There should be no justified checkpoint" + ); + assert_eq!( + state.finalized_checkpoint().epoch, + 0, + "There should be no finalized checkpoint" + ); + assert_eq!(split.slot, 0, "Our split point should be unset"); + + let checkpoint = Checkpoint { + epoch: head.beacon_state.current_epoch(), + root: head.beacon_block_root, + }; + + // pseudo finalize + harness + .chain + .manually_finalize_state(head.beacon_state_root(), checkpoint) + .unwrap(); + + let split = harness.chain.store.get_split_info(); + let pseudo_finalized_slot = split.slot; + + assert_eq!( + state.current_justified_checkpoint().epoch, + 0, + "We pseudo finalized, but our justified checkpoint should still be unset" + ); + assert_eq!( + state.finalized_checkpoint().epoch, + 0, + "We pseudo finalized, but our finalized checkpoint should still be unset" + ); + assert_eq!( + split.slot, + head.beacon_state.slot(), + "We pseudo finalized, our split point should be at the current head slot" + ); + + // finalize the chain + harness + .extend_chain( + num_blocks_produced as usize, + BlockStrategy::OnCanonicalHead, + AttestationStrategy::AllValidators, + ) + .await; + + harness.advance_slot(); + + let head = harness.chain.head_snapshot(); + let state = &head.beacon_state; + let split = harness.chain.store.get_split_info(); + + assert_eq!( + state.slot(), + num_blocks_produced * 2, + "head should be at the current slot" + ); + assert_eq!( + state.current_epoch(), + (num_blocks_produced * 2) / MinimalEthSpec::slots_per_epoch(), + "head should be at the expected epoch" + ); + assert_eq!( + state.current_justified_checkpoint().epoch, + state.current_epoch() - 1, + "the head should be justified one behind the current epoch" + ); + let finalized_epoch = state.finalized_checkpoint().epoch; + assert_eq!( + finalized_epoch, + state.current_epoch() - 2, + "the head should be finalized two behind the current epoch" + ); + + let expected_split_slot = if pseudo_finalized_slot.epoch(E::slots_per_epoch()) + + epochs_per_migration + > finalized_epoch + { + pseudo_finalized_slot + } else { + finalized_epoch.start_slot(E::slots_per_epoch()) + }; + assert_eq!( + split.slot, expected_split_slot, + "We finalized, our split point should be updated according to epochs_per_migration" + ); + + // In the case that we did not process the true finalization migration (due to + // epochs_per_migration), check that the chain finalized *despite* the absence of the split + // block in fork choice. + // This is a regression test for https://github.com/sigp/lighthouse/pull/7105 + if !expect_true_finalization_migration { + assert_eq!(expected_split_slot, pseudo_finalized_slot); + assert!(!harness + .chain + .canonical_head + .fork_choice_read_lock() + .contains_block(&split.block_root)); + } +} + +#[tokio::test] +async fn pseudo_finalize_basic() { + let epochs_per_migration = 0; + let expect_true_migration = true; + pseudo_finalize_test_generic(epochs_per_migration, expect_true_migration).await; +} + +#[tokio::test] +async fn pseudo_finalize_with_lagging_split_update() { + let epochs_per_migration = 10; + let expect_true_migration = false; + pseudo_finalize_test_generic(epochs_per_migration, expect_true_migration).await; +} diff --git a/beacon_node/http_api/src/lib.rs b/beacon_node/http_api/src/lib.rs index 0d89ca76ac..4ccf448b68 100644 --- a/beacon_node/http_api/src/lib.rs +++ b/beacon_node/http_api/src/lib.rs @@ -86,11 +86,11 @@ use tokio_stream::{ }; use types::{ fork_versioned_response::EmptyMetadata, Attestation, AttestationData, AttestationShufflingId, - AttesterSlashing, BeaconStateError, ChainSpec, CommitteeCache, ConfigAndPreset, Epoch, EthSpec, - ForkName, ForkVersionedResponse, Hash256, ProposerPreparationData, ProposerSlashing, - RelativeEpoch, SignedAggregateAndProof, SignedBlindedBeaconBlock, SignedBlsToExecutionChange, - SignedContributionAndProof, SignedValidatorRegistrationData, SignedVoluntaryExit, Slot, - SyncCommitteeMessage, SyncContributionData, + AttesterSlashing, BeaconStateError, ChainSpec, Checkpoint, CommitteeCache, ConfigAndPreset, + Epoch, EthSpec, ForkName, ForkVersionedResponse, Hash256, ProposerPreparationData, + ProposerSlashing, RelativeEpoch, SignedAggregateAndProof, SignedBlindedBeaconBlock, + SignedBlsToExecutionChange, SignedContributionAndProof, SignedValidatorRegistrationData, + SignedVoluntaryExit, Slot, SyncCommitteeMessage, SyncContributionData, }; use validator::pubkey_to_validator_index; use version::{ @@ -4076,6 +4076,35 @@ pub fn serve( }, ); + // POST lighthouse/finalize + let post_lighthouse_finalize = warp::path("lighthouse") + .and(warp::path("finalize")) + .and(warp::path::end()) + .and(warp_utils::json::json()) + .and(task_spawner_filter.clone()) + .and(chain_filter.clone()) + .then( + |request_data: api_types::ManualFinalizationRequestData, + task_spawner: TaskSpawner, + chain: Arc>| { + task_spawner.blocking_json_task(Priority::P0, move || { + let checkpoint = Checkpoint { + epoch: request_data.epoch, + root: request_data.block_root, + }; + + chain + .manually_finalize_state(request_data.state_root, checkpoint) + .map(|_| api_types::GenericResponse::from(request_data)) + .map_err(|e| { + warp_utils::reject::custom_bad_request(format!( + "Failed to finalize state due to error: {e:?}" + )) + }) + }) + }, + ); + // POST lighthouse/liveness let post_lighthouse_liveness = warp::path("lighthouse") .and(warp::path("liveness")) @@ -4848,6 +4877,7 @@ pub fn serve( .uor(post_lighthouse_block_rewards) .uor(post_lighthouse_ui_validator_metrics) .uor(post_lighthouse_ui_validator_info) + .uor(post_lighthouse_finalize) .recover(warp_utils::reject::handle_rejection), ), ) diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index eb03d3c01b..6b8ed607ab 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -740,6 +740,19 @@ impl NetworkBeaconProcessor { debug!(self.log, "Finalized or earlier block processed";); Ok(()) } + BlockError::NotFinalizedDescendant { block_parent_root } => { + debug!( + self.log, + "Not syncing to a chain that conflicts with the canonical or manual finalized checkpoint" + ); + Err(ChainSegmentFailed { + message: format!( + "Block with parent_root {} conflicts with our checkpoint state", + block_parent_root + ), + peer_action: Some(PeerAction::Fatal), + }) + } BlockError::GenesisBlock => { debug!(self.log, "Genesis block was processed"); Ok(()) diff --git a/common/eth2/src/types.rs b/common/eth2/src/types.rs index 59374f629d..7d70d242be 100644 --- a/common/eth2/src/types.rs +++ b/common/eth2/src/types.rs @@ -1424,6 +1424,13 @@ pub struct StandardLivenessResponseData { pub is_live: bool, } +#[derive(Debug, Serialize, Deserialize)] +pub struct ManualFinalizationRequestData { + pub state_root: Hash256, + pub epoch: Epoch, + pub block_root: Hash256, +} + #[derive(Debug, Serialize, Deserialize)] pub struct LivenessRequestData { pub epoch: Epoch, diff --git a/consensus/fork_choice/src/fork_choice.rs b/consensus/fork_choice/src/fork_choice.rs index 4c25be950b..ddd5923849 100644 --- a/consensus/fork_choice/src/fork_choice.rs +++ b/consensus/fork_choice/src/fork_choice.rs @@ -1255,6 +1255,11 @@ where .is_finalized_checkpoint_or_descendant::(block_root) } + pub fn is_descendant(&self, ancestor_root: Hash256, descendant_root: Hash256) -> bool { + self.proto_array + .is_descendant(ancestor_root, descendant_root) + } + /// Returns `Ok(true)` if `block_root` has been imported optimistically or deemed invalid. /// /// Returns `Ok(false)` if `block_root`'s execution payload has been elected as fully VALID, if From ed1b7689aeb6ef416f106c56fdd8fa9772e684c6 Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Tue, 18 Mar 2025 00:29:12 -0600 Subject: [PATCH 13/20] Manual compaction endpoint backport (#7104) Backports: - https://github.com/sigp/lighthouse/pull/7072 To: - https://github.com/sigp/lighthouse/issues/7039 #7103 should be merged first This PR introduces an endpoint that allows users to manually trigger background compaction. --- beacon_node/beacon_chain/src/beacon_chain.rs | 4 ++++ beacon_node/beacon_chain/src/migrate.rs | 24 ++++++++++++++++++++ beacon_node/http_api/src/lib.rs | 18 +++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index f73c17f79c..24f83179f6 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -1711,6 +1711,10 @@ impl BeaconChain { } } + pub fn manually_compact_database(&self) { + self.store_migrator.process_manual_compaction(); + } + pub fn manually_finalize_state( &self, state_root: Hash256, diff --git a/beacon_node/beacon_chain/src/migrate.rs b/beacon_node/beacon_chain/src/migrate.rs index d4ee0fc7c1..c7b4ba0796 100644 --- a/beacon_node/beacon_chain/src/migrate.rs +++ b/beacon_node/beacon_chain/src/migrate.rs @@ -125,6 +125,7 @@ pub enum Notification { Reconstruction, PruneBlobs(Epoch), ManualFinalization(ManualFinalizationNotification), + ManualCompaction, } pub struct ManualFinalizationNotification { @@ -198,6 +199,14 @@ impl, Cold: ItemStore> BackgroundMigrator, Cold: ItemStore> BackgroundMigrator>, log: &Logger) { + debug!(log, "Running manual compaction"); + if let Err(e) = db.compact() { + warn!(log, "Database compaction failed"; "error" => format!("{:?}", e)); + } else { + debug!(log, "Manual compaction completed"); + } + } + /// Spawn a new child thread to run the migration process. /// /// Return a channel handle for sending requests to the thread. @@ -460,17 +478,20 @@ impl, Cold: ItemStore> BackgroundMigrator reconstruction_notif = Some(notif), Notification::Finalization(fin) => finalization_notif = Some(fin), Notification::ManualFinalization(fin) => manual_finalization_notif = Some(fin), Notification::PruneBlobs(dab) => prune_blobs_notif = Some(dab), + Notification::ManualCompaction => manual_compaction_notif = Some(notif), } // Read the rest of the messages in the channel, taking the best of each type. for notif in rx.try_iter() { match notif { Notification::Reconstruction => reconstruction_notif = Some(notif), + Notification::ManualCompaction => manual_compaction_notif = Some(notif), Notification::ManualFinalization(fin) => { if let Some(current) = manual_finalization_notif.as_mut() { if fin.checkpoint.epoch > current.checkpoint.epoch { @@ -511,6 +532,9 @@ impl, Cold: ItemStore> BackgroundMigrator( }, ); + // POST lighthouse/compaction + let post_lighthouse_compaction = warp::path("lighthouse") + .and(warp::path("compaction")) + .and(warp::path::end()) + .and(task_spawner_filter.clone()) + .and(chain_filter.clone()) + .then( + |task_spawner: TaskSpawner, chain: Arc>| { + task_spawner.blocking_json_task(Priority::P0, move || { + chain.manually_compact_database(); + Ok(api_types::GenericResponse::from(String::from( + "Triggered manual compaction", + ))) + }) + }, + ); + // POST lighthouse/liveness let post_lighthouse_liveness = warp::path("lighthouse") .and(warp::path("liveness")) @@ -4878,6 +4895,7 @@ pub fn serve( .uor(post_lighthouse_ui_validator_metrics) .uor(post_lighthouse_ui_validator_info) .uor(post_lighthouse_finalize) + .uor(post_lighthouse_compaction) .recover(warp_utils::reject::handle_rejection), ), ) From e4c98054383c19ea32f59155b1f0eee6e537063c Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Wed, 19 Mar 2025 07:39:28 -0600 Subject: [PATCH 14/20] Reject attestations to blocks prior to the split (#7084) --- .../src/attestation_verification.rs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/beacon_node/beacon_chain/src/attestation_verification.rs b/beacon_node/beacon_chain/src/attestation_verification.rs index 00e8615487..673a42392d 100644 --- a/beacon_node/beacon_chain/src/attestation_verification.rs +++ b/beacon_node/beacon_chain/src/attestation_verification.rs @@ -1128,6 +1128,12 @@ fn verify_head_block_is_known( } } + if !verify_attestation_is_finalized_checkpoint_or_descendant(attestation.data(), chain) { + return Err(Error::HeadBlockFinalized { + beacon_block_root: attestation.data().beacon_block_root, + }); + } + Ok(block) } else if chain.is_pre_finalization_block(attestation.data().beacon_block_root)? { Err(Error::HeadBlockFinalized { @@ -1361,6 +1367,29 @@ pub fn verify_committee_index(attestation: AttestationRef) -> Res Ok(()) } +fn verify_attestation_is_finalized_checkpoint_or_descendant( + attestation_data: &AttestationData, + chain: &BeaconChain, +) -> bool { + // If we have a split block newer than finalization then we also ban attestations which are not + // descended from that split block. It's important not to try checking `is_descendant` if + // finality is ahead of the split and the split block has been pruned, as `is_descendant` will + // return `false` in this case. + let fork_choice = chain.canonical_head.fork_choice_read_lock(); + let attestation_block_root = attestation_data.beacon_block_root; + let finalized_slot = fork_choice + .finalized_checkpoint() + .epoch + .start_slot(T::EthSpec::slots_per_epoch()); + let split = chain.store.get_split_info(); + let is_descendant_from_split_block = split.slot == 0 + || split.slot <= finalized_slot + || fork_choice.is_descendant(split.block_root, attestation_block_root); + + fork_choice.is_finalized_checkpoint_or_descendant(attestation_block_root) + && is_descendant_from_split_block +} + /// Assists in readability. type CommitteesPerSlot = u64; From 76d8984f8f7e6c3204313c63dd756365d8d86ab3 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Thu, 20 Mar 2025 02:38:27 +1100 Subject: [PATCH 15/20] Update ring to 0.17.14 to fix build compat (#7164) Cross builds were failing since: - https://github.com/sigp/lighthouse/pull/7086 This seems to have been due to a regression upstream in `ring` which is noted in the v0.17.14 release notes. I'm hoping that updating remedies it. > Compatibility with GNU binutils 2.29 (used on Amazon Linux 2), and probably even earlier versions, was restored. It is expected that ring 0.17.14 will build on all the systems that 0.17.12 would build on. https://github.com/briansmith/ring/blob/main/RELEASES.md#version-01714-2025-03-11 --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c77f38c142..2dbfdd235f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7457,9 +7457,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", From 04868027a66957429e66eb5b22973672f7ce921b Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Thu, 20 Mar 2025 16:12:19 +1100 Subject: [PATCH 16/20] Release v7.0.0-beta.4 (#7162) New release for Hoodi testnet including clean versions of fixes from `holesky-rescue`. --- Cargo.lock | 8 ++++---- beacon_node/Cargo.toml | 2 +- boot_node/Cargo.toml | 2 +- common/lighthouse_version/src/lib.rs | 6 +++--- lcli/Cargo.toml | 2 +- lighthouse/Cargo.toml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2dbfdd235f..ac4248319f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -860,7 +860,7 @@ dependencies = [ [[package]] name = "beacon_node" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" dependencies = [ "account_utils", "beacon_chain", @@ -1108,7 +1108,7 @@ dependencies = [ [[package]] name = "boot_node" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" dependencies = [ "beacon_node", "bytes", @@ -4811,7 +4811,7 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lcli" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" dependencies = [ "account_utils", "beacon_chain", @@ -5366,7 +5366,7 @@ dependencies = [ [[package]] name = "lighthouse" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" dependencies = [ "account_manager", "account_utils", diff --git a/beacon_node/Cargo.toml b/beacon_node/Cargo.toml index f6948e8743..06ef24e90c 100644 --- a/beacon_node/Cargo.toml +++ b/beacon_node/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "beacon_node" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" authors = [ "Paul Hauner ", "Age Manning "] edition = { workspace = true } diff --git a/common/lighthouse_version/src/lib.rs b/common/lighthouse_version/src/lib.rs index cfffdbbb09..1c62cd7b8a 100644 --- a/common/lighthouse_version/src/lib.rs +++ b/common/lighthouse_version/src/lib.rs @@ -17,8 +17,8 @@ pub const VERSION: &str = git_version!( // NOTE: using --match instead of --exclude for compatibility with old Git "--match=thiswillnevermatchlol" ], - prefix = "Lighthouse/v7.0.0-beta.0-", - fallback = "Lighthouse/v7.0.0-beta.0" + prefix = "Lighthouse/v7.0.0-beta.4-", + fallback = "Lighthouse/v7.0.0-beta.4" ); /// Returns the first eight characters of the latest commit hash for this build. @@ -54,7 +54,7 @@ pub fn version_with_platform() -> String { /// /// `1.5.1` pub fn version() -> &'static str { - "7.0.0-beta.0" + "7.0.0-beta.4" } /// Returns the name of the current client running. diff --git a/lcli/Cargo.toml b/lcli/Cargo.toml index 74b7ddcb2a..c7d3ee8fb8 100644 --- a/lcli/Cargo.toml +++ b/lcli/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "lcli" description = "Lighthouse CLI (modeled after zcli)" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" authors = ["Paul Hauner "] edition = { workspace = true } diff --git a/lighthouse/Cargo.toml b/lighthouse/Cargo.toml index fc73a2cb93..8c08666ec1 100644 --- a/lighthouse/Cargo.toml +++ b/lighthouse/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lighthouse" -version = "7.0.0-beta.0" +version = "7.0.0-beta.4" authors = ["Sigma Prime "] edition = { workspace = true } autotests = false From ca237652f1dacf5e9d7f740eb5c52e921f2072b7 Mon Sep 17 00:00:00 2001 From: Lion - dapplion <35266934+dapplion@users.noreply.github.com> Date: Fri, 21 Mar 2025 01:07:30 -0300 Subject: [PATCH 17/20] Track request IDs in RangeBlockComponentsRequest (#6998) Part of - https://github.com/sigp/lighthouse/issues/6258 `RangeBlockComponentsRequest` handles a set of by_range requests. It's quite lose on these requests, not tracking them by ID. We want to implement individual request retries, so we must make `RangeBlockComponentsRequest` aware of its requests IDs. We don't want the result of a prior by_range request to affect the state of a future retry. Lookup sync uses this mechanism. Now `RangeBlockComponentsRequest` tracks: ```rust pub struct RangeBlockComponentsRequest { blocks_request: ByRangeRequest>>>, block_data_request: RangeBlockDataRequest, } enum RangeBlockDataRequest { NoData, Blobs(ByRangeRequest>>>), DataColumns { requests: HashMap< DataColumnsByRangeRequestId, ByRangeRequest>, >, expected_custody_columns: Vec, }, } enum ByRangeRequest { Active(I), Complete(T), } ``` I have merged `is_finished` and `Into_responses` into the same function. Otherwise, we need to duplicate the logic to figure out if the requests are done. --- .../src/sync/block_sidecar_coupling.rs | 378 ++++++++++++------ beacon_node/network/src/sync/manager.rs | 6 +- .../network/src/sync/network_context.rs | 103 +++-- 3 files changed, 320 insertions(+), 167 deletions(-) diff --git a/beacon_node/network/src/sync/block_sidecar_coupling.rs b/beacon_node/network/src/sync/block_sidecar_coupling.rs index 6c8a8eab63..45cb1aeace 100644 --- a/beacon_node/network/src/sync/block_sidecar_coupling.rs +++ b/beacon_node/network/src/sync/block_sidecar_coupling.rs @@ -1,89 +1,156 @@ use beacon_chain::{ block_verification_types::RpcBlock, data_column_verification::CustodyDataColumn, get_block_root, }; -use std::{ - collections::{HashMap, VecDeque}, - sync::Arc, +use lighthouse_network::service::api_types::{ + BlobsByRangeRequestId, BlocksByRangeRequestId, DataColumnsByRangeRequestId, }; +use std::{collections::HashMap, sync::Arc}; use types::{ - BlobSidecar, ChainSpec, ColumnIndex, DataColumnSidecar, EthSpec, Hash256, RuntimeVariableList, - SignedBeaconBlock, + BlobSidecar, ChainSpec, ColumnIndex, DataColumnSidecar, DataColumnSidecarList, EthSpec, + Hash256, RuntimeVariableList, SignedBeaconBlock, }; -#[derive(Debug)] pub struct RangeBlockComponentsRequest { /// Blocks we have received awaiting for their corresponding sidecar. - blocks: VecDeque>>, + blocks_request: ByRangeRequest>>>, /// Sidecars we have received awaiting for their corresponding block. - blobs: VecDeque>>, - data_columns: VecDeque>>, - /// Whether the individual RPC request for blocks is finished or not. - is_blocks_stream_terminated: bool, - /// Whether the individual RPC request for sidecars is finished or not. - is_sidecars_stream_terminated: bool, - custody_columns_streams_terminated: usize, - /// Used to determine if this accumulator should wait for a sidecars stream termination - expects_blobs: bool, - expects_custody_columns: Option>, - /// Used to determine if the number of data columns stream termination this accumulator should - /// wait for. This may be less than the number of `expects_custody_columns` due to request batching. - num_custody_column_requests: Option, + block_data_request: RangeBlockDataRequest, +} + +enum ByRangeRequest { + Active(I), + Complete(T), +} + +enum RangeBlockDataRequest { + NoData, + Blobs(ByRangeRequest>>>), + DataColumns { + requests: HashMap< + DataColumnsByRangeRequestId, + ByRangeRequest>, + >, + expected_custody_columns: Vec, + }, } impl RangeBlockComponentsRequest { pub fn new( - expects_blobs: bool, - expects_custody_columns: Option>, - num_custody_column_requests: Option, + blocks_req_id: BlocksByRangeRequestId, + blobs_req_id: Option, + data_columns: Option<(Vec, Vec)>, ) -> Self { - Self { - blocks: <_>::default(), - blobs: <_>::default(), - data_columns: <_>::default(), - is_blocks_stream_terminated: false, - is_sidecars_stream_terminated: false, - custody_columns_streams_terminated: 0, - expects_blobs, - expects_custody_columns, - num_custody_column_requests, - } - } - - pub fn add_blocks(&mut self, blocks: Vec>>) { - for block in blocks { - self.blocks.push_back(block); - } - self.is_blocks_stream_terminated = true; - } - - pub fn add_blobs(&mut self, blobs: Vec>>) { - for blob in blobs { - self.blobs.push_back(blob); - } - self.is_sidecars_stream_terminated = true; - } - - pub fn add_custody_columns(&mut self, columns: Vec>>) { - for column in columns { - self.data_columns.push_back(column); - } - // TODO(das): this mechanism is dangerous, if somehow there are two requests for the - // same column index it can terminate early. This struct should track that all requests - // for all custody columns terminate. - self.custody_columns_streams_terminated += 1; - } - - pub fn into_responses(self, spec: &ChainSpec) -> Result>, String> { - if let Some(expects_custody_columns) = self.expects_custody_columns.clone() { - self.into_responses_with_custody_columns(expects_custody_columns, spec) + let block_data_request = if let Some(blobs_req_id) = blobs_req_id { + RangeBlockDataRequest::Blobs(ByRangeRequest::Active(blobs_req_id)) + } else if let Some((requests, expected_custody_columns)) = data_columns { + RangeBlockDataRequest::DataColumns { + requests: requests + .into_iter() + .map(|id| (id, ByRangeRequest::Active(id))) + .collect(), + expected_custody_columns, + } } else { - self.into_responses_with_blobs(spec) + RangeBlockDataRequest::NoData + }; + + Self { + blocks_request: ByRangeRequest::Active(blocks_req_id), + block_data_request, } } - fn into_responses_with_blobs(self, spec: &ChainSpec) -> Result>, String> { - let RangeBlockComponentsRequest { blocks, blobs, .. } = self; + pub fn add_blocks( + &mut self, + req_id: BlocksByRangeRequestId, + blocks: Vec>>, + ) -> Result<(), String> { + self.blocks_request.finish(req_id, blocks) + } + pub fn add_blobs( + &mut self, + req_id: BlobsByRangeRequestId, + blobs: Vec>>, + ) -> Result<(), String> { + match &mut self.block_data_request { + RangeBlockDataRequest::NoData => Err("received blobs but expected no data".to_owned()), + RangeBlockDataRequest::Blobs(ref mut req) => req.finish(req_id, blobs), + RangeBlockDataRequest::DataColumns { .. } => { + Err("received blobs but expected data columns".to_owned()) + } + } + } + + pub fn add_custody_columns( + &mut self, + req_id: DataColumnsByRangeRequestId, + columns: Vec>>, + ) -> Result<(), String> { + match &mut self.block_data_request { + RangeBlockDataRequest::NoData => { + Err("received data columns but expected no data".to_owned()) + } + RangeBlockDataRequest::Blobs(_) => { + Err("received data columns but expected blobs".to_owned()) + } + RangeBlockDataRequest::DataColumns { + ref mut requests, .. + } => { + let req = requests + .get_mut(&req_id) + .ok_or(format!("unknown data columns by range req_id {req_id}"))?; + req.finish(req_id, columns) + } + } + } + + pub fn responses(&self, spec: &ChainSpec) -> Option>, String>> { + let Some(blocks) = self.blocks_request.to_finished() else { + return None; + }; + + match &self.block_data_request { + RangeBlockDataRequest::NoData => { + Some(Self::responses_with_blobs(blocks.to_vec(), vec![], spec)) + } + RangeBlockDataRequest::Blobs(request) => { + let Some(blobs) = request.to_finished() else { + return None; + }; + Some(Self::responses_with_blobs( + blocks.to_vec(), + blobs.to_vec(), + spec, + )) + } + RangeBlockDataRequest::DataColumns { + requests, + expected_custody_columns, + } => { + let mut data_columns = vec![]; + for req in requests.values() { + let Some(data) = req.to_finished() else { + return None; + }; + data_columns.extend(data.clone()) + } + + Some(Self::responses_with_custody_columns( + blocks.to_vec(), + data_columns, + expected_custody_columns, + spec, + )) + } + } + } + + fn responses_with_blobs( + blocks: Vec>>, + blobs: Vec>>, + spec: &ChainSpec, + ) -> Result>, String> { // There can't be more more blobs than blocks. i.e. sending any blob (empty // included) for a skipped slot is not permitted. let mut responses = Vec::with_capacity(blocks.len()); @@ -129,17 +196,12 @@ impl RangeBlockComponentsRequest { Ok(responses) } - fn into_responses_with_custody_columns( - self, - expects_custody_columns: Vec, + fn responses_with_custody_columns( + blocks: Vec>>, + data_columns: DataColumnSidecarList, + expects_custody_columns: &[ColumnIndex], spec: &ChainSpec, ) -> Result>, String> { - let RangeBlockComponentsRequest { - blocks, - data_columns, - .. - } = self; - // Group data columns by block_root and index let mut data_columns_by_block = HashMap::>>>::new(); @@ -177,7 +239,7 @@ impl RangeBlockComponentsRequest { }; let mut custody_columns = vec![]; - for index in &expects_custody_columns { + for index in expects_custody_columns { let Some(data_column) = data_columns_by_index.remove(index) else { return Err(format!("No column for block {block_root:?} index {index}")); }; @@ -210,20 +272,27 @@ impl RangeBlockComponentsRequest { Ok(rpc_blocks) } +} - pub fn is_finished(&self) -> bool { - if !self.is_blocks_stream_terminated { - return false; - } - if self.expects_blobs && !self.is_sidecars_stream_terminated { - return false; - } - if let Some(expects_custody_column_responses) = self.num_custody_column_requests { - if self.custody_columns_streams_terminated < expects_custody_column_responses { - return false; +impl ByRangeRequest { + fn finish(&mut self, id: I, data: T) -> Result<(), String> { + match self { + Self::Active(expected_id) => { + if expected_id != &id { + return Err(format!("unexpected req_id expected {expected_id} got {id}")); + } + *self = Self::Complete(data); + Ok(()) } + Self::Complete(_) => Err("request already complete".to_owned()), + } + } + + fn to_finished(&self) -> Option<&T> { + match self { + Self::Active(_) => None, + Self::Complete(data) => Some(data), } - true } } @@ -233,9 +302,52 @@ mod tests { use beacon_chain::test_utils::{ generate_rand_block_and_blobs, generate_rand_block_and_data_columns, test_spec, NumBlobs, }; + use lighthouse_network::service::api_types::{ + BlobsByRangeRequestId, BlocksByRangeRequestId, ComponentsByRangeRequestId, + DataColumnsByRangeRequestId, Id, RangeRequestId, + }; use rand::SeedableRng; use std::sync::Arc; - use types::{test_utils::XorShiftRng, ForkName, MinimalEthSpec as E, SignedBeaconBlock}; + use types::{test_utils::XorShiftRng, Epoch, ForkName, MinimalEthSpec as E, SignedBeaconBlock}; + + fn components_id() -> ComponentsByRangeRequestId { + ComponentsByRangeRequestId { + id: 0, + requester: RangeRequestId::RangeSync { + chain_id: 1, + batch_id: Epoch::new(0), + }, + } + } + + fn blocks_id(parent_request_id: ComponentsByRangeRequestId) -> BlocksByRangeRequestId { + BlocksByRangeRequestId { + id: 1, + parent_request_id, + } + } + + fn blobs_id(parent_request_id: ComponentsByRangeRequestId) -> BlobsByRangeRequestId { + BlobsByRangeRequestId { + id: 1, + parent_request_id, + } + } + + fn columns_id( + id: Id, + parent_request_id: ComponentsByRangeRequestId, + ) -> DataColumnsByRangeRequestId { + DataColumnsByRangeRequestId { + id, + parent_request_id, + } + } + + fn is_finished(info: &RangeBlockComponentsRequest) -> bool { + let spec = test_spec::(); + info.responses(&spec).is_some() + } #[test] fn no_blobs_into_responses() { @@ -248,14 +360,15 @@ mod tests { .into() }) .collect::>>>(); - let mut info = RangeBlockComponentsRequest::::new(false, None, None); + + let blocks_req_id = blocks_id(components_id()); + let mut info = RangeBlockComponentsRequest::::new(blocks_req_id, None, None); // Send blocks and complete terminate response - info.add_blocks(blocks); + info.add_blocks(blocks_req_id, blocks).unwrap(); // Assert response is finished and RpcBlocks can be constructed - assert!(info.is_finished()); - info.into_responses(&test_spec::()).unwrap(); + info.responses(&test_spec::()).unwrap().unwrap(); } #[test] @@ -275,18 +388,22 @@ mod tests { .into() }) .collect::>>>(); - let mut info = RangeBlockComponentsRequest::::new(true, None, None); + + let components_id = components_id(); + let blocks_req_id = blocks_id(components_id); + let blobs_req_id = blobs_id(components_id); + let mut info = + RangeBlockComponentsRequest::::new(blocks_req_id, Some(blobs_req_id), None); // Send blocks and complete terminate response - info.add_blocks(blocks); + info.add_blocks(blocks_req_id, blocks).unwrap(); // Expect no blobs returned - info.add_blobs(vec![]); + info.add_blobs(blobs_req_id, vec![]).unwrap(); // Assert response is finished and RpcBlocks can be constructed, even if blobs weren't returned. // This makes sure we don't expect blobs here when they have expired. Checking this logic should // be hendled elsewhere. - assert!(info.is_finished()); - info.into_responses(&test_spec::()).unwrap(); + info.responses(&test_spec::()).unwrap().unwrap(); } #[test] @@ -304,40 +421,49 @@ mod tests { ) }) .collect::>(); + + let components_id = components_id(); + let blocks_req_id = blocks_id(components_id); + let columns_req_id = expects_custody_columns + .iter() + .enumerate() + .map(|(i, _)| columns_id(i as Id, components_id)) + .collect::>(); let mut info = RangeBlockComponentsRequest::::new( - false, - Some(expects_custody_columns.clone()), - Some(expects_custody_columns.len()), + blocks_req_id, + None, + Some((columns_req_id.clone(), expects_custody_columns.clone())), ); // Send blocks and complete terminate response - info.add_blocks(blocks.iter().map(|b| b.0.clone().into()).collect()); + info.add_blocks( + blocks_req_id, + blocks.iter().map(|b| b.0.clone().into()).collect(), + ) + .unwrap(); // Assert response is not finished - assert!(!info.is_finished()); + assert!(!is_finished(&info)); // Send data columns for (i, &column_index) in expects_custody_columns.iter().enumerate() { info.add_custody_columns( + columns_req_id.get(i).copied().unwrap(), blocks .iter() .flat_map(|b| b.1.iter().filter(|d| d.index == column_index).cloned()) .collect(), - ); + ) + .unwrap(); if i < expects_custody_columns.len() - 1 { assert!( - !info.is_finished(), + !is_finished(&info), "requested should not be finished at loop {i}" ); - } else { - assert!( - info.is_finished(), - "request should be finishied at loop {i}" - ); } } // All completed construct response - info.into_responses(&spec).unwrap(); + info.responses(&spec).unwrap().unwrap(); } #[test] @@ -353,10 +479,18 @@ mod tests { (0..batched_column_requests.len() as u32).collect::>(); let num_of_data_column_requests = custody_column_request_ids.len(); + let components_id = components_id(); + let blocks_req_id = blocks_id(components_id); + let columns_req_id = batched_column_requests + .iter() + .enumerate() + .map(|(i, _)| columns_id(i as Id, components_id)) + .collect::>(); + let mut info = RangeBlockComponentsRequest::::new( - false, - Some(expects_custody_columns.clone()), - Some(num_of_data_column_requests), + blocks_req_id, + None, + Some((columns_req_id.clone(), expects_custody_columns.clone())), ); let mut rng = XorShiftRng::from_seed([42; 16]); @@ -372,13 +506,18 @@ mod tests { .collect::>(); // Send blocks and complete terminate response - info.add_blocks(blocks.iter().map(|b| b.0.clone().into()).collect()); + info.add_blocks( + blocks_req_id, + blocks.iter().map(|b| b.0.clone().into()).collect(), + ) + .unwrap(); // Assert response is not finished - assert!(!info.is_finished()); + assert!(!is_finished(&info)); for (i, column_indices) in batched_column_requests.iter().enumerate() { // Send the set of columns in the same batch request info.add_custody_columns( + columns_req_id.get(i).copied().unwrap(), blocks .iter() .flat_map(|b| { @@ -387,19 +526,18 @@ mod tests { .cloned() }) .collect::>(), - ); + ) + .unwrap(); if i < num_of_data_column_requests - 1 { assert!( - !info.is_finished(), + !is_finished(&info), "requested should not be finished at loop {i}" ); - } else { - assert!(info.is_finished(), "request should be finished at loop {i}"); } } // All completed construct response - info.into_responses(&spec).unwrap(); + info.responses(&spec).unwrap().unwrap(); } } diff --git a/beacon_node/network/src/sync/manager.rs b/beacon_node/network/src/sync/manager.rs index 1e6d21d68a..9a48e9aa5d 100644 --- a/beacon_node/network/src/sync/manager.rs +++ b/beacon_node/network/src/sync/manager.rs @@ -1167,7 +1167,7 @@ impl SyncManager { self.on_range_components_response( id.parent_request_id, peer_id, - RangeBlockComponent::Block(resp), + RangeBlockComponent::Block(id, resp), ); } } @@ -1182,7 +1182,7 @@ impl SyncManager { self.on_range_components_response( id.parent_request_id, peer_id, - RangeBlockComponent::Blob(resp), + RangeBlockComponent::Blob(id, resp), ); } } @@ -1200,7 +1200,7 @@ impl SyncManager { self.on_range_components_response( id.parent_request_id, peer_id, - RangeBlockComponent::CustodyColumns(resp), + RangeBlockComponent::CustodyColumns(id, resp), ); } } diff --git a/beacon_node/network/src/sync/network_context.rs b/beacon_node/network/src/sync/network_context.rs index 68a963dd41..16fcf93bcf 100644 --- a/beacon_node/network/src/sync/network_context.rs +++ b/beacon_node/network/src/sync/network_context.rs @@ -218,9 +218,18 @@ pub struct SyncNetworkContext { /// Small enumeration to make dealing with block and blob requests easier. pub enum RangeBlockComponent { - Block(RpcResponseResult>>>), - Blob(RpcResponseResult>>>), - CustodyColumns(RpcResponseResult>>>), + Block( + BlocksByRangeRequestId, + RpcResponseResult>>>, + ), + Blob( + BlobsByRangeRequestId, + RpcResponseResult>>>, + ), + CustodyColumns( + DataColumnsByRangeRequestId, + RpcResponseResult>>>, + ), } impl SyncNetworkContext { @@ -386,7 +395,16 @@ impl SyncNetworkContext { requester, }; - let _blocks_req_id = self.send_blocks_by_range_request(peer_id, request.clone(), id)?; + // Compute custody column peers before sending the blocks_by_range request. If we don't have + // enough peers, error here. + let data_column_requests = if matches!(batch_type, ByRangeRequestType::BlocksAndColumns) { + let column_indexes = self.network_globals().sampling_columns.clone(); + Some(self.make_columns_by_range_requests(request.clone(), &column_indexes)?) + } else { + None + }; + + let blocks_req_id = self.send_blocks_by_range_request(peer_id, request.clone(), id)?; let blobs_req_id = if matches!(batch_type, ByRangeRequestType::BlocksAndBlobs) { Some(self.send_blobs_by_range_request( @@ -401,35 +419,27 @@ impl SyncNetworkContext { None }; - let (expects_columns, data_column_requests) = - if matches!(batch_type, ByRangeRequestType::BlocksAndColumns) { - let column_indexes = self.network_globals().sampling_columns.clone(); - let data_column_requests = self - .make_columns_by_range_requests(request, &column_indexes)? - .into_iter() - .map(|(peer_id, columns_by_range_request)| { - self.send_data_columns_by_range_request( - peer_id, - columns_by_range_request, - id, - ) - }) - .collect::, _>>()?; + let data_columns = if let Some(data_column_requests) = data_column_requests { + let data_column_requests = data_column_requests + .into_iter() + .map(|(peer_id, columns_by_range_request)| { + self.send_data_columns_by_range_request(peer_id, columns_by_range_request, id) + }) + .collect::, _>>()?; - ( - Some(column_indexes.into_iter().collect::>()), - Some(data_column_requests), - ) - } else { - (None, None) - }; + Some(( + data_column_requests, + self.network_globals() + .sampling_columns + .iter() + .cloned() + .collect::>(), + )) + } else { + None + }; - let expected_blobs = blobs_req_id.is_some(); - let info = RangeBlockComponentsRequest::new( - expected_blobs, - expects_columns, - data_column_requests.map(|items| items.len()), - ); + let info = RangeBlockComponentsRequest::new(blocks_req_id, blobs_req_id, data_columns); self.components_by_range_requests.insert(id, info); Ok(id.id) @@ -484,28 +494,33 @@ impl SyncNetworkContext { if let Err(e) = { let request = entry.get_mut(); match range_block_component { - RangeBlockComponent::Block(resp) => resp.map(|(blocks, _)| { - request.add_blocks(blocks); + RangeBlockComponent::Block(req_id, resp) => resp.and_then(|(blocks, _)| { + request + .add_blocks(req_id, blocks) + .map_err(RpcResponseError::BlockComponentCouplingError) }), - RangeBlockComponent::Blob(resp) => resp.map(|(blobs, _)| { - request.add_blobs(blobs); - }), - RangeBlockComponent::CustodyColumns(resp) => resp.map(|(custody_columns, _)| { - request.add_custody_columns(custody_columns); + RangeBlockComponent::Blob(req_id, resp) => resp.and_then(|(blobs, _)| { + request + .add_blobs(req_id, blobs) + .map_err(RpcResponseError::BlockComponentCouplingError) }), + RangeBlockComponent::CustodyColumns(req_id, resp) => { + resp.and_then(|(custody_columns, _)| { + request + .add_custody_columns(req_id, custody_columns) + .map_err(RpcResponseError::BlockComponentCouplingError) + }) + } } } { entry.remove(); return Some(Err(e)); } - if entry.get_mut().is_finished() { + if let Some(blocks_result) = entry.get().responses(&self.chain.spec) { + entry.remove(); // If the request is finished, dequeue everything - let request = entry.remove(); - let blocks = request - .into_responses(&self.chain.spec) - .map_err(RpcResponseError::BlockComponentCouplingError); - Some(blocks) + Some(blocks_result.map_err(RpcResponseError::BlockComponentCouplingError)) } else { None } From d323699fde0121d4d2c4371714c637608ab234e5 Mon Sep 17 00:00:00 2001 From: Jimmy Chen Date: Fri, 21 Mar 2025 16:36:24 +1100 Subject: [PATCH 18/20] Add missing `osaka-time` lcli param (#7183) Getting this when running lcli with `--osaka-time`: ``` error: unexpected argument '--osaka-time' found tip: a similar argument exists: '--shanghai-time' ``` This PR adds the missing `--osaka-time` option to `lcli`. --- lcli/src/main.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lcli/src/main.rs b/lcli/src/main.rs index 5bfd2233f0..05f4900c46 100644 --- a/lcli/src/main.rs +++ b/lcli/src/main.rs @@ -553,6 +553,15 @@ fn main() { until Prague is triggered on mainnet.") .display_order(0) ) + .arg( + Arg::new("osaka-time") + .long("osaka-time") + .value_name("UNIX_TIMESTAMP") + .action(ArgAction::Set) + .help("The payload timestamp that enables Osaka. No default is provided \ + until Osaka is triggered on mainnet.") + .display_order(0) + ) ) .subcommand( Command::new("http-sync") From 2f37bf4de5e3fdecc4ccb98f4cae4185acf4e923 Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Sun, 23 Mar 2025 11:14:34 -0600 Subject: [PATCH 19/20] Fix more merge conflicts between unstable and release-v7.0.0 --- .../network/src/network_beacon_processor/sync_methods.rs | 5 +---- beacon_node/src/config.rs | 6 +----- lighthouse/tests/beacon_node.rs | 3 +++ 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/beacon_node/network/src/network_beacon_processor/sync_methods.rs b/beacon_node/network/src/network_beacon_processor/sync_methods.rs index a803e4d3eb..48ae26c826 100644 --- a/beacon_node/network/src/network_beacon_processor/sync_methods.rs +++ b/beacon_node/network/src/network_beacon_processor/sync_methods.rs @@ -831,10 +831,7 @@ impl NetworkBeaconProcessor { } // Penalise peers for sending us banned blocks. BlockError::KnownInvalidExecutionPayload(block_root) => { - warn!( - ?block_root, - "Received block known to be invalid", - ); + warn!(?block_root, "Received block known to be invalid",); Err(ChainSegmentFailed { message: format!("Banned block: {block_root:?}"), peer_action: Some(PeerAction::Fatal), diff --git a/beacon_node/src/config.rs b/beacon_node/src/config.rs index 7b97d36ab2..8723c2d708 100644 --- a/beacon_node/src/config.rs +++ b/beacon_node/src/config.rs @@ -918,11 +918,7 @@ pub fn get_config( |s| match Hash256::from_str(s.strip_prefix("0x").unwrap_or(s).trim()) { Ok(block_root) => Some(block_root), Err(error) => { - warn!( - block_root = s, - ?error, - "Unable to parse invalid block root", - ); + warn!(block_root = s, ?error, "Unable to parse invalid block root",); None } }, diff --git a/lighthouse/tests/beacon_node.rs b/lighthouse/tests/beacon_node.rs index 28594af1da..1fb9e40c23 100644 --- a/lighthouse/tests/beacon_node.rs +++ b/lighthouse/tests/beacon_node.rs @@ -2811,6 +2811,9 @@ fn data_column_publishing_delay_for_testing() { Some(Duration::from_secs_f64(3.5f64)) ); }); +} + +#[test] fn invalid_block_roots_flag() { let dir = TempDir::new().expect("Unable to create temporary directory"); let mut file = From 3f6c11db0eb68faaf385e179e6fadb1d180498f9 Mon Sep 17 00:00:00 2001 From: chonghe <44791194+chong-he@users.noreply.github.com> Date: Mon, 24 Mar 2025 10:30:20 +0800 Subject: [PATCH 20/20] Some updates to Lighthouse book (#6995) * #6447 - Move some deprecated pages to a new section under `Archived` - Remove fallback log in mev as the log will not be present after VC using `/eth/v3/validator/blocks` endpoint by default - Add warning against using Btrfs file system (thank you @ChosunOne for the report) - Add data shared by @mcdee on tree states API queries time - Rename partial withdrawals to validator sweep to differentiate it from the upcoming execution layer partial withdrawals - Update NAT API response - Update docs on IPv6 - Rename .md files to follow a standard prefix section name, e.g., installation_*.md, advanced_*.md - Standardise .md files using underscore `_` instead of hyphen `-` to be consistent with other files naming conventions. --- book/.markdownlint.yml | 2 +- book/src/SUMMARY.md | 96 +++++++++--------- book/src/advanced.md | 26 +++-- .../{advanced-blobs.md => advanced_blobs.md} | 2 +- .../src/{builders.md => advanced_builders.md} | 17 +--- ...nt-sync.md => advanced_checkpoint_sync.md} | 2 +- book/src/advanced_database.md | 20 ++++ ...ons.md => advanced_database_migrations.md} | 0 ...dvanced-datadir.md => advanced_datadir.md} | 2 +- ...y-recovery.md => advanced_key_recovery.md} | 0 book/src/advanced_networking.md | 8 +- ...oser-only.md => advanced_proposer_only.md} | 2 +- ...e-block-re-orgs.md => advanced_re-orgs.md} | 0 .../{redundancy.md => advanced_redundancy.md} | 8 +- ...ates.md => advanced_release_candidates.md} | 0 book/src/{slasher.md => advanced_slasher.md} | 2 +- ...r-web3signer.md => advanced_web3signer.md} | 2 +- book/src/api.md | 4 +- book/src/{api-bn.md => api_bn.md} | 0 .../{api-lighthouse.md => api_lighthouse.md} | 16 ++- .../{advanced_metrics.md => api_metrics.md} | 2 +- ...nclusion.md => api_validator_inclusion.md} | 0 book/src/{api-vc.md => api_vc.md} | 5 +- ...c-auth-header.md => api_vc_auth_header.md} | 0 ...pi-vc-endpoints.md => api_vc_endpoints.md} | 28 ++--- ...nagement.md => archived-key-management.md} | 4 +- ...gration.md => archived-merge-migration.md} | 2 +- book/src/archived.md | 3 + book/src/{pi.md => archived_pi.md} | 4 +- book/src/contributing.md | 4 +- book/src/{setup.md => contributing_setup.md} | 0 book/src/faq.md | 26 ++--- book/src/imgs/per-epoch.png | Bin 0 -> 258688 bytes book/src/imgs/per-slot.png | Bin 0 -> 273656 bytes book/src/installation.md | 12 +-- ...n-binaries.md => installation_binaries.md} | 0 ...ing.md => installation_cross_compiling.md} | 4 +- .../src/{docker.md => installation_docker.md} | 0 .../{homebrew.md => installation_homebrew.md} | 0 ...iorities.md => installation_priorities.md} | 0 ...ation-source.md => installation_source.md} | 4 +- book/src/intro.md | 6 +- ...nnet-validator.md => mainnet_validator.md} | 10 +- book/src/run_a_node.md | 11 +- book/src/ui-installation.md | 73 ------------- book/src/{lighthouse-ui.md => ui.md} | 8 +- ...authentication.md => ui_authentication.md} | 4 +- ...i-configuration.md => ui_configuration.md} | 2 +- book/src/{ui-faqs.md => ui_faqs.md} | 6 +- book/src/{ui-usage.md => ui_usage.md} | 0 ...pelganger.md => validator_doppelganger.md} | 4 +- ...ecipient.md => validator_fee_recipient.md} | 10 +- .../{graffiti.md => validator_graffiti.md} | 6 +- ...-management.md => validator_management.md} | 4 +- ...idator-manager.md => validator_manager.md} | 6 +- ...anager-api.md => validator_manager_api.md} | 0 ...-create.md => validator_manager_create.md} | 4 +- ...ager-move.md => validator_manager_move.md} | 0 ...-monitoring.md => validator_monitoring.md} | 4 +- ...on.md => validator_slashing_protection.md} | 6 +- ...rtial-withdrawal.md => validator_sweep.md} | 8 +- ...ry-exit.md => validator_voluntary_exit.md} | 0 wordlist.txt | 6 ++ 63 files changed, 221 insertions(+), 264 deletions(-) rename book/src/{advanced-blobs.md => advanced_blobs.md} (96%) rename book/src/{builders.md => advanced_builders.md} (95%) rename book/src/{checkpoint-sync.md => advanced_checkpoint_sync.md} (99%) rename book/src/{database-migrations.md => advanced_database_migrations.md} (100%) rename book/src/{advanced-datadir.md => advanced_datadir.md} (98%) rename book/src/{key-recovery.md => advanced_key_recovery.md} (100%) rename book/src/{advanced-proposer-only.md => advanced_proposer_only.md} (97%) rename book/src/{late-block-re-orgs.md => advanced_re-orgs.md} (100%) rename book/src/{redundancy.md => advanced_redundancy.md} (94%) rename book/src/{advanced-release-candidates.md => advanced_release_candidates.md} (100%) rename book/src/{slasher.md => advanced_slasher.md} (99%) rename book/src/{validator-web3signer.md => advanced_web3signer.md} (95%) rename book/src/{api-bn.md => api_bn.md} (100%) rename book/src/{api-lighthouse.md => api_lighthouse.md} (98%) rename book/src/{advanced_metrics.md => api_metrics.md} (97%) rename book/src/{validator-inclusion.md => api_validator_inclusion.md} (100%) rename book/src/{api-vc.md => api_vc.md} (91%) rename book/src/{api-vc-auth-header.md => api_vc_auth_header.md} (100%) rename book/src/{api-vc-endpoints.md => api_vc_endpoints.md} (97%) rename book/src/{key-management.md => archived-key-management.md} (98%) rename book/src/{merge-migration.md => archived-merge-migration.md} (99%) create mode 100644 book/src/archived.md rename book/src/{pi.md => archived_pi.md} (91%) rename book/src/{setup.md => contributing_setup.md} (100%) create mode 100644 book/src/imgs/per-epoch.png create mode 100644 book/src/imgs/per-slot.png rename book/src/{installation-binaries.md => installation_binaries.md} (100%) rename book/src/{cross-compiling.md => installation_cross_compiling.md} (90%) rename book/src/{docker.md => installation_docker.md} (100%) rename book/src/{homebrew.md => installation_homebrew.md} (100%) rename book/src/{installation-priorities.md => installation_priorities.md} (100%) rename book/src/{installation-source.md => installation_source.md} (95%) rename book/src/{mainnet-validator.md => mainnet_validator.md} (96%) delete mode 100644 book/src/ui-installation.md rename book/src/{lighthouse-ui.md => ui.md} (79%) rename book/src/{ui-authentication.md => ui_authentication.md} (87%) rename book/src/{ui-configuration.md => ui_configuration.md} (99%) rename book/src/{ui-faqs.md => ui_faqs.md} (92%) rename book/src/{ui-usage.md => ui_usage.md} (100%) rename book/src/{validator-doppelganger.md => validator_doppelganger.md} (98%) rename book/src/{suggested-fee-recipient.md => validator_fee_recipient.md} (96%) rename book/src/{graffiti.md => validator_graffiti.md} (95%) rename book/src/{validator-management.md => validator_management.md} (98%) rename book/src/{validator-manager.md => validator_manager.md} (93%) rename book/src/{validator-manager-api.md => validator_manager_api.md} (100%) rename book/src/{validator-manager-create.md => validator_manager_create.md} (98%) rename book/src/{validator-manager-move.md => validator_manager_move.md} (100%) rename book/src/{validator-monitoring.md => validator_monitoring.md} (98%) rename book/src/{slashing-protection.md => validator_slashing_protection.md} (97%) rename book/src/{partial-withdrawal.md => validator_sweep.md} (75%) rename book/src/{voluntary-exit.md => validator_voluntary_exit.md} (100%) diff --git a/book/.markdownlint.yml b/book/.markdownlint.yml index 5d6bda29f1..4f7d113364 100644 --- a/book/.markdownlint.yml +++ b/book/.markdownlint.yml @@ -8,7 +8,7 @@ MD010: MD013: false # MD028: set to false to allow blank line between blockquote: https://github.com/DavidAnson/markdownlint/blob/main/doc/md028.md -# This is because the blockquotes are shown separatedly (a deisred outcome) when having a blank line in between +# This is because the blockquotes are shown separately (a desired outcome) when having a blank line in between MD028: false # MD024: set siblings_only to true so that same headings with different parent headings are allowed diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md index 44d7702e5f..3d09e3a6a5 100644 --- a/book/src/SUMMARY.md +++ b/book/src/SUMMARY.md @@ -2,58 +2,54 @@ * [Introduction](./intro.md) * [Installation](./installation.md) - * [Pre-Built Binaries](./installation-binaries.md) - * [Docker](./docker.md) - * [Build from Source](./installation-source.md) - * [Raspberry Pi 4](./pi.md) - * [Cross-Compiling](./cross-compiling.md) - * [Homebrew](./homebrew.md) - * [Update Priorities](./installation-priorities.md) + * [Pre-Built Binaries](./installation_binaries.md) + * [Docker](./installation_docker.md) + * [Build from Source](./installation_source.md) + * [Cross-Compiling](./installation_cross_compiling.md) + * [Homebrew](./installation_homebrew.md) + * [Update Priorities](./installation_priorities.md) * [Run a Node](./run_a_node.md) -* [Become a Validator](./mainnet-validator.md) -* [Validator Management](./validator-management.md) - * [The `validator-manager` Command](./validator-manager.md) - * [Creating validators](./validator-manager-create.md) - * [Moving validators](./validator-manager-move.md) - * [Managing validators](./validator-manager-api.md) - * [Slashing Protection](./slashing-protection.md) - * [Voluntary Exits](./voluntary-exit.md) - * [Partial Withdrawals](./partial-withdrawal.md) - * [Validator Monitoring](./validator-monitoring.md) - * [Doppelganger Protection](./validator-doppelganger.md) - * [Suggested Fee Recipient](./suggested-fee-recipient.md) - * [Validator Graffiti](./graffiti.md) +* [Become a Validator](./mainnet_validator.md) +* [Validator Management](./validator_management.md) + * [The `validator-manager` Command](./validator_manager.md) + * [Creating validators](./validator_manager_create.md) + * [Moving validators](./validator_manager_move.md) + * [Managing validators](./validator_manager_api.md) + * [Slashing Protection](./validator_slashing_protection.md) + * [Voluntary Exits](./validator_voluntary_exit.md) + * [Validator Sweep](./validator_sweep.md) + * [Validator Monitoring](./validator_monitoring.md) + * [Doppelganger Protection](./validator_doppelganger.md) + * [Suggested Fee Recipient](./validator_fee_recipient.md) + * [Validator Graffiti](./validator_graffiti.md) * [APIs](./api.md) - * [Beacon Node API](./api-bn.md) - * [Lighthouse API](./api-lighthouse.md) - * [Validator Inclusion APIs](./validator-inclusion.md) - * [Validator Client API](./api-vc.md) - * [Endpoints](./api-vc-endpoints.md) - * [Authorization Header](./api-vc-auth-header.md) - * [Signature Header](./api-vc-sig-header.md) - * [Prometheus Metrics](./advanced_metrics.md) -* [Lighthouse UI (Siren)](./lighthouse-ui.md) - * [Configuration](./ui-configuration.md) - * [Authentication](./ui-authentication.md) - * [Usage](./ui-usage.md) - * [FAQs](./ui-faqs.md) + * [Beacon Node API](./api_bn.md) + * [Lighthouse API](./api_lighthouse.md) + * [Validator Inclusion APIs](./api_validator_inclusion.md) + * [Validator Client API](./api_vc.md) + * [Endpoints](./api_vc_endpoints.md) + * [Authorization Header](./api_vc_auth_header.md) + * [Prometheus Metrics](./api_metrics.md) +* [Lighthouse UI (Siren)](./ui.md) + * [Configuration](./ui_configuration.md) + * [Authentication](./ui_authentication.md) + * [Usage](./ui_usage.md) + * [FAQs](./ui_faqs.md) * [Advanced Usage](./advanced.md) - * [Checkpoint Sync](./checkpoint-sync.md) - * [Custom Data Directories](./advanced-datadir.md) - * [Proposer Only Beacon Nodes](./advanced-proposer-only.md) - * [Remote Signing with Web3Signer](./validator-web3signer.md) + * [Checkpoint Sync](./advanced_checkpoint_sync.md) + * [Custom Data Directories](./advanced_datadir.md) + * [Proposer Only Beacon Nodes](./advanced_proposer_only.md) + * [Remote Signing with Web3Signer](./advanced_web3signer.md) * [Database Configuration](./advanced_database.md) - * [Database Migrations](./database-migrations.md) - * [Key Management (Deprecated)](./key-management.md) - * [Key Recovery](./key-recovery.md) + * [Database Migrations](./advanced_database_migrations.md) + * [Key Recovery](./advanced_key_recovery.md) * [Advanced Networking](./advanced_networking.md) - * [Running a Slasher](./slasher.md) - * [Redundancy](./redundancy.md) - * [Release Candidates](./advanced-release-candidates.md) - * [MEV](./builders.md) - * [Merge Migration](./merge-migration.md) - * [Late Block Re-orgs](./late-block-re-orgs.md) - * [Blobs](./advanced-blobs.md) + * [Running a Slasher](./advanced_slasher.md) + * [Redundancy](./advanced_redundancy.md) + * [Release Candidates](./advanced_release_candidates.md) + * [MEV](./advanced_builders.md) + * [Late Block Re-orgs](./advanced_re-orgs.md) + * [Blobs](./advanced_blobs.md) * [Command Line Reference (CLI)](./help_general.md) * [Beacon Node](./help_bn.md) * [Validator Client](./help_vc.md) @@ -62,7 +58,11 @@ * [Import](./help_vm_import.md) * [Move](./help_vm_move.md) * [Contributing](./contributing.md) - * [Development Environment](./setup.md) + * [Development Environment](./contributing_setup.md) * [FAQs](./faq.md) * [Protocol Developers](./developers.md) * [Security Researchers](./security.md) +* [Archived](./archived.md) + * [Merge Migration](./archived_merge_migration.md) + * [Raspberry Pi 4](./archived_pi.md) + * [Key Management](./archived_key_management.md) diff --git a/book/src/advanced.md b/book/src/advanced.md index 1a882835a4..76a7fed202 100644 --- a/book/src/advanced.md +++ b/book/src/advanced.md @@ -6,19 +6,17 @@ elsewhere? This section provides detailed information about configuring Lighthouse for specific use cases, and tips about how things work under the hood. -* [Checkpoint Sync](./checkpoint-sync.md): quickly sync the beacon chain to perform validator duties. -* [Custom Data Directories](./advanced-datadir.md): modify the data directory to your preferred location. -* [Proposer Only Beacon Nodes](./advanced-proposer-only.md): beacon node only for proposer duty for increased anonymity. -* [Remote Signing with Web3Signer](./validator-web3signer.md): don't want to store your keystore in local node? Use web3signer. +* [Checkpoint Sync](./advanced_checkpoint_sync.md): quickly sync the beacon chain to perform validator duties. +* [Custom Data Directories](./advanced_datadir.md): modify the data directory to your preferred location. +* [Proposer Only Beacon Nodes](./advanced_proposer_only.md): beacon node only for proposer duty for increased anonymity. +* [Remote Signing with Web3Signer](./advanced_web3signer.md): don't want to store your keystore in local node? Use web3signer. * [Database Configuration](./advanced_database.md): understanding space-time trade-offs in the database. -* [Database Migrations](./database-migrations.md): have a look at all previous Lighthouse database scheme versions. -* [Key Management](./key-management.md): explore how to generate wallet with Lighthouse. -* [Key Recovery](./key-recovery.md): explore how to recover wallet and validator with Lighthouse. +* [Database Migrations](./advanced_database_migrations.md): have a look at all previous Lighthouse database scheme versions. +* [Key Recovery](./advanced_key_recovery.md): explore how to recover wallet and validator with Lighthouse. * [Advanced Networking](./advanced_networking.md): open your ports to have a diverse and healthy set of peers. -* [Running a Slasher](./slasher.md): contribute to the health of the network by running a slasher. -* [Redundancy](./redundancy.md): want to have more than one beacon node as backup? This is for you. -* [Release Candidates](./advanced-release-candidates.md): latest release of Lighthouse to get feedback from users. -* [Maximal Extractable Value](./builders.md): use external builders for a potential higher rewards during block proposals -* [Merge Migration](./merge-migration.md): look at what you need to do during a significant network upgrade: The Merge -* [Late Block Re-orgs](./late-block-re-orgs.md): read information about Lighthouse late block re-orgs. -* [Blobs](./advanced-blobs.md): information about blobs in Deneb upgrade +* [Running a Slasher](./advanced_slasher.md): contribute to the health of the network by running a slasher. +* [Redundancy](./advanced_redundancy.md): want to have more than one beacon node as backup? This is for you. +* [Release Candidates](./advanced_release_candidates.md): latest release of Lighthouse to get feedback from users. +* [Maximal Extractable Value](./advanced_builders.md): use external builders for a potential higher rewards during block proposals +* [Late Block Re-orgs](./advanced_re-orgs.md): read information about Lighthouse late block re-orgs. +* [Blobs](./advanced_blobs.md): information about blobs in Deneb upgrade diff --git a/book/src/advanced-blobs.md b/book/src/advanced_blobs.md similarity index 96% rename from book/src/advanced-blobs.md rename to book/src/advanced_blobs.md index 785bd5797d..aa995b8e1d 100644 --- a/book/src/advanced-blobs.md +++ b/book/src/advanced_blobs.md @@ -38,4 +38,4 @@ In the Deneb network upgrade, one of the changes is the implementation of EIP-48 curl "http://localhost:5052/lighthouse/database/info" | jq ``` - Refer to [Lighthouse API](./api-lighthouse.md#lighthousedatabaseinfo) for an example response. + Refer to [Lighthouse API](./api_lighthouse.md#lighthousedatabaseinfo) for an example response. diff --git a/book/src/builders.md b/book/src/advanced_builders.md similarity index 95% rename from book/src/builders.md rename to book/src/advanced_builders.md index 5b8e9ddb8b..d9468898b4 100644 --- a/book/src/builders.md +++ b/book/src/advanced_builders.md @@ -83,11 +83,11 @@ is something afoot. To update gas limit per-validator you can use the [standard key manager API][gas-limit-api]. -Alternatively, you can use the [lighthouse API](api-vc-endpoints.md). See below for an example. +Alternatively, you can use the [lighthouse API](api_vc_endpoints.md). See below for an example. ### Enable/Disable builder proposals via HTTP -Use the [lighthouse API](api-vc-endpoints.md) to enable/disable use of the builder API on a per-validator basis. +Use the [lighthouse API](api_vc_endpoints.md) to enable/disable use of the builder API on a per-validator basis. You can also update the configured gas limit with these requests. #### `PATCH /lighthouse/validators/:voting_pubkey` @@ -98,7 +98,7 @@ You can also update the configured gas limit with these requests. |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/:voting_pubkey` | | Method | PATCH | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200, 400 | #### Example Path @@ -147,7 +147,7 @@ INFO Published validator registrations to the builder network, count: 3, service ### Fee Recipient -Refer to [suggested fee recipient](suggested-fee-recipient.md) documentation. +Refer to [suggested fee recipient](validator_fee_recipient.md) documentation. ### Validator definitions example @@ -244,16 +244,9 @@ INFO Builder payload ignored INFO Chain is unhealthy, using local payload ``` -In case of fallback you should see a log indicating that the locally produced payload was -used in place of one from the builder: - -```text -INFO Reconstructing a full block using a local payload -``` - ## Information for block builders and relays -Block builders and relays can query beacon node events from the [Events API](https://ethereum.github.io/beacon-APIs/#/Events/eventstream). An example of querying the payload attributes in the Events API is outlined in [Beacon node API - Events API](./api-bn.md#events-api) +Block builders and relays can query beacon node events from the [Events API](https://ethereum.github.io/beacon-APIs/#/Events/eventstream). An example of querying the payload attributes in the Events API is outlined in [Beacon node API - Events API](./api_bn.md#events-api) [mev-rs]: https://github.com/ralexstokes/mev-rs [mev-boost]: https://github.com/flashbots/mev-boost diff --git a/book/src/checkpoint-sync.md b/book/src/advanced_checkpoint_sync.md similarity index 99% rename from book/src/checkpoint-sync.md rename to book/src/advanced_checkpoint_sync.md index 8dd63f77c9..45aed6ef58 100644 --- a/book/src/checkpoint-sync.md +++ b/book/src/advanced_checkpoint_sync.md @@ -134,7 +134,7 @@ Important information to be aware of: * It is safe to interrupt state reconstruction by gracefully terminating the node – it will pick up from where it left off when it restarts. * You can start reconstruction from the HTTP API, and view its progress. See the - [`/lighthouse/database`](./api-lighthouse.md) APIs. + [`/lighthouse/database`](./api_lighthouse.md) APIs. For more information on historic state storage see the [Database Configuration](./advanced_database.md) page. diff --git a/book/src/advanced_database.md b/book/src/advanced_database.md index b558279730..4e77046c2d 100644 --- a/book/src/advanced_database.md +++ b/book/src/advanced_database.md @@ -61,6 +61,26 @@ that we have observed are: to apply. We observed no significant performance benefit from `--hierarchy-exponents 5,7,11`, and a substantial increase in space consumed. +The following table lists the data for different configurations. Note that the disk space requirement is for the `chain_db` and `freezer_db`, excluding the `blobs_db`. + +| Hierarchy Exponents | Storage Requirement | Sequential Slot Query | Uncached Query | Time to Sync | +|---|---|---|---|---| +| 5,9,11,13,16,18,21 (default) | 418 GiB | 250-700 ms | up to 10 s | 1 week | +| 5,7,11 (frequent snapshots) | 589 GiB | 250-700 ms | up to 6 s | 1 week | +| 0,5,7,11 (per-slot diffs) | 2500 GiB | 250-700 ms | up to 4 s | 7 weeks | + +[Jim](https://github.com/mcdee) has done some experiments to study the response time of querying random slots (uncached query) for `--hierarchy-exponents 0,5,7,11` (per-slot diffs) and `--hierarchy-exponents 5,9,11,13,17,21` (per-epoch diffs), as show in the figures below. From the figures, two points can be concluded: + +- response time (y-axis) increases with slot number (x-axis) due to state growth. +- response time for per-slot configuration in general is 2x faster than that of per-epoch. + +In short, setting different configurations is a trade-off between disk space requirement, sync time and response time. The data presented here is useful to help users choosing the configuration that suit their needs. + +_We acknowledge the data provided by [Jim](https://github.com/mcdee) and his consent for us to share it here._ + +![Response time for per-epoch archive](./imgs/per-epoch.png) +![Response time for per-slot archive](./imgs/per-slot.png) + If in doubt, we recommend running with the default configuration! It takes a long time to reconstruct states in any given configuration, so it might be some time before the optimal configuration is determined. diff --git a/book/src/database-migrations.md b/book/src/advanced_database_migrations.md similarity index 100% rename from book/src/database-migrations.md rename to book/src/advanced_database_migrations.md diff --git a/book/src/advanced-datadir.md b/book/src/advanced_datadir.md similarity index 98% rename from book/src/advanced-datadir.md rename to book/src/advanced_datadir.md index 7ad993a107..1be8ed5a34 100644 --- a/book/src/advanced-datadir.md +++ b/book/src/advanced_datadir.md @@ -12,7 +12,7 @@ lighthouse --network mainnet --datadir /var/lib/my-custom-dir bn --staking lighthouse --network mainnet --datadir /var/lib/my-custom-dir vc ``` -The first step creates a `validators` directory under `/var/lib/my-custom-dir` which contains the imported keys and [`validator_definitions.yml`](./validator-management.md). +The first step creates a `validators` directory under `/var/lib/my-custom-dir` which contains the imported keys and [`validator_definitions.yml`](./validator_management.md). After that, we simply run the beacon chain and validator client with the custom dir path. ## Relative Paths diff --git a/book/src/key-recovery.md b/book/src/advanced_key_recovery.md similarity index 100% rename from book/src/key-recovery.md rename to book/src/advanced_key_recovery.md diff --git a/book/src/advanced_networking.md b/book/src/advanced_networking.md index 0dc1000aa0..0dc53bd42a 100644 --- a/book/src/advanced_networking.md +++ b/book/src/advanced_networking.md @@ -123,8 +123,12 @@ Lighthouse listens for connections, and the parameters used to tell other peers how to connect to your node. This distinction is relevant and applies to most nodes that do not run directly on a public network. +Since Lighthouse v7.0.0, Lighthouse listens to both IPv4 and IPv6 by default if it detects a globally routable IPv6 address. This means that dual-stack is enabled by default. + ### Configuring Lighthouse to listen over IPv4/IPv6/Dual stack +To listen over only IPv4 and not IPv6, use the flag `--listen-address 0.0.0.0`. + To listen over only IPv6 use the same parameters as done when listening over IPv4 only: @@ -136,7 +140,7 @@ TCP and UDP. If the specified port is 9909, QUIC will use port 9910 for IPv6 UDP connections. This can be configured with `--quic-port`. -To listen over both IPv4 and IPv6: +To listen over both IPv4 and IPv6 and using a different port for IPv6:: - Set two listening addresses using the `--listen-address` flag twice ensuring the two addresses are one IPv4, and the other IPv6. When doing so, the @@ -165,7 +169,7 @@ To listen over both IPv4 and IPv6: > It listens on the default value of --port6 (`9000`) for both UDP and TCP. > QUIC will use port `9001` for UDP, which is the default `--port6` value (`9000`) + 1. -> When using `--listen-address :: --listen-address --port 9909 --discovery-port6 9999`, listening will be set up as follows: +> When using `--listen-address :: --listen-address 0.0.0.0 --port 9909 --discovery-port6 9999`, listening will be set up as follows: > > **IPv4**: > diff --git a/book/src/advanced-proposer-only.md b/book/src/advanced_proposer_only.md similarity index 97% rename from book/src/advanced-proposer-only.md rename to book/src/advanced_proposer_only.md index 1ea3610988..f55e51606c 100644 --- a/book/src/advanced-proposer-only.md +++ b/book/src/advanced_proposer_only.md @@ -56,7 +56,7 @@ these nodes for added security). The intended set-up to take advantage of this mechanism is to run one (or more) normal beacon nodes in conjunction with one (or more) proposer-only beacon -nodes. See the [Redundancy](./redundancy.md) section for more information about +nodes. See the [Redundancy](./advanced_redundancy.md) section for more information about setting up redundant beacon nodes. The proposer-only beacon nodes should be setup to use a different IP address than the primary (non proposer-only) nodes. For added security, the IP addresses of the proposer-only nodes should be diff --git a/book/src/late-block-re-orgs.md b/book/src/advanced_re-orgs.md similarity index 100% rename from book/src/late-block-re-orgs.md rename to book/src/advanced_re-orgs.md diff --git a/book/src/redundancy.md b/book/src/advanced_redundancy.md similarity index 94% rename from book/src/redundancy.md rename to book/src/advanced_redundancy.md index daf0eb4a5b..4582866657 100644 --- a/book/src/redundancy.md +++ b/book/src/advanced_redundancy.md @@ -9,7 +9,7 @@ There are three places in Lighthouse where redundancy is notable: We mention (3) since it is unsafe and should not be confused with the other two uses of redundancy. **Running the same validator keypair in more than one validator client (Lighthouse, or otherwise) will eventually lead to slashing.** -See [Slashing Protection](./slashing-protection.md) for more information. +See [Slashing Protection](./validator_slashing_protection.md) for more information. From this paragraph, this document will *only* refer to the first two items (1, 2). We *never* recommend that users implement redundancy for validator keypairs. @@ -58,8 +58,8 @@ following flags: > Note: You could also use `--http-address 0.0.0.0`, but this allows *any* external IP address to access the HTTP server. As such, a firewall should be configured to deny unauthorized access to port `5052`. -- `--execution-endpoint`: see [Merge Migration](./merge-migration.md). -- `--execution-jwt`: see [Merge Migration](./merge-migration.md). +- `--execution-endpoint`: see [Merge Migration](./archived_merge_migration.md). +- `--execution-jwt`: see [Merge Migration](./archived_merge_migration.md). For example one could use the following command to provide a backup beacon node: @@ -107,7 +107,7 @@ The default is `--broadcast subscriptions`. To also broadcast blocks for example Lighthouse previously supported redundant execution nodes for fetching data from the deposit contract. On merged networks *this is no longer supported*. Each Lighthouse beacon node must be configured in a 1:1 relationship with an execution node. For more information on the rationale -behind this decision please see the [Merge Migration](./merge-migration.md) documentation. +behind this decision please see the [Merge Migration](./archived_merge_migration.md) documentation. To achieve redundancy we recommend configuring [Redundant beacon nodes](#redundant-beacon-nodes) where each has its own execution engine. diff --git a/book/src/advanced-release-candidates.md b/book/src/advanced_release_candidates.md similarity index 100% rename from book/src/advanced-release-candidates.md rename to book/src/advanced_release_candidates.md diff --git a/book/src/slasher.md b/book/src/advanced_slasher.md similarity index 99% rename from book/src/slasher.md rename to book/src/advanced_slasher.md index 3310f6c9ef..b354c9deb2 100644 --- a/book/src/slasher.md +++ b/book/src/advanced_slasher.md @@ -81,7 +81,7 @@ WARN Slasher backend override failed advice: delete old MDBX database or enab In this case you should either obtain a Lighthouse binary with the MDBX backend enabled, or delete the files for the old backend. The pre-built Lighthouse binaries and Docker images have MDBX enabled, -or if you're [building from source](./installation-source.md) you can enable the `slasher-mdbx` feature. +or if you're [building from source](./installation_source.md) you can enable the `slasher-mdbx` feature. To delete the files, use the `path` from the `WARN` log, and then delete the `mbdx.dat` and `mdbx.lck` files. diff --git a/book/src/validator-web3signer.md b/book/src/advanced_web3signer.md similarity index 95% rename from book/src/validator-web3signer.md rename to book/src/advanced_web3signer.md index 6a518af3cf..6145fd4a71 100644 --- a/book/src/validator-web3signer.md +++ b/book/src/advanced_web3signer.md @@ -30,7 +30,7 @@ or effectiveness. ## Usage A remote signing validator is added to Lighthouse in much the same way as one that uses a local -keystore, via the [`validator_definitions.yml`](./validator-management.md) file or via the [`POST /lighthouse/validators/web3signer`](./api-vc-endpoints.md#post-lighthousevalidatorsweb3signer) API endpoint. +keystore, via the [`validator_definitions.yml`](./validator_management.md) file or via the [`POST /lighthouse/validators/web3signer`](./api_vc_endpoints.md#post-lighthousevalidatorsweb3signer) API endpoint. Here is an example of a `validator_definitions.yml` file containing one validator which uses a remote signer: diff --git a/book/src/api.md b/book/src/api.md index 5837ad9654..912c8658b6 100644 --- a/book/src/api.md +++ b/book/src/api.md @@ -5,5 +5,5 @@ RESTful HTTP/JSON APIs. There are two APIs served by Lighthouse: -- [Beacon Node API](./api-bn.md) -- [Validator Client API](./api-vc.md) +- [Beacon Node API](./api_bn.md) +- [Validator Client API](./api_vc.md) diff --git a/book/src/api-bn.md b/book/src/api_bn.md similarity index 100% rename from book/src/api-bn.md rename to book/src/api_bn.md diff --git a/book/src/api-lighthouse.md b/book/src/api_lighthouse.md similarity index 98% rename from book/src/api-lighthouse.md rename to book/src/api_lighthouse.md index 5428ab8f9a..b65bef4762 100644 --- a/book/src/api-lighthouse.md +++ b/book/src/api_lighthouse.md @@ -347,11 +347,11 @@ curl -X GET "http://localhost:5052/lighthouse/proto_array" -H "accept: applicat ## `/lighthouse/validator_inclusion/{epoch}/{validator_id}` -See [Validator Inclusion APIs](./validator-inclusion.md). +See [Validator Inclusion APIs](./api_validator_inclusion.md). ## `/lighthouse/validator_inclusion/{epoch}/global` -See [Validator Inclusion APIs](./validator-inclusion.md). +See [Validator Inclusion APIs](./api_validator_inclusion.md). ## `/lighthouse/eth1/syncing` @@ -565,7 +565,7 @@ For archive nodes, the `anchor` will be: indicating that all states with slots `>= 0` are available, i.e., full state history. For more information on the specific meanings of these fields see the docs on [Checkpoint -Sync](./checkpoint-sync.md#reconstructing-states). +Sync](./advanced_checkpoint_sync.md#reconstructing-states). ## `/lighthouse/merge_readiness` @@ -812,9 +812,15 @@ Checks if the ports are open. curl -X GET "http://localhost:5052/lighthouse/nat" | jq ``` -An open port will return: +An example of response: ```json { - "data": true + "data": { + "discv5_ipv4": true, + "discv5_ipv6": false, + "libp2p_ipv4": true, + "libp2p_ipv6": false + } } +``` diff --git a/book/src/advanced_metrics.md b/book/src/api_metrics.md similarity index 97% rename from book/src/advanced_metrics.md rename to book/src/api_metrics.md index 323ba8f58a..c124d3acb7 100644 --- a/book/src/advanced_metrics.md +++ b/book/src/api_metrics.md @@ -68,7 +68,7 @@ The specification for the monitoring endpoint can be found here: - -_Note: the similarly named [Validator Monitor](./validator-monitoring.md) feature is entirely +_Note: the similarly named [Validator Monitor](./validator_monitoring.md) feature is entirely independent of remote metric monitoring_. ### Update Period diff --git a/book/src/validator-inclusion.md b/book/src/api_validator_inclusion.md similarity index 100% rename from book/src/validator-inclusion.md rename to book/src/api_validator_inclusion.md diff --git a/book/src/api-vc.md b/book/src/api_vc.md similarity index 91% rename from book/src/api-vc.md rename to book/src/api_vc.md index 630a032006..f5df5df76c 100644 --- a/book/src/api-vc.md +++ b/book/src/api_vc.md @@ -6,11 +6,10 @@ of validators and keys. The API includes all of the endpoints from the [standard keymanager API](https://ethereum.github.io/keymanager-APIs/) that is implemented by other clients and remote signers. It also includes some Lighthouse-specific endpoints which are described in -[Endpoints](./api-vc-endpoints.md). +[Endpoints](./api_vc_endpoints.md). > Note: All requests to the HTTP server must supply an -> [`Authorization`](./api-vc-auth-header.md) header. All responses contain a -> [`Signature`](./api-vc-sig-header.md) header for optional verification. +> [`Authorization`](./api_vc_auth_header.md) header. ## Starting the server diff --git a/book/src/api-vc-auth-header.md b/book/src/api_vc_auth_header.md similarity index 100% rename from book/src/api-vc-auth-header.md rename to book/src/api_vc_auth_header.md diff --git a/book/src/api-vc-endpoints.md b/book/src/api_vc_endpoints.md similarity index 97% rename from book/src/api-vc-endpoints.md rename to book/src/api_vc_endpoints.md index 98605a3dcd..a7c6f0ad5e 100644 --- a/book/src/api-vc-endpoints.md +++ b/book/src/api_vc_endpoints.md @@ -19,7 +19,7 @@ | [`POST /lighthouse/validators/web3signer`](#post-lighthousevalidatorsweb3signer) | Add web3signer validators. | | [`GET /lighthouse/logs`](#get-lighthouselogs) | Get logs | -The query to Lighthouse API endpoints requires authorization, see [Authorization Header](./api-vc-auth-header.md). +The query to Lighthouse API endpoints requires authorization, see [Authorization Header](./api_vc_auth_header.md). In addition to the above endpoints Lighthouse also supports all of the [standard keymanager APIs](https://ethereum.github.io/keymanager-APIs/). @@ -33,7 +33,7 @@ Returns the software version and `git` commit hash for the Lighthouse binary. |-------------------|--------------------------------------------| | Path | `/lighthouse/version` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | Command: @@ -71,7 +71,7 @@ Returns information regarding the health of the host machine. |-------------------|--------------------------------------------| | Path | `/lighthouse/health` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | *Note: this endpoint is presently only available on Linux.* @@ -132,7 +132,7 @@ Returns information regarding the health of the host machine. |-------------------|--------------------------------------------| | Path | `/lighthouse/ui/health` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | Command: @@ -178,7 +178,7 @@ Returns the graffiti that will be used for the next block proposal of each valid |-------------------|--------------------------------------------| | Path | `/lighthouse/ui/graffiti` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | Command: @@ -210,7 +210,7 @@ Returns the Ethereum proof-of-stake consensus specification loaded for this vali |-------------------|--------------------------------------------| | Path | `/lighthouse/spec` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | Command: @@ -326,7 +326,7 @@ Example Response Body ## `GET /lighthouse/auth` -Fetch the filesystem path of the [authorization token](./api-vc-auth-header.md). +Fetch the filesystem path of the [authorization token](./api_vc_auth_header.md). Unlike the other endpoints this may be called *without* providing an authorization token. This API is intended to be called from the same machine as the validator client, so that the token @@ -365,7 +365,7 @@ Lists all validators managed by this validator client. |-------------------|--------------------------------------------| | Path | `/lighthouse/validators` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | Command: @@ -409,7 +409,7 @@ Get a validator by their `voting_pubkey`. |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/:voting_pubkey` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200, 400 | Command: @@ -441,7 +441,7 @@ and `graffiti`. The following example updates a validator from `enabled: true` |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/:voting_pubkey` | | Method | PATCH | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200, 400 | Example Request Body @@ -491,7 +491,7 @@ Validators are generated from the mnemonic according to |-------------------|--------------------------------------------| | Path | `/lighthouse/validators` | | Method | POST | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | ### Example Request Body @@ -580,7 +580,7 @@ Import a keystore into the validator client. |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/keystore` | | Method | POST | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | ### Example Request Body @@ -676,7 +676,7 @@ generated with the path `m/12381/3600/i/42`. |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/mnemonic` | | Method | POST | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200 | ### Example Request Body @@ -739,7 +739,7 @@ Create any number of new validators, all of which will refer to a |-------------------|--------------------------------------------| | Path | `/lighthouse/validators/web3signer` | | Method | POST | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200, 400 | ### Example Request Body diff --git a/book/src/key-management.md b/book/src/archived-key-management.md similarity index 98% rename from book/src/key-management.md rename to book/src/archived-key-management.md index fa6e99a2aa..3f600794e0 100644 --- a/book/src/key-management.md +++ b/book/src/archived-key-management.md @@ -1,4 +1,4 @@ -# Key Management (Deprecated) +# Key Management [launchpad]: https://launchpad.ethereum.org/ @@ -22,7 +22,7 @@ Rather than continuing to read this page, we recommend users visit either: - The [Staking Launchpad][launchpad] for detailed, beginner-friendly instructions. - The [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) for a CLI tool used by the [Staking Launchpad][launchpad]. -- The [validator-manager documentation](./validator-manager.md) for a Lighthouse-specific tool for streamlined validator management tools. +- The [validator-manager documentation](./validator_manager.md) for a Lighthouse-specific tool for streamlined validator management tools. ## The `lighthouse account-manager` diff --git a/book/src/merge-migration.md b/book/src/archived-merge-migration.md similarity index 99% rename from book/src/merge-migration.md rename to book/src/archived-merge-migration.md index 7a123254bf..ac9c78c5e3 100644 --- a/book/src/merge-migration.md +++ b/book/src/archived-merge-migration.md @@ -14,7 +14,7 @@ the merge: 2. If your Lighthouse node has validators attached you *must* nominate an Ethereum address to receive transactions tips from blocks proposed by your validators. These changes should be made to your `lighthouse vc` configuration, and are covered on the - [Suggested fee recipient](./suggested-fee-recipient.md) page. + [Suggested fee recipient](./validator_fee_recipient.md) page. Additionally, you *must* update Lighthouse to v3.0.0 (or later), and must update your execution engine to a merge-ready version. diff --git a/book/src/archived.md b/book/src/archived.md new file mode 100644 index 0000000000..7b6e4b7e8e --- /dev/null +++ b/book/src/archived.md @@ -0,0 +1,3 @@ +# Archived + +This section keeps the topics that are deprecated or less applicable for archived purposes. diff --git a/book/src/pi.md b/book/src/archived_pi.md similarity index 91% rename from book/src/pi.md rename to book/src/archived_pi.md index b91ecab548..6afbcebd66 100644 --- a/book/src/pi.md +++ b/book/src/archived_pi.md @@ -7,7 +7,7 @@ Tested on: - Raspberry Pi 4 Model B (4GB) - `Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1011-raspi aarch64)` -*Note: [Lighthouse supports cross-compiling](./cross-compiling.md) to target a +*Note: [Lighthouse supports cross-compiling](./installation_cross_compiling.md) to target a Raspberry Pi (`aarch64`). Compiling on a faster machine (i.e., `x86_64` desktop) may be convenient.* @@ -58,7 +58,7 @@ make > > Compiling Lighthouse can take up to an hour. The safety guarantees provided by the Rust language unfortunately result in a lengthy compilation time on a low-spec CPU like a Raspberry Pi. For faster -compilation on low-spec hardware, try [cross-compiling](./cross-compiling.md) on a more powerful +compilation on low-spec hardware, try [cross-compiling](./installation_cross_compiling.md) on a more powerful computer (e.g., compile for RasPi from your desktop computer). Once installation has finished, confirm Lighthouse is installed by viewing the diff --git a/book/src/contributing.md b/book/src/contributing.md index 312acccbc0..332afbfd70 100644 --- a/book/src/contributing.md +++ b/book/src/contributing.md @@ -15,7 +15,7 @@ to work on. To start contributing, 1. Read our [how to contribute](https://github.com/sigp/lighthouse/blob/unstable/CONTRIBUTING.md) document. -2. Setup a [development environment](./setup.md). +2. Setup a [development environment](./contributing_setup.md). 3. Browse through the [open issues](https://github.com/sigp/lighthouse/issues) (tip: look for the [good first issue](https://github.com/sigp/lighthouse/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) @@ -127,5 +127,5 @@ suggest: - [Rust by example](https://doc.rust-lang.org/stable/rust-by-example/) - [Learning Rust With Entirely Too Many Linked Lists](http://cglab.ca/~abeinges/blah/too-many-lists/book/) - [Rustlings](https://github.com/rustlings/rustlings) -- [Rust Exercism](https://exercism.io/tracks/rust) +- [Rust Exercism](https://exercism.org/tracks/rust) - [Learn X in Y minutes - Rust](https://learnxinyminutes.com/docs/rust/) diff --git a/book/src/setup.md b/book/src/contributing_setup.md similarity index 100% rename from book/src/setup.md rename to book/src/contributing_setup.md diff --git a/book/src/faq.md b/book/src/faq.md index d23951c8c7..a741834501 100644 --- a/book/src/faq.md +++ b/book/src/faq.md @@ -146,7 +146,7 @@ An example of the full log is shown below: WARN BlockProcessingFailure outcome: MissingBeaconBlock(0xbdba211f8d72029554e405d8e4906690dca807d1d7b1bc8c9b88d7970f1648bc), msg: unexpected condition in processing block. ``` -`MissingBeaconBlock` suggests that the database has corrupted. You should wipe the database and use [Checkpoint Sync](./checkpoint-sync.md) to resync the beacon chain. +`MissingBeaconBlock` suggests that the database has corrupted. You should wipe the database and use [Checkpoint Sync](./advanced_checkpoint_sync.md) to resync the beacon chain. ### After checkpoint sync, the progress of `downloading historical blocks` is slow. Why? @@ -281,7 +281,7 @@ You should **never** use duplicate/redundant validator keypairs or validator cli duplicate your JSON keystores and don't run `lighthouse vc` twice). This will lead to slashing. However, there are some components which can be configured with redundancy. See the -[Redundancy](./redundancy.md) guide for more information. +[Redundancy](./advanced_redundancy.md) guide for more information. ### I am missing attestations. Why? @@ -323,7 +323,7 @@ Another possible reason for missing the head vote is due to a chain "reorg". A r ### Can I submit a voluntary exit message without running a beacon node? -Yes. Beaconcha.in provides the tool to broadcast the message. You can create the voluntary exit message file with [ethdo](https://github.com/wealdtech/ethdo/releases/tag/v1.30.0) and submit the message via the [beaconcha.in](https://beaconcha.in/tools/broadcast) website. A guide on how to use `ethdo` to perform voluntary exit can be found [here](https://github.com/eth-educators/ethstaker-guides/blob/main/voluntary-exit.md). +Yes. Beaconcha.in provides the tool to broadcast the message. You can create the voluntary exit message file with [ethdo](https://github.com/wealdtech/ethdo/releases/tag/v1.30.0) and submit the message via the [beaconcha.in](https://beaconcha.in/tools/broadcast) website. A guide on how to use `ethdo` to perform voluntary exit can be found [here](https://github.com/eth-educators/ethstaker-guides/blob/main/docs/voluntary-exit.md). It is also noted that you can submit your BLS-to-execution-change message to update your withdrawal credentials from type `0x00` to `0x01` using the same link. @@ -341,13 +341,13 @@ No. You can just import new validator keys to the destination directory. If the Generally yes. -If you do not want to stop `lighthouse vc`, you can use the [key manager API](./api-vc-endpoints.md) to import keys. +If you do not want to stop `lighthouse vc`, you can use the [key manager API](./api_vc_endpoints.md) to import keys. ### How can I delete my validator once it is imported? Lighthouse supports the [KeyManager API](https://ethereum.github.io/keymanager-APIs/#/Local%20Key%20Manager/deleteKeys) to delete validators and remove them from the `validator_definitions.yml` file. To do so, start the validator client with the flag `--http` and call the API. -If you are looking to delete the validators in one node and import it to another, you can use the [validator-manager](./validator-manager-move.md) to move the validators across nodes without the hassle of deleting and importing the keys. +If you are looking to delete the validators in one node and import it to another, you can use the [validator-manager](./validator_manager_move.md) to move the validators across nodes without the hassle of deleting and importing the keys. ## Network, Monitoring and Maintenance @@ -389,9 +389,9 @@ expect, there are a few things to check on: ### How do I update lighthouse? -If you are updating to new release binaries, it will be the same process as described [here.](./installation-binaries.md) +If you are updating to new release binaries, it will be the same process as described [here.](./installation_binaries.md) -If you are updating by rebuilding from source, see [here.](./installation-source.md#update-lighthouse) +If you are updating by rebuilding from source, see [here.](./installation_source.md#update-lighthouse) If you are running the docker image provided by Sigma Prime on Dockerhub, you can update to specific versions, for example: @@ -399,7 +399,7 @@ If you are running the docker image provided by Sigma Prime on Dockerhub, you ca docker pull sigp/lighthouse:v1.0.0 ``` -If you are building a docker image, the process will be similar to the one described [here.](./docker.md#building-the-docker-image) +If you are building a docker image, the process will be similar to the one described [here.](./installation_docker.md#building-the-docker-image) You just need to make sure the code you have checked out is up to date. ### Do I need to set up any port mappings (port forwarding)? @@ -436,7 +436,7 @@ Opening these ports will make your Lighthouse node maximally contactable. Apart from using block explorers, you may use the "Validator Monitor" built into Lighthouse which provides logging and Prometheus/Grafana metrics for individual validators. See [Validator -Monitoring](./validator-monitoring.md) for more information. Lighthouse has also developed Lighthouse UI (Siren) to monitor performance, see [Lighthouse UI (Siren)](./lighthouse-ui.md). +Monitoring](./validator_monitoring.md) for more information. Lighthouse has also developed Lighthouse UI (Siren) to monitor performance, see [Lighthouse UI (Siren)](./ui.md). ### My beacon node and validator client are on different servers. How can I point the validator client to the beacon node? @@ -454,7 +454,7 @@ The setting on the beacon node is the same for both cases below. In the beacon n curl "http://local_IP:5052/eth/v1/node/version" ``` - You can refer to [Redundancy](./redundancy.md) for more information. + You can refer to [Redundancy](./advanced_redundancy.md) for more information. 2. If the beacon node and validator clients are on different servers _and different networks_, it is necessary to perform port forwarding of the SSH port (e.g., the default port 22) on the router, and also allow firewall on the SSH port. The connection can be established via port forwarding on the router. @@ -514,11 +514,11 @@ which shows that there are a total of 36 peers connected via QUIC. ### What should I do if I lose my slashing protection database? -See [here](./slashing-protection.md#misplaced-slashing-database). +See [here](./validator_slashing_protection.md#misplaced-slashing-database). ### I can't compile lighthouse -See [here.](./installation-source.md#troubleshooting) +See [here.](./installation_source.md#troubleshooting) ### How do I check the version of Lighthouse that is running? @@ -550,7 +550,7 @@ which says that the version is v4.1.0. ### Does Lighthouse have pruning function like the execution client to save disk space? -Yes, Lighthouse supports [state pruning](./database-migrations.md#how-to-prune-historic-states) which can help to save disk space. +Yes, Lighthouse supports [state pruning](./advanced_database_migrations.md#how-to-prune-historic-states) which can help to save disk space. ### Can I use a HDD for the freezer database and only have the hot db on SSD? diff --git a/book/src/imgs/per-epoch.png b/book/src/imgs/per-epoch.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ac77ecbbeebb2a83b0b9630d969bd80b4527ba GIT binary patch literal 258688 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%0AiN5##f=GT{0g|eR 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

&6{)G}~CD4NyIT&bu#A_Vp<4J(h(pRc3sG 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 literal 0 HcmV?d00001 diff --git a/book/src/imgs/per-slot.png b/book/src/imgs/per-slot.png new file mode 100644 index 0000000000000000000000000000000000000000..91b9c12e4c66f5c4aea5cdab7610bda3dde83221 GIT binary patch literal 273656 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ͨqoGZ2sE@^4D2~yg= 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

A(v$V(_Jyz8>oe6R)jyRX6)j{njylB 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

a6PWyQt3cd|$sQ8pt3 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 literal 0 HcmV?d00001 diff --git a/book/src/installation.md b/book/src/installation.md index 137a00b918..95550e0807 100644 --- a/book/src/installation.md +++ b/book/src/installation.md @@ -4,18 +4,18 @@ Lighthouse runs on Linux, macOS, and Windows. There are three core methods to obtain the Lighthouse application: -- [Pre-built binaries](./installation-binaries.md). -- [Docker images](./docker.md). -- [Building from source](./installation-source.md). +- [Pre-built binaries](./installation_binaries.md). +- [Docker images](./installation_docker.md). +- [Building from source](./installation_source.md). Additionally, there are two extra guides for specific uses: -- [Raspberry Pi 4 guide](./pi.md). (Archived) -- [Cross-compiling guide for developers](./cross-compiling.md). +- [Raspberry Pi 4 guide](./archived_pi.md). (Archived) +- [Cross-compiling guide for developers](./installation_cross_compiling.md). There are also community-maintained installation methods: -- [Homebrew package](./homebrew.md). +- [Homebrew package](./installation_homebrew.md). - Arch Linux AUR packages: [source](https://aur.archlinux.org/packages/lighthouse-ethereum), [binary](https://aur.archlinux.org/packages/lighthouse-ethereum-bin). diff --git a/book/src/installation-binaries.md b/book/src/installation_binaries.md similarity index 100% rename from book/src/installation-binaries.md rename to book/src/installation_binaries.md diff --git a/book/src/cross-compiling.md b/book/src/installation_cross_compiling.md similarity index 90% rename from book/src/cross-compiling.md rename to book/src/installation_cross_compiling.md index c90001d561..4f6ba9af38 100644 --- a/book/src/cross-compiling.md +++ b/book/src/installation_cross_compiling.md @@ -34,10 +34,10 @@ in `lighthouse/target/aarch64-unknown-linux-gnu/release`. When using the makefile the set of features used for building can be controlled with the environment variable `CROSS_FEATURES`. See [Feature - Flags](./installation-source.md#feature-flags) for available features. + Flags](./installation_source.md#feature-flags) for available features. ## Compilation Profiles When using the makefile the build profile can be controlled with the environment variable -`CROSS_PROFILE`. See [Compilation Profiles](./installation-source.md#compilation-profiles) for +`CROSS_PROFILE`. See [Compilation Profiles](./installation_source.md#compilation-profiles) for available profiles. diff --git a/book/src/docker.md b/book/src/installation_docker.md similarity index 100% rename from book/src/docker.md rename to book/src/installation_docker.md diff --git a/book/src/homebrew.md b/book/src/installation_homebrew.md similarity index 100% rename from book/src/homebrew.md rename to book/src/installation_homebrew.md diff --git a/book/src/installation-priorities.md b/book/src/installation_priorities.md similarity index 100% rename from book/src/installation-priorities.md rename to book/src/installation_priorities.md diff --git a/book/src/installation-source.md b/book/src/installation_source.md similarity index 95% rename from book/src/installation-source.md rename to book/src/installation_source.md index 19098a5bc8..0aa8a99a5e 100644 --- a/book/src/installation-source.md +++ b/book/src/installation_source.md @@ -23,6 +23,8 @@ The rustup installer provides an easy way to update the Rust compiler, and works With Rust installed, follow the instructions below to install dependencies relevant to your operating system. +> Note: For Linux OS, general Linux File Systems such as Ext4 or XFS are fine. We recommend to avoid using Btrfs file system as it has been reported to be slow and the node will suffer from performance degradation as a result. + ### Ubuntu Install the following packages: @@ -216,7 +218,7 @@ Rust Version (MSRV) which is listed under the `rust-version` key in Lighthouse's If compilation fails with `(signal: 9, SIGKILL: kill)`, this could mean your machine ran out of memory during compilation. If you are on a resource-constrained device you can -look into [cross compilation](./cross-compiling.md), or use a [pre-built +look into [cross compilation](./installation_cross_compiling.md), or use a [pre-built binary](https://github.com/sigp/lighthouse/releases). If compilation fails with `error: linking with cc failed: exit code: 1`, try running `cargo clean`. diff --git a/book/src/intro.md b/book/src/intro.md index 9892a8a49d..e572904685 100644 --- a/book/src/intro.md +++ b/book/src/intro.md @@ -19,9 +19,9 @@ You may read this book from start to finish, or jump to some of these topics: - Follow the [Installation Guide](./installation.md) to install Lighthouse. - Run your very [own beacon node](./run_a_node.md). -- Learn about [becoming a mainnet validator](./mainnet-validator.md). -- Get hacking with the [Development Environment Guide](./setup.md). -- Utilize the whole stack by starting a [local testnet](./setup.md#local-testnets). +- Learn about [becoming a mainnet validator](./mainnet_validator.md). +- Get hacking with the [Development Environment Guide](./contributing_setup.md). +- Utilize the whole stack by starting a [local testnet](./contributing_setup.md#local-testnets). - Query the [RESTful HTTP API](./api.md) using `curl`. Prospective contributors can read the [Contributing](./contributing.md) section diff --git a/book/src/mainnet-validator.md b/book/src/mainnet_validator.md similarity index 96% rename from book/src/mainnet-validator.md rename to book/src/mainnet_validator.md index c53be97ccf..d21d49f0c9 100644 --- a/book/src/mainnet-validator.md +++ b/book/src/mainnet_validator.md @@ -1,9 +1,9 @@ # Become an Ethereum Consensus Mainnet Validator [launchpad]: https://launchpad.ethereum.org/ -[advanced-datadir]: ./advanced-datadir.md +[advanced-datadir]: ./advanced_datadir.md [license]: https://github.com/sigp/lighthouse/blob/stable/LICENSE -[slashing]: ./slashing-protection.md +[slashing]: ./validator_slashing_protection.md [discord]: https://discord.gg/cyAszAh Becoming an Ethereum consensus validator is rewarding, but it's not for the faint of heart. You'll need to be @@ -54,7 +54,7 @@ and follow the instructions to generate the keys. When prompted for a network, s Upon completing this step, the files `deposit_data-*.json` and `keystore-m_*.json` will be created. The keys that are generated from staking-deposit-cli can be easily loaded into a Lighthouse validator client (`lighthouse vc`) in [Step 3](#step-3-import-validator-keys-to-lighthouse). In fact, both of these programs are designed to work with each other. -> Lighthouse also supports creating validator keys, see [Key management](./key-management.md) for more info. +> Lighthouse also supports creating validator keys, see [Validator Manager Create](./validator_manager_create.md) for more info. ### Step 2. Start an execution client and Lighthouse beacon node @@ -99,7 +99,7 @@ Enter the keystore password, or press enter to omit it: ``` The user can choose whether or not they'd like to store the validator password -in the [`validator_definitions.yml`](./validator-management.md) file. If the +in the [`validator_definitions.yml`](./validator_management.md) file. If the password is *not* stored here, the validator client (`lighthouse vc`) application will ask for the password each time it starts. This might be nice for some users from a security perspective (i.e., if it is a shared computer), @@ -179,7 +179,7 @@ After the validator is running and performing its duties, it is important to kee The next important thing is to stay up to date with updates to Lighthouse and the execution client. Updates are released from time to time, typically once or twice a month. For Lighthouse updates, you can subscribe to notifications on [Github](https://github.com/sigp/lighthouse) by clicking on `Watch`. If you only want to receive notification on new releases, select `Custom`, then `Releases`. You could also join [Lighthouse Discord](https://discord.gg/cyAszAh) where we will make an announcement when there is a new release. -You may also want to try out [Siren](./lighthouse-ui.md), a UI developed by Lighthouse to monitor validator performance. +You may also want to try out [Siren](./ui.md), a UI developed by Lighthouse to monitor validator performance. Once you are familiar with running a validator and server maintenance, you'll find that running Lighthouse is easy. Install it, start it, monitor it and keep it updated. You shouldn't need to interact with it on a day-to-day basis. Happy staking! diff --git a/book/src/run_a_node.md b/book/src/run_a_node.md index 9b9e0cba8e..15567497e5 100644 --- a/book/src/run_a_node.md +++ b/book/src/run_a_node.md @@ -129,7 +129,7 @@ INFO Downloading historical blocks est_time: 5 hrs 0 mins, speed: 111.96 slots/ Once backfill is complete, a `INFO Historical block download complete` log will be emitted. -Check out the [FAQ](./checkpoint-sync.md#faq) for more information on checkpoint sync. +Check out the [FAQ](./advanced_checkpoint_sync.md#faq) for more information on checkpoint sync. ### Logs - Syncing @@ -146,11 +146,10 @@ Once you see the above message - congratulations! This means that your node is s Several other resources are the next logical step to explore after running your beacon node: -- If you intend to run a validator, proceed to [become a validator](./mainnet-validator.md); -- Explore how to [manage your keys](./key-management.md); -- Research on [validator management](./validator-management.md); +- If you intend to run a validator, proceed to [become a validator](./mainnet_validator.md); +- Explore how to [manage your keys](./archived_key_management.md); +- Research on [validator management](./validator_management.md); - Dig into the [APIs](./api.md) that the beacon node and validator client provide; -- Study even more about [checkpoint sync](./checkpoint-sync.md); or -- Investigate what steps had to be taken in the past to execute a smooth [merge migration](./merge-migration.md). +- Study even more about [checkpoint sync](./advanced_checkpoint_sync.md); or Finally, if you are struggling with anything, join our [Discord](https://discord.gg/cyAszAh). We are happy to help! diff --git a/book/src/ui-installation.md b/book/src/ui-installation.md deleted file mode 100644 index 9cd84e5160..0000000000 --- a/book/src/ui-installation.md +++ /dev/null @@ -1,73 +0,0 @@ -# 📦 Installation - -Siren supports any operating system that supports containers and/or NodeJS 18, this includes Linux, macOS, and Windows. The recommended way of running Siren is by launching the [docker container](https://hub.docker.com/r/sigp/siren) , but running the application directly is also possible. - -## Version Requirement - -To ensure proper functionality, the Siren app requires Lighthouse v4.3.0 or higher. You can find these versions on the [releases](https://github.com/sigp/lighthouse/releases) page of the Lighthouse repository. - -## Running the Docker container (Recommended) - -The most convenient way to run Siren is to use the Docker images built and published by Sigma Prime. - - They can be found on [Docker hub](https://hub.docker.com/r/sigp/siren/tags), or pulled directly with `docker pull sigp/siren` - -Configuration is done through environment variables, the easiest way to get started is by copying `.env.example` to `.env` and editing the relevant sections (typically, this would at least include adding `BEACON_URL`, `VALIDATOR_URL`, `API_TOKEN` and `SESSION_PASSWORD`) - -Then to run the image: - -`docker compose up` -or -`docker run --rm -ti --name siren -p 4443:443 --env-file $PWD/.env sigp/siren` - -This command will open port 4443, allowing your browser to connect. - -To start Siren, visit `https://localhost:4443` in your web browser. - -Advanced users can mount their own certificates, see the `SSL Certificates` section below - -## Building From Source - -### Docker - -The docker image can be built with the following command: -`docker build -f Dockerfile -t siren .` - -### Building locally - -To build from source, ensure that your system has `Node v18.18` and `yarn` installed. - -#### Build and run the backend - -Navigate to the backend directory `cd backend`. Install all required Node packages by running `yarn`. Once the installation is complete, compile the backend with `yarn build`. Deploy the backend in a production environment, `yarn start:production`. This ensures optimal performance. - -#### Build and run the frontend - -After initializing the backend, return to the root directory. Install all frontend dependencies by executing `yarn`. Build the frontend using `yarn build`. Start the frontend production server with `yarn start`. - -This will allow you to access siren at `http://localhost:3000` by default. - -## Advanced configuration - -### About self-signed SSL certificates - -By default, Siren will generate and use a self-signed certificate on startup. -This will generate a security warning when you try to access the interface. -We recommend to only disable SSL if you would access Siren over a local LAN or otherwise highly trusted or encrypted network (i.e. VPN). - -#### Generating persistent SSL certificates and installing them to your system - -[mkcert](https://github.com/FiloSottile/mkcert) is a tool that makes it super easy to generate a self-signed certificate that is trusted by your browser. - -To use it for `siren`, install it following the instructions. Then, run `mkdir certs; mkcert -cert-file certs/cert.pem -key-file certs/key.pem 127.0.0.1 localhost` (add or replace any IP or hostname that you would use to access it at the end of this command) - -The nginx SSL config inside Siren's container expects 3 files: `/certs/cert.pem` `/certs/key.pem` `/certs/key.pass`. If `/certs/cert.pem` does not exist, it will generate a self-signed certificate as mentioned above. If `/certs/cert.pem` does exist, it will attempt to use your provided or persisted certificates. - -### Configuration through environment variables - -For those who prefer to use environment variables to configure Siren instead of using an `.env` file, this is fully supported. In some cases this may even be preferred. - -#### Docker installed through `snap` - -If you installed Docker through a snap (i.e. on Ubuntu), Docker will have trouble accessing the `.env` file. In this case it is highly recommended to pass the config to the container with environment variables. -Note that the defaults in `.env.example` will be used as fallback, if no other value is provided. diff --git a/book/src/lighthouse-ui.md b/book/src/ui.md similarity index 79% rename from book/src/lighthouse-ui.md rename to book/src/ui.md index f2662f4a69..e980e90268 100644 --- a/book/src/lighthouse-ui.md +++ b/book/src/ui.md @@ -21,11 +21,11 @@ The UI is currently in active development. It resides in the See the following Siren specific topics for more context-specific information: -- [Configuration Guide](./ui-configuration.md) - Explanation of how to setup +- [Configuration Guide](./ui_configuration.md) - Explanation of how to setup and configure Siren. -- [Authentication Guide](./ui-authentication.md) - Explanation of how Siren authentication works and protects validator actions. -- [Usage](./ui-usage.md) - Details various Siren components. -- [FAQs](./ui-faqs.md) - Frequently Asked Questions. +- [Authentication Guide](./ui_authentication.md) - Explanation of how Siren authentication works and protects validator actions. +- [Usage](./ui_usage.md) - Details various Siren components. +- [FAQs](./ui_faqs.md) - Frequently Asked Questions. ## Contributing diff --git a/book/src/ui-authentication.md b/book/src/ui_authentication.md similarity index 87% rename from book/src/ui-authentication.md rename to book/src/ui_authentication.md index 81b867bae2..36e3835e3b 100644 --- a/book/src/ui-authentication.md +++ b/book/src/ui_authentication.md @@ -2,12 +2,12 @@ ## Siren Session -For enhanced security, Siren will require users to authenticate with their session password to access the dashboard. This is crucial because Siren now includes features that can permanently alter the status of the user's validators. The session password must be set during the [configuration](./ui-configuration.md) process before running the Docker or local build, either in an `.env` file or via Docker flags. +For enhanced security, Siren will require users to authenticate with their session password to access the dashboard. This is crucial because Siren now includes features that can permanently alter the status of the user's validators. The session password must be set during the [configuration](./ui_configuration.md) process before running the Docker or local build, either in an `.env` file or via Docker flags. ![exit](imgs/ui-session.png) ## Protected Actions -Prior to executing any sensitive validator action, Siren will request authentication of the session password. If you wish to update your password please refer to the Siren [configuration process](./ui-configuration.md). +Prior to executing any sensitive validator action, Siren will request authentication of the session password. If you wish to update your password please refer to the Siren [configuration process](./ui_configuration.md). ![exit](imgs/ui-auth.png) diff --git a/book/src/ui-configuration.md b/book/src/ui_configuration.md similarity index 99% rename from book/src/ui-configuration.md rename to book/src/ui_configuration.md index 34cc9fe7ca..64b293372b 100644 --- a/book/src/ui-configuration.md +++ b/book/src/ui_configuration.md @@ -29,7 +29,7 @@ We recommend running Siren's container next to your beacon node (on the same ser cd Siren ``` - 1. Create a configuration file in the `Siren` directory: `nano .env` and insert the following fields to the `.env` file. The field values are given here as an example, modify the fields as necessary. For example, the `API_TOKEN` can be obtained from [`Validator Client Authorization Header`](./api-vc-auth-header.md) + 1. Create a configuration file in the `Siren` directory: `nano .env` and insert the following fields to the `.env` file. The field values are given here as an example, modify the fields as necessary. For example, the `API_TOKEN` can be obtained from [`Validator Client Authorization Header`](./api_vc_auth_header.md) A full example with all possible configuration options can be found [here](https://github.com/sigp/siren/blob/stable/.env.example). diff --git a/book/src/ui-faqs.md b/book/src/ui_faqs.md similarity index 92% rename from book/src/ui-faqs.md rename to book/src/ui_faqs.md index 29de889e5f..db365e2fa0 100644 --- a/book/src/ui-faqs.md +++ b/book/src/ui_faqs.md @@ -6,11 +6,11 @@ Yes, the most current Siren version requires Lighthouse v4.3.0 or higher to func ## 2. Where can I find my API token? -The required API token may be found in the default data directory of the validator client. For more information please refer to the lighthouse ui configuration [`api token section`](./api-vc-auth-header.md). +The required API token may be found in the default data directory of the validator client. For more information please refer to the lighthouse ui configuration [`api token section`](./api_vc_auth_header.md). ## 3. How do I fix the Node Network Errors? -If you receive a red notification with a BEACON or VALIDATOR NODE NETWORK ERROR you can refer to the lighthouse ui [`configuration`](./ui-configuration.md#configuration). +If you receive a red notification with a BEACON or VALIDATOR NODE NETWORK ERROR you can refer to the lighthouse ui [`configuration`](./ui_configuration.md#configuration). ## 4. How do I connect Siren to Lighthouse from a different computer on the same network? @@ -19,7 +19,7 @@ That being said, it is entirely possible to have it published over the internet, ## 5. How can I use Siren to monitor my validators remotely when I am not at home? -Most contemporary home routers provide options for VPN access in various ways. A VPN permits a remote computer to establish a connection with internal computers within a home network. With a VPN configuration in place, connecting to the VPN enables you to treat your computer as if it is part of your local home network. The connection process involves following the setup steps for connecting via another machine on the same network on the Siren configuration page and [`configuration`](./ui-configuration.md#configuration). +Most contemporary home routers provide options for VPN access in various ways. A VPN permits a remote computer to establish a connection with internal computers within a home network. With a VPN configuration in place, connecting to the VPN enables you to treat your computer as if it is part of your local home network. The connection process involves following the setup steps for connecting via another machine on the same network on the Siren configuration page and [`configuration`](./ui_configuration.md#configuration). ## 6. Does Siren support reverse proxy or DNS named addresses? diff --git a/book/src/ui-usage.md b/book/src/ui_usage.md similarity index 100% rename from book/src/ui-usage.md rename to book/src/ui_usage.md diff --git a/book/src/validator-doppelganger.md b/book/src/validator_doppelganger.md similarity index 98% rename from book/src/validator-doppelganger.md rename to book/src/validator_doppelganger.md index a3d60d31b3..006df50bd9 100644 --- a/book/src/validator-doppelganger.md +++ b/book/src/validator_doppelganger.md @@ -1,8 +1,8 @@ # Doppelganger Protection [doppelgänger]: https://en.wikipedia.org/wiki/Doppelg%C3%A4nger -[Slashing Protection]: ./slashing-protection.md -[VC HTTP API]: ./api-vc.md +[Slashing Protection]: ./validator_slashing_protection.md +[VC HTTP API]: ./api_vc.md From Lighthouse `v1.5.0`, the *Doppelganger Protection* feature is available for the Validator Client. Taken from the German *[doppelgänger]*, which translates literally to "double-walker", a diff --git a/book/src/suggested-fee-recipient.md b/book/src/validator_fee_recipient.md similarity index 96% rename from book/src/suggested-fee-recipient.md rename to book/src/validator_fee_recipient.md index 4a9be7b963..2b125f5033 100644 --- a/book/src/suggested-fee-recipient.md +++ b/book/src/validator_fee_recipient.md @@ -82,7 +82,7 @@ validator client in order for the execution node to be given adequate notice of ## Setting the fee recipient dynamically using the keymanager API -When the [validator client API](api-vc.md) is enabled, the +When the [validator client API](api_vc.md) is enabled, the [standard keymanager API](https://ethereum.github.io/keymanager-APIs/) includes an endpoint for setting the fee recipient dynamically for a given public key. When used, the fee recipient will be saved in `validator_definitions.yml` so that it persists across restarts of the validator @@ -92,7 +92,7 @@ client. |-------------------|--------------------------------------------| | Path | `/eth/v1/validator/{pubkey}/feerecipient` | | Method | POST | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 202, 404 | ### Example Request Body @@ -117,7 +117,7 @@ curl -X POST \ http://localhost:5062/eth/v1/validator/${PUBKEY}/feerecipient | jq ``` -Note that an authorization header is required to interact with the API. This is specified with the header `-H "Authorization: Bearer $(cat ${DATADIR}/validators/api-token.txt)"` which read the API token to supply the authentication. Refer to [Authorization Header](./api-vc-auth-header.md) for more information. If you are having permission issue with accessing the API token file, you can modify the header to become `-H "Authorization: Bearer $(sudo cat ${DATADIR}/validators/api-token.txt)"`. +Note that an authorization header is required to interact with the API. This is specified with the header `-H "Authorization: Bearer $(cat ${DATADIR}/validators/api-token.txt)"` which read the API token to supply the authentication. Refer to [Authorization Header](./api_vc_auth_header.md) for more information. If you are having permission issue with accessing the API token file, you can modify the header to become `-H "Authorization: Bearer $(sudo cat ${DATADIR}/validators/api-token.txt)"`. #### Successful Response (202) @@ -135,7 +135,7 @@ The same path with a `GET` request can be used to query the fee recipient for a |-------------------|--------------------------------------------| | Path | `/eth/v1/validator/{pubkey}/feerecipient` | | Method | GET | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 200, 404 | Command: @@ -170,7 +170,7 @@ This is useful if you want the fee recipient to fall back to the validator clien |-------------------|--------------------------------------------| | Path | `/eth/v1/validator/{pubkey}/feerecipient` | | Method | DELETE | -| Required Headers | [`Authorization`](./api-vc-auth-header.md) | +| Required Headers | [`Authorization`](./api_vc_auth_header.md) | | Typical Responses | 204, 404 | Command: diff --git a/book/src/graffiti.md b/book/src/validator_graffiti.md similarity index 95% rename from book/src/graffiti.md rename to book/src/validator_graffiti.md index 7b402ea866..9908d056da 100644 --- a/book/src/graffiti.md +++ b/book/src/validator_graffiti.md @@ -32,7 +32,7 @@ Lighthouse will first search for the graffiti corresponding to the public key of Users can set validator specific graffitis in `validator_definitions.yml` with the `graffiti` key. This option is recommended for static setups where the graffitis won't change on every new block proposal. -You can also update the graffitis in the `validator_definitions.yml` file using the [Lighthouse API](api-vc-endpoints.html#patch-lighthousevalidatorsvoting_pubkey). See example in [Set Graffiti via HTTP](#set-graffiti-via-http). +You can also update the graffitis in the `validator_definitions.yml` file using the [Lighthouse API](api_vc_endpoints.html#patch-lighthousevalidatorsvoting_pubkey). See example in [Set Graffiti via HTTP](#set-graffiti-via-http). Below is an example of the validator_definitions.yml with validator specific graffitis: @@ -74,11 +74,11 @@ Usage: `lighthouse bn --graffiti fortytwo` ## Set Graffiti via HTTP -Use the [Lighthouse API](api-vc-endpoints.md) to set graffiti on a per-validator basis. This method updates the graffiti +Use the [Lighthouse API](api_vc_endpoints.md) to set graffiti on a per-validator basis. This method updates the graffiti both in memory and in the `validator_definitions.yml` file. The new graffiti will be used in the next block proposal without requiring a validator client restart. -Refer to [Lighthouse API](api-vc-endpoints.html#patch-lighthousevalidatorsvoting_pubkey) for API specification. +Refer to [Lighthouse API](api_vc_endpoints.html#patch-lighthousevalidatorsvoting_pubkey) for API specification. ### Example Command diff --git a/book/src/validator-management.md b/book/src/validator_management.md similarity index 98% rename from book/src/validator-management.md rename to book/src/validator_management.md index b9610b6967..18abfb1538 100644 --- a/book/src/validator-management.md +++ b/book/src/validator_management.md @@ -13,7 +13,7 @@ standard directories and do not start their `lighthouse vc` with the this document. However, users with more complex needs may find this document useful. -The [lighthouse validator-manager](./validator-manager.md) command can be used +The [lighthouse validator-manager](./validator_manager.md) command can be used to create and import validators to a Lighthouse VC. It can also be used to move validators between two Lighthouse VCs. @@ -54,7 +54,7 @@ Each permitted field of the file is listed below for reference: - `enabled`: A `true`/`false` indicating if the validator client should consider this validator "enabled". - `voting_public_key`: A validator public key. -- `type`: How the validator signs messages (this can be `local_keystore` or `web3signer` (see [Web3Signer](./validator-web3signer.md))). +- `type`: How the validator signs messages (this can be `local_keystore` or `web3signer` (see [Web3Signer](./advanced_web3signer.md))). - `voting_keystore_path`: The path to a EIP-2335 keystore. - `voting_keystore_password_path`: The path to the password for the EIP-2335 keystore. - `voting_keystore_password`: The password to the EIP-2335 keystore. diff --git a/book/src/validator-manager.md b/book/src/validator_manager.md similarity index 93% rename from book/src/validator-manager.md rename to book/src/validator_manager.md index 11df2af037..c610340b39 100644 --- a/book/src/validator-manager.md +++ b/book/src/validator_manager.md @@ -30,6 +30,6 @@ The `validator-manager` boasts the following features: ## Guides -- [Creating and importing validators using the `create` and `import` commands.](./validator-manager-create.md) -- [Moving validators between two VCs using the `move` command.](./validator-manager-move.md) -- [Managing validators such as delete, import and list validators.](./validator-manager-api.md) +- [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) +- [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) +- [Managing validators such as delete, import and list validators.](./validator_manager_api.md) diff --git a/book/src/validator-manager-api.md b/book/src/validator_manager_api.md similarity index 100% rename from book/src/validator-manager-api.md rename to book/src/validator_manager_api.md diff --git a/book/src/validator-manager-create.md b/book/src/validator_manager_create.md similarity index 98% rename from book/src/validator-manager-create.md rename to book/src/validator_manager_create.md index b4c86dc6da..458907bc65 100644 --- a/book/src/validator-manager-create.md +++ b/book/src/validator_manager_create.md @@ -69,7 +69,7 @@ lighthouse \ > Be sure to remove `./validators.json` after the import is successful since it > contains unencrypted validator keystores. -> Note: To import validators with validator-manager using keystore files created using the staking deposit CLI, refer to [Managing Validators](./validator-manager-api.md#import). +> Note: To import validators with validator-manager using keystore files created using the staking deposit CLI, refer to [Managing Validators](./validator_manager_api.md#import). ## Detailed Guide @@ -179,7 +179,7 @@ INFO Modified key_cache saved successfully The WARN message means that the `validators.json` file does not contain the slashing protection data. This is normal if you are starting a new validator. The flag `--enable-doppelganger-protection` will also protect users from potential slashing risk. The validators will now go through 2-3 epochs of [doppelganger -protection](./validator-doppelganger.md) and will automatically start performing +protection](./validator_doppelganger.md) and will automatically start performing their duties when they are deposited and activated. If the host VC contains the same public key as the `validators.json` file, an error will be shown and the `import` process will stop: diff --git a/book/src/validator-manager-move.md b/book/src/validator_manager_move.md similarity index 100% rename from book/src/validator-manager-move.md rename to book/src/validator_manager_move.md diff --git a/book/src/validator-monitoring.md b/book/src/validator_monitoring.md similarity index 98% rename from book/src/validator-monitoring.md rename to book/src/validator_monitoring.md index bbc95460ec..d7f00521c4 100644 --- a/book/src/validator-monitoring.md +++ b/book/src/validator_monitoring.md @@ -5,7 +5,7 @@ Generally users will want to use this function to track their own validators, ho used for any validator, regardless of who controls it. _Note: If you are looking for remote metric monitoring, please see the docs on -[Prometheus Metrics](./advanced_metrics.md)_. +[Prometheus Metrics](./api_metrics.md)_. ## Monitoring is in the Beacon Node @@ -64,7 +64,7 @@ lighthouse bn --validator-monitor-pubkeys 0x933ad9491b62059dd065b560d256d8957a8c Enrolling a validator for additional monitoring results in: - Additional logs to be printed during BN operation. -- Additional [Prometheus metrics](./advanced_metrics.md) from the BN. +- Additional [Prometheus metrics](./api_metrics.md) from the BN. ### Logging diff --git a/book/src/slashing-protection.md b/book/src/validator_slashing_protection.md similarity index 97% rename from book/src/slashing-protection.md rename to book/src/validator_slashing_protection.md index 2d580f1c31..3e0fe184e5 100644 --- a/book/src/slashing-protection.md +++ b/book/src/validator_slashing_protection.md @@ -22,9 +22,9 @@ and carefully to keep your validators safe. See the [Troubleshooting](#troublesh The database will be automatically created, and your validators registered with it when: * Importing keys from another source (e.g. [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli/releases), Lodestar, Nimbus, Prysm, Teku, [ethdo](https://github.com/wealdtech/ethdo)). - See [import validator keys](./mainnet-validator.md#step-3-import-validator-keys-to-lighthouse). + See [import validator keys](./mainnet_validator.md#step-3-import-validator-keys-to-lighthouse). * Creating keys using Lighthouse itself (`lighthouse account validator create`) -* Creating keys via the [validator client API](./api-vc.md). +* Creating keys via the [validator client API](./api_vc.md). ## Avoiding Slashing @@ -79,7 +79,7 @@ lighthouse account validator slashing-protection import filename.json ``` When importing an interchange file, you still need to import the validator keystores themselves -separately, using the instructions for [import validator keys](./mainnet-validator.md#step-3-import-validator-keys-to-lighthouse). +separately, using the instructions for [import validator keys](./mainnet_validator.md#step-3-import-validator-keys-to-lighthouse). --- diff --git a/book/src/partial-withdrawal.md b/book/src/validator_sweep.md similarity index 75% rename from book/src/partial-withdrawal.md rename to book/src/validator_sweep.md index 26003e1f2f..b707988e84 100644 --- a/book/src/partial-withdrawal.md +++ b/book/src/validator_sweep.md @@ -1,15 +1,15 @@ -# Partial Withdrawals +# Validator "Sweeping" (Automatic Partial Withdrawals) After the [Capella](https://ethereum.org/en/history/#capella) upgrade on 12th April 2023: - if a validator has a withdrawal credential type `0x00`, the rewards will continue to accumulate and will be locked in the beacon chain. -- if a validator has a withdrawal credential type `0x01`, any rewards above 32ETH will be periodically withdrawn to the withdrawal address. This is also known as the "validator sweep", i.e., once the "validator sweep" reaches your validator's index, your rewards will be withdrawn to the withdrawal address. At the time of writing, with 560,000+ validators on the Ethereum mainnet, you shall expect to receive the rewards approximately every 5 days. +- if a validator has a withdrawal credential type `0x01`, any rewards above 32ETH will be periodically withdrawn to the withdrawal address. This is also known as the "validator sweep", i.e., once the "validator sweep" reaches your validator's index, your rewards will be withdrawn to the withdrawal address. The validator sweep is automatic and it does not incur any fees to withdraw. ## FAQ 1. How to know if I have the withdrawal credentials type `0x00` or `0x01`? - Refer [here](./voluntary-exit.md#1-how-to-know-if-i-have-the-withdrawal-credentials-type-0x01). + Refer [here](./validator_voluntary_exit.md#1-how-to-know-if-i-have-the-withdrawal-credentials-type-0x01). 2. My validator has withdrawal credentials type `0x00`, is there a deadline to update my withdrawal credentials? @@ -17,7 +17,7 @@ After the [Capella](https://ethereum.org/en/history/#capella) upgrade on 12 3. Do I have to do anything to get my rewards after I update the withdrawal credentials to type `0x01`? - No. The "validator sweep" occurs automatically and you can expect to receive the rewards every *n* days, [more information here](./voluntary-exit.md#4-when-will-i-get-my-staked-fund-after-voluntary-exit-if-my-validator-is-of-type-0x01). + No. The "validator sweep" occurs automatically and you can expect to receive the rewards every *n* days, [more information here](./validator_voluntary_exit.md#4-when-will-i-get-my-staked-fund-after-voluntary-exit-if-my-validator-is-of-type-0x01). Figure below summarizes partial withdrawals. diff --git a/book/src/voluntary-exit.md b/book/src/validator_voluntary_exit.md similarity index 100% rename from book/src/voluntary-exit.md rename to book/src/validator_voluntary_exit.md diff --git a/wordlist.txt b/wordlist.txt index bb8b46b525..7adbfe9032 100644 --- a/wordlist.txt +++ b/wordlist.txt @@ -12,6 +12,7 @@ BN BNs BTC BTEC +Btrfs Casper CentOS Chiado @@ -38,6 +39,7 @@ Exercism Extractable FFG Geth +GiB Gitcoin Gnosis Goerli @@ -91,6 +93,7 @@ TLS TODOs UDP UI +Uncached UPnP USD UX @@ -100,6 +103,7 @@ VCs VPN Withdrawable WSL +XFS YAML aarch anonymize @@ -196,6 +200,7 @@ redb reimport resync roadmap +routable rustfmt rustup schemas @@ -220,6 +225,7 @@ tweakers ui unadvanced unaggregated +uncached unencrypted unfinalized untrusted