diff --git a/beacon_node/store/src/partial_beacon_state.rs b/beacon_node/store/src/partial_beacon_state.rs index 160f94aef2..78bf6a7471 100644 --- a/beacon_node/store/src/partial_beacon_state.rs +++ b/beacon_node/store/src/partial_beacon_state.rs @@ -67,9 +67,9 @@ where // Participation (Altair and later) #[superstruct(only(Altair, Merge))] - pub previous_epoch_participation: VariableList, + pub previous_epoch_participation: VList, #[superstruct(only(Altair, Merge))] - pub current_epoch_participation: VariableList, + pub current_epoch_participation: VList, // Finality pub justification_bits: BitVector, diff --git a/consensus/state_processing/src/metrics.rs b/consensus/state_processing/src/metrics.rs index ddfaae5640..2b82ad93c3 100644 --- a/consensus/state_processing/src/metrics.rs +++ b/consensus/state_processing/src/metrics.rs @@ -23,4 +23,11 @@ lazy_static! { "beacon_participation_prev_epoch_active_gwei_total", "Total effective balance (gwei) of validators active in the previous epoch" ); + /* + * Processing metrics + */ + pub static ref PROCESS_EPOCH_TIME: Result = try_create_histogram( + "beacon_state_processing_process_epoch", + "Time required for process_epoch", + ); } diff --git a/consensus/state_processing/src/per_epoch_processing.rs b/consensus/state_processing/src/per_epoch_processing.rs index d813dc42fa..b263a52173 100644 --- a/consensus/state_processing/src/per_epoch_processing.rs +++ b/consensus/state_processing/src/per_epoch_processing.rs @@ -1,5 +1,6 @@ #![deny(clippy::wildcard_imports)] +use crate::metrics; pub use epoch_processing_summary::EpochProcessingSummary; use errors::EpochProcessingError as Error; pub use registry_updates::process_registry_updates; @@ -28,6 +29,8 @@ pub fn process_epoch( state: &mut BeaconState, spec: &ChainSpec, ) -> Result, Error> { + let _timer = metrics::start_timer(&metrics::PROCESS_EPOCH_TIME); + // Verify that the `BeaconState` instantiation matches the fork at `state.slot()`. state .fork_name(spec) diff --git a/consensus/state_processing/src/per_epoch_processing/altair/participation_flag_updates.rs b/consensus/state_processing/src/per_epoch_processing/altair/participation_flag_updates.rs index 7162fa7f4a..059bc0f84b 100644 --- a/consensus/state_processing/src/per_epoch_processing/altair/participation_flag_updates.rs +++ b/consensus/state_processing/src/per_epoch_processing/altair/participation_flag_updates.rs @@ -1,19 +1,16 @@ use crate::EpochProcessingError; -use core::result::Result; -use core::result::Result::Ok; use types::beacon_state::BeaconState; use types::eth_spec::EthSpec; use types::participation_flags::ParticipationFlags; -use types::VariableList; +use types::VList; pub fn process_participation_flag_updates( state: &mut BeaconState, ) -> Result<(), EpochProcessingError> { *state.previous_epoch_participation_mut()? = std::mem::take(state.current_epoch_participation_mut()?); - *state.current_epoch_participation_mut()? = VariableList::new(vec![ - ParticipationFlags::default( - ); + *state.current_epoch_participation_mut()? = VList::new(vec![ + ParticipationFlags::default(); state.validators().len() ])?; Ok(()) diff --git a/consensus/state_processing/src/per_epoch_processing/historical_roots_update.rs b/consensus/state_processing/src/per_epoch_processing/historical_roots_update.rs index 8466104aa5..9734e7b8c9 100644 --- a/consensus/state_processing/src/per_epoch_processing/historical_roots_update.rs +++ b/consensus/state_processing/src/per_epoch_processing/historical_roots_update.rs @@ -16,7 +16,7 @@ pub fn process_historical_roots_update( .safe_rem(T::SlotsPerHistoricalRoot::to_u64().safe_div(T::slots_per_epoch())?)? == 0 { - let historical_batch = state.historical_batch(); + let historical_batch = state.historical_batch()?; state .historical_roots_mut() .push(historical_batch.tree_hash_root())?; diff --git a/consensus/state_processing/src/upgrade/altair.rs b/consensus/state_processing/src/upgrade/altair.rs index 94c65e270a..0e20e09114 100644 --- a/consensus/state_processing/src/upgrade/altair.rs +++ b/consensus/state_processing/src/upgrade/altair.rs @@ -3,7 +3,7 @@ use std::mem; use std::sync::Arc; use types::{ BeaconState, BeaconStateAltair, BeaconStateError as Error, ChainSpec, EthSpec, Fork, - ParticipationFlags, PendingAttestation, RelativeEpoch, SyncCommittee, VList, VariableList, + ParticipationFlags, PendingAttestation, RelativeEpoch, SyncCommittee, VList, }; /// Translate the participation information from the epoch prior to the fork into Altair's format. @@ -50,7 +50,7 @@ pub fn upgrade_to_altair( let pre = pre_state.as_base_mut()?; let default_epoch_participation = - VariableList::new(vec![ParticipationFlags::default(); pre.validators.len()])?; + VList::new(vec![ParticipationFlags::default(); pre.validators.len()])?; let inactivity_scores = VList::new(vec![0; pre.validators.len()])?; let temp_sync_committee = Arc::new(SyncCommittee::temporary()?); diff --git a/consensus/types/src/beacon_state.rs b/consensus/types/src/beacon_state.rs index 69d0a5ca39..ef1cd0536d 100644 --- a/consensus/types/src/beacon_state.rs +++ b/consensus/types/src/beacon_state.rs @@ -269,9 +269,11 @@ where // Participation (Altair and later) #[superstruct(only(Altair, Merge))] - pub previous_epoch_participation: VariableList, + #[test_random(default)] + pub previous_epoch_participation: VList, #[superstruct(only(Altair, Merge))] - pub current_epoch_participation: VariableList, + #[test_random(default)] + pub current_epoch_participation: VList, // Finality #[test_random(default)] @@ -454,11 +456,15 @@ impl BeaconState { Hash256::from_slice(&self.tree_hash_root()[..]) } - pub fn historical_batch(&self) -> HistoricalBatch { - HistoricalBatch { + pub fn historical_batch(&mut self) -> Result, Error> { + // FIXME(sproul): work out how to clean this up (internal mutability?) + self.block_roots_mut().apply_updates()?; + self.state_roots_mut().apply_updates()?; + + Ok(HistoricalBatch { block_roots: self.block_roots().clone(), state_roots: self.state_roots().clone(), - } + }) } /// This method ensures the state's pubkey cache is fully up-to-date before checking if the validator @@ -1339,7 +1345,7 @@ impl BeaconState { pub fn get_epoch_participation_mut( &mut self, epoch: Epoch, - ) -> Result<&mut VariableList, Error> { + ) -> Result<&mut VList, Error> { if epoch == self.current_epoch() { match self { BeaconState::Base(_) => Err(BeaconStateError::IncorrectStateVariant), @@ -1576,22 +1582,7 @@ impl BeaconState { *self.pubkey_cache_mut() = PubkeyCache::default() } - /// Check if the `BeaconState` has any pending mutations. - pub fn has_pending_mutations(&self) -> bool { - // FIXME(sproul): check this more thoroughly - self.block_roots().has_pending_updates() - || self.state_roots().has_pending_updates() - || self.historical_roots().has_pending_updates() - || self.eth1_data_votes().has_pending_updates() - || self.validators().has_pending_updates() - || self.balances().has_pending_updates() - || self.randao_mixes().has_pending_updates() - || self.slashings().has_pending_updates() - || self - .inactivity_scores() - .map_or(false, VList::has_pending_updates) - } - + // FIXME(sproul): automate this somehow pub fn apply_pending_mutations(&mut self) -> Result<(), Error> { self.block_roots_mut().apply_updates()?; self.state_roots_mut().apply_updates()?; @@ -1605,6 +1596,12 @@ impl BeaconState { if let Ok(inactivity_scores) = self.inactivity_scores_mut() { inactivity_scores.apply_updates()?; } + if let Ok(previous_epoch_participation) = self.previous_epoch_participation_mut() { + previous_epoch_participation.apply_updates()?; + } + if let Ok(current_epoch_participation) = self.current_epoch_participation_mut() { + current_epoch_participation.apply_updates()?; + } Ok(()) }