jf_merkle_tree/
examples.rs1use super::{append_only::MerkleTree, prelude::RescueHash, DigestAlgorithm};
11use crate::errors::MerkleTreeError;
12use ark_ff::Field;
13use ark_std::{format, vec};
14use jf_rescue::{crhf::RescueCRHF, RescueParameter};
15
16#[derive(PartialEq, Eq, Copy, Clone, Hash)]
18pub struct Interval<F: Field>(pub F, pub F);
19impl<F: RescueParameter> DigestAlgorithm<Interval<F>, u64, F> for RescueHash<F> {
22    fn digest(data: &[F]) -> Result<F, MerkleTreeError> {
23        let mut input = vec![F::zero()];
24        input.extend(data.iter());
25        Ok(RescueCRHF::<F>::sponge_no_padding(&input, 1)
26            .map_err(|err| MerkleTreeError::DigestError(format!("{}", err)))?[0])
27    }
28
29    fn digest_leaf(pos: &u64, elem: &Interval<F>) -> Result<F, MerkleTreeError> {
30        let data = [F::one(), F::from(*pos), elem.0, elem.1];
31        Ok(RescueCRHF::<F>::sponge_no_padding(&data, 1)
32            .map_err(|err| MerkleTreeError::DigestError(format!("{}", err)))?[0])
33    }
34}
35
36pub type IntervalMerkleTree<F> = MerkleTree<Interval<F>, RescueHash<F>, u64, 3, F>;