use crate::{errors::MerkleError, CRH};
use snarkvm_utilities::{to_bytes_le, ToBytes};
use std::fmt::Debug;
pub trait MerkleParameters: Clone + Debug + Send + Sync {
type H: CRH;
const DEPTH: usize;
fn setup(message: &str) -> Self;
fn setup_message(&self) -> &str;
fn crh(&self) -> &Self::H;
fn hash_leaf<L: ToBytes>(&self, leaf: &L) -> Result<<Self::H as CRH>::Output, MerkleError> {
Ok(self.crh().hash(&leaf.to_bytes_le()?)?)
}
fn hash_inner_node(
&self,
left: &<Self::H as CRH>::Output,
right: &<Self::H as CRH>::Output,
) -> Result<<Self::H as CRH>::Output, MerkleError> {
Ok(self.crh().hash(&to_bytes_le![left, right]?)?)
}
fn hash_empty(&self) -> Result<<Self::H as CRH>::Output, MerkleError> {
let empty_buffer = &[0u8; 64];
Ok(self.crh().hash(&*empty_buffer)?)
}
}
pub trait MaskedMerkleParameters: MerkleParameters {
fn mask_crh(&self) -> &Self::H;
}