mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-08 17:26:04 +00:00
Altair consensus changes and refactors (#2279)
## Proposed Changes Implement the consensus changes necessary for the upcoming Altair hard fork. ## Additional Info This is quite a heavy refactor, with pivotal types like the `BeaconState` and `BeaconBlock` changing from structs to enums. This ripples through the whole codebase with field accesses changing to methods, e.g. `state.slot` => `state.slot()`. Co-authored-by: realbigsean <seananderson33@gmail.com>
This commit is contained in:
@@ -2,7 +2,7 @@ use crate::tree_hash::vec_tree_hash_root;
|
||||
use crate::Error;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use std::marker::PhantomData;
|
||||
use std::ops::{Deref, Index, IndexMut};
|
||||
use std::ops::{Deref, DerefMut, Index, IndexMut};
|
||||
use std::slice::SliceIndex;
|
||||
use tree_hash::Hash256;
|
||||
use typenum::Unsigned;
|
||||
@@ -147,6 +147,16 @@ impl<T, N: Unsigned> Deref for FixedVector<T, N> {
|
||||
}
|
||||
}
|
||||
|
||||
// This implementation is required to use `get_mut` to access elements.
|
||||
//
|
||||
// It's safe because none of the methods on mutable slices allow changing the length
|
||||
// of the backing vec.
|
||||
impl<T, N: Unsigned> DerefMut for FixedVector<T, N> {
|
||||
fn deref_mut(&mut self) -> &mut [T] {
|
||||
&mut self.vec[..]
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, N: Unsigned> tree_hash::TreeHash for FixedVector<T, N>
|
||||
where
|
||||
T: tree_hash::TreeHash,
|
||||
@@ -210,7 +220,7 @@ where
|
||||
|
||||
impl<T, N: Unsigned> ssz::Decode for FixedVector<T, N>
|
||||
where
|
||||
T: ssz::Decode + Default,
|
||||
T: ssz::Decode,
|
||||
{
|
||||
fn is_ssz_fixed_len() -> bool {
|
||||
T::is_ssz_fixed_len()
|
||||
@@ -250,18 +260,21 @@ where
|
||||
.map(|chunk| T::from_ssz_bytes(chunk))
|
||||
.collect::<Result<Vec<T>, _>>()
|
||||
.and_then(|vec| {
|
||||
if vec.len() == fixed_len {
|
||||
Ok(vec.into())
|
||||
} else {
|
||||
Err(ssz::DecodeError::BytesInvalid(format!(
|
||||
"Wrong number of FixedVector elements, got: {}, expected: {}",
|
||||
vec.len(),
|
||||
N::to_usize()
|
||||
)))
|
||||
}
|
||||
Self::new(vec).map_err(|e| {
|
||||
ssz::DecodeError::BytesInvalid(format!(
|
||||
"Wrong number of FixedVector elements: {:?}",
|
||||
e
|
||||
))
|
||||
})
|
||||
})
|
||||
} else {
|
||||
ssz::decode_list_of_variable_length_items(bytes, Some(fixed_len)).map(|vec| vec.into())
|
||||
let vec = ssz::decode_list_of_variable_length_items(bytes, Some(fixed_len))?;
|
||||
Self::new(vec).map_err(|e| {
|
||||
ssz::DecodeError::BytesInvalid(format!(
|
||||
"Wrong number of FixedVector elements: {:?}",
|
||||
e
|
||||
))
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user