* Add initial work on padding efficent merkle roots * Improve merklize_padded * Improve tree_hash crate -- fix bugs, docs * Update codebase for tree_hash API change * Remove dbg statements, fix import error * Fix clippy lints, doc error * Tidy tree hash comments * Increase tree_hash max tree height * Fix PR review comments * Fix typos * Fix cache access off-by-one in tree hash * Set max tree depth to 48 (from 64)
87 lines
2.1 KiB
Rust
87 lines
2.1 KiB
Rust
#[macro_use]
|
|
extern crate lazy_static;
|
|
|
|
pub mod impls;
|
|
mod merkleize_padded;
|
|
mod merkleize_standard;
|
|
|
|
pub use merkleize_padded::merkleize_padded;
|
|
pub use merkleize_standard::merkleize_standard;
|
|
|
|
/// Alias to `merkleize_padded(&bytes, 0)`
|
|
pub fn merkle_root(bytes: &[u8]) -> Vec<u8> {
|
|
merkleize_padded(&bytes, 0)
|
|
}
|
|
|
|
pub const BYTES_PER_CHUNK: usize = 32;
|
|
pub const HASHSIZE: usize = 32;
|
|
pub const MERKLE_HASH_CHUNK: usize = 2 * BYTES_PER_CHUNK;
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum TreeHashType {
|
|
Basic,
|
|
Vector,
|
|
List,
|
|
Container,
|
|
}
|
|
|
|
pub trait TreeHash {
|
|
fn tree_hash_type() -> TreeHashType;
|
|
|
|
fn tree_hash_packed_encoding(&self) -> Vec<u8>;
|
|
|
|
fn tree_hash_packing_factor() -> usize;
|
|
|
|
fn tree_hash_root(&self) -> Vec<u8>;
|
|
}
|
|
|
|
pub trait SignedRoot: TreeHash {
|
|
fn signed_root(&self) -> Vec<u8>;
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! tree_hash_ssz_encoding_as_vector {
|
|
($type: ident) => {
|
|
impl tree_hash::TreeHash for $type {
|
|
fn tree_hash_type() -> tree_hash::TreeHashType {
|
|
tree_hash::TreeHashType::Vector
|
|
}
|
|
|
|
fn tree_hash_packed_encoding(&self) -> Vec<u8> {
|
|
unreachable!("Vector should never be packed.")
|
|
}
|
|
|
|
fn tree_hash_packing_factor() -> usize {
|
|
unreachable!("Vector should never be packed.")
|
|
}
|
|
|
|
fn tree_hash_root(&self) -> Vec<u8> {
|
|
tree_hash::merkle_root(&ssz::ssz_encode(self))
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
#[macro_export]
|
|
macro_rules! tree_hash_ssz_encoding_as_list {
|
|
($type: ident) => {
|
|
impl tree_hash::TreeHash for $type {
|
|
fn tree_hash_type() -> tree_hash::TreeHashType {
|
|
tree_hash::TreeHashType::List
|
|
}
|
|
|
|
fn tree_hash_packed_encoding(&self) -> Vec<u8> {
|
|
unreachable!("List should never be packed.")
|
|
}
|
|
|
|
fn tree_hash_packing_factor() -> usize {
|
|
unreachable!("List should never be packed.")
|
|
}
|
|
|
|
fn tree_hash_root(&self) -> Vec<u8> {
|
|
ssz::ssz_encode(self).tree_hash_root()
|
|
}
|
|
}
|
|
};
|
|
}
|