mirror of
https://gitlab.com/pulsechaincom/lighthouse-pulse.git
synced 2025-01-10 04:51:22 +00:00
7f6ae4c2f5
* 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
48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
mod cache;
|
|
mod cache_arena;
|
|
mod impls;
|
|
#[cfg(test)]
|
|
mod test;
|
|
use smallvec::SmallVec;
|
|
|
|
type SmallVec8<T> = SmallVec<[T; 8]>;
|
|
pub type CacheArena = cache_arena::CacheArena<Hash256>;
|
|
|
|
pub use crate::cache::TreeHashCache;
|
|
pub use crate::impls::int_log;
|
|
use ethereum_types::H256 as Hash256;
|
|
use tree_hash::TreeHash;
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum Error {
|
|
/// Attempting to provide more than 2^depth leaves to a Merkle tree is disallowed.
|
|
TooManyLeaves,
|
|
/// Shrinking a Merkle tree cache by providing it with less leaves than it currently has is
|
|
/// disallowed (for simplicity).
|
|
CannotShrink,
|
|
/// Cache is inconsistent with the list of dirty indices provided.
|
|
CacheInconsistent,
|
|
CacheArenaError(cache_arena::Error),
|
|
/// Unable to find left index in Merkle tree.
|
|
MissingLeftIdx(usize),
|
|
}
|
|
|
|
impl From<cache_arena::Error> for Error {
|
|
fn from(e: cache_arena::Error) -> Error {
|
|
Error::CacheArenaError(e)
|
|
}
|
|
}
|
|
|
|
/// Trait for types which can make use of a cache to accelerate calculation of their tree hash root.
|
|
pub trait CachedTreeHash<Cache>: TreeHash {
|
|
/// Create a new cache appropriate for use with values of this type.
|
|
fn new_tree_hash_cache(&self, arena: &mut CacheArena) -> Cache;
|
|
|
|
/// Update the cache and use it to compute the tree hash root for `self`.
|
|
fn recalculate_tree_hash_root(
|
|
&self,
|
|
arena: &mut CacheArena,
|
|
cache: &mut Cache,
|
|
) -> Result<Hash256, Error>;
|
|
}
|