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>;