lighthouse/eth2/state_processing/src/per_slot_processing.rs

61 lines
1.7 KiB
Rust
Raw Normal View History

2019-03-06 21:37:13 +00:00
use crate::*;
2019-04-16 04:14:38 +00:00
use tree_hash::TreeHash;
use types::*;
2019-03-06 21:37:13 +00:00
#[derive(Debug, PartialEq)]
pub enum Error {
BeaconStateError(BeaconStateError),
EpochProcessingError(EpochProcessingError),
}
/// Advances a state forward by one slot, performing per-epoch processing if required.
///
2019-04-15 00:51:20 +00:00
/// Spec v0.5.1
pub fn per_slot_processing(state: &mut BeaconState, spec: &ChainSpec) -> Result<(), Error> {
cache_state(state, spec)?;
2019-03-06 21:37:13 +00:00
if (state.slot + 1) % spec.slots_per_epoch == 0 {
per_epoch_processing(state, spec)?;
}
state.slot += 1;
Ok(())
}
fn cache_state(state: &mut BeaconState, spec: &ChainSpec) -> Result<(), Error> {
2019-04-16 04:14:38 +00:00
let previous_slot_state_root = Hash256::from_slice(&state.tree_hash_root()[..]);
// Note: increment the state slot here to allow use of our `state_root` and `block_root`
// getter/setter functions.
//
// This is a bit hacky, however it gets the job safely without lots of code.
let previous_slot = state.slot;
state.slot += 1;
// Store the previous slot's post-state transition root.
if state.latest_block_header.state_root == spec.zero_hash {
state.latest_block_header.state_root = previous_slot_state_root
}
let latest_block_root = Hash256::from_slice(&state.latest_block_header.tree_hash_root()[..]);
state.set_block_root(previous_slot, latest_block_root, spec)?;
// Set the state slot back to what it should be.
state.slot -= 1;
2019-03-06 21:37:13 +00:00
Ok(())
}
impl From<BeaconStateError> for Error {
fn from(e: BeaconStateError) -> Error {
Error::BeaconStateError(e)
}
}
impl From<EpochProcessingError> for Error {
fn from(e: EpochProcessingError) -> Error {
Error::EpochProcessingError(e)
}
}