use light_bounded_vec::BoundedVec;
use light_hasher::Hasher;
use crate::errors::ConcurrentMerkleTreeError;
pub fn compute_parent_node<H>(
node: &[u8; 32],
sibling: &[u8; 32],
node_index: usize,
level: usize,
) -> Result<[u8; 32], ConcurrentMerkleTreeError>
where
H: Hasher,
{
let is_left = (node_index >> level) & 1 == 0;
let hash = if is_left {
H::hashv(&[node, sibling])?
} else {
H::hashv(&[sibling, node])?
};
Ok(hash)
}
pub fn compute_root<H>(
leaf: &[u8; 32],
leaf_index: usize,
proof: &BoundedVec<[u8; 32]>,
) -> Result<[u8; 32], ConcurrentMerkleTreeError>
where
H: Hasher,
{
let mut node = *leaf;
for (level, sibling) in proof.iter().enumerate() {
node = compute_parent_node::<H>(&node, sibling, leaf_index, level)?;
}
Ok(node)
}