mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-17 20:02:43 +00:00
* Pre-allocated tree hash caches * Add SmallVec to tree hash cache * Avoid allocation for validator.pubkey * Avoid iterator which seems to be doing heap alloc * Add more smallvecs * MOAR SMALLVEC * Move non-test code to Hash256 tree hash * Fix byte ordering error * Add incomplete but working merkle stream impl * Fix zero hash error * Add zero hash fn * Add MerkleStream comments * Add smallvec, tidy * Integrate into tree hash derive * Update ssz_types tree hash * Don't heap alloc for mix in length * Add byte-level streaming to MerkleStream * Avoid recursion in write method * Update BLS to MerkleStream * Fix some not-compiling tests * Remove debug profiling * Remove code duplication * Move beacon state tree hash to new hasher * Fix failing tests * Update comments * Add some fast-paths to tree_hash::merkle_root * Remove unncessary test * Rename MerkleStream -> MerkleHasher * Rename new_with_leaf_count -> with_leaves * Tidy * Remove NonZeroUsize * Remove todo * Update smallvec
73 lines
2.1 KiB
Rust
73 lines
2.1 KiB
Rust
use crate::cases::LoadCase;
|
|
use crate::decode::yaml_decode_file;
|
|
use crate::error::Error;
|
|
use serde_derive::Deserialize;
|
|
use ssz::{Decode, Encode};
|
|
use ssz_derive::{Decode, Encode};
|
|
use std::convert::TryFrom;
|
|
use std::fmt::Debug;
|
|
use std::path::Path;
|
|
use tree_hash::TreeHash;
|
|
|
|
/// Trait for all BLS cases to eliminate some boilerplate.
|
|
pub trait BlsCase: serde::de::DeserializeOwned {}
|
|
|
|
impl<T: BlsCase> LoadCase for T {
|
|
fn load_from_dir(path: &Path) -> Result<Self, Error> {
|
|
yaml_decode_file(&path.join("data.yaml"))
|
|
}
|
|
}
|
|
|
|
/// Macro to wrap U128 and U256 so they deserialize correctly.
|
|
macro_rules! uint_wrapper {
|
|
($wrapper_name:ident, $wrapped_type:ty) => {
|
|
#[derive(Debug, Clone, Copy, Default, PartialEq, Decode, Encode, Deserialize)]
|
|
#[serde(try_from = "String")]
|
|
pub struct $wrapper_name {
|
|
pub x: $wrapped_type,
|
|
}
|
|
|
|
impl TryFrom<String> for $wrapper_name {
|
|
type Error = String;
|
|
|
|
fn try_from(s: String) -> Result<Self, Self::Error> {
|
|
<$wrapped_type>::from_dec_str(&s)
|
|
.map(|x| Self { x })
|
|
.map_err(|e| format!("{:?}", e))
|
|
}
|
|
}
|
|
|
|
impl tree_hash::TreeHash for $wrapper_name {
|
|
fn tree_hash_type() -> tree_hash::TreeHashType {
|
|
<$wrapped_type>::tree_hash_type()
|
|
}
|
|
|
|
fn tree_hash_packed_encoding(&self) -> Vec<u8> {
|
|
self.x.tree_hash_packed_encoding()
|
|
}
|
|
|
|
fn tree_hash_packing_factor() -> usize {
|
|
<$wrapped_type>::tree_hash_packing_factor()
|
|
}
|
|
|
|
fn tree_hash_root(&self) -> tree_hash::Hash256 {
|
|
self.x.tree_hash_root()
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
uint_wrapper!(TestU128, ethereum_types::U128);
|
|
uint_wrapper!(TestU256, ethereum_types::U256);
|
|
|
|
/// Trait alias for all deez bounds
|
|
pub trait SszStaticType:
|
|
serde::de::DeserializeOwned + Decode + Encode + TreeHash + Clone + PartialEq + Debug + Sync
|
|
{
|
|
}
|
|
|
|
impl<T> SszStaticType for T where
|
|
T: serde::de::DeserializeOwned + Decode + Encode + TreeHash + Clone + PartialEq + Debug + Sync
|
|
{
|
|
}
|