use super::*;
use snarkvm_console_algorithms::{BHP512, BHP1024, Poseidon};
use snarkvm_console_types::prelude::Console;
type CurrentEnvironment = Console;
const ITERATIONS: u128 = 10;
fn check_merkle_tree<E: Environment, LH: LeafHash<Hash = PH::Hash>, PH: PathHash<Hash = Field<E>>, const DEPTH: u8>(
leaf_hasher: &LH,
path_hasher: &PH,
leaves: &[LH::Leaf],
additional_leaves: &[LH::Leaf],
rng: &mut TestRng,
) -> Result<()> {
let mut merkle_tree = MerkleTree::<E, LH, PH, DEPTH>::new(leaf_hasher, path_hasher, leaves)?;
assert_eq!(leaves.len(), merkle_tree.number_of_leaves);
if !leaves.is_empty() {
for (leaf_index, leaf) in leaves.iter().enumerate() {
let proof = merkle_tree.prove(leaf_index, leaf)?;
assert!(proof.verify(leaf_hasher, path_hasher, merkle_tree.root(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::zero(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::one(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::rand(rng), leaf));
}
}
if !additional_leaves.is_empty() {
merkle_tree.append(additional_leaves)?;
for (leaf_index, leaf) in additional_leaves.iter().enumerate() {
let proof = merkle_tree.prove(leaves.len() + leaf_index, leaf)?;
assert!(proof.verify(leaf_hasher, path_hasher, merkle_tree.root(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::zero(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::one(), leaf));
assert!(!proof.verify(leaf_hasher, path_hasher, &PH::Hash::rand(rng), leaf));
}
}
Ok(())
}
fn check_merkle_tree_depth_2<E: Environment, LH: LeafHash<Hash = PH::Hash>, PH: PathHash<Hash = Field<E>>>(
leaf_hasher: &LH,
path_hasher: &PH,
leaves: &[LH::Leaf],
) -> Result<()> {
assert_eq!(4, leaves.len(), "Depth-2 test requires 4 leaves");
let merkle_tree = MerkleTree::<E, LH, PH, 2>::new(leaf_hasher, path_hasher, leaves)?;
assert_eq!(7, merkle_tree.tree.len());
assert_eq!(4, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
assert_eq!(expected_leaf0, merkle_tree.tree[3]);
assert_eq!(expected_leaf1, merkle_tree.tree[4]);
assert_eq!(expected_leaf2, merkle_tree.tree[5]);
assert_eq!(expected_leaf3, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, merkle_tree.tree[0]);
assert_eq!(expected_root, *merkle_tree.root());
Ok(())
}
fn check_merkle_tree_depth_3_padded<E: Environment, LH: LeafHash<Hash = PH::Hash>, PH: PathHash<Hash = Field<E>>>(
leaf_hasher: &LH,
path_hasher: &PH,
leaves: &[LH::Leaf],
additional_leaves: &[LH::Leaf],
) -> Result<()> {
assert_eq!(4, leaves.len(), "Padded depth-3 test requires 4 leaves (out of 8)");
assert_eq!(1, additional_leaves.len(), "Padded depth-3 test requires 1 additional leaf");
let mut merkle_tree = MerkleTree::<E, LH, PH, 3>::new(leaf_hasher, path_hasher, leaves)?;
assert_eq!(7, merkle_tree.tree.len());
assert_eq!(4, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
assert_eq!(expected_leaf0, merkle_tree.tree[3]);
assert_eq!(expected_leaf1, merkle_tree.tree[4]);
assert_eq!(expected_leaf2, merkle_tree.tree[5]);
assert_eq!(expected_leaf3, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
let expected_right = path_hasher.hash_empty()?;
assert_eq!(expected_left, merkle_tree.tree[0]);
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, *merkle_tree.root());
merkle_tree.append(additional_leaves)?;
assert_eq!(13, merkle_tree.tree.len());
assert_eq!(5, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
let expected_leaf4 = LeafHash::hash_leaf(leaf_hasher, &additional_leaves[0])?;
assert_eq!(expected_leaf0, merkle_tree.tree[7]);
assert_eq!(expected_leaf1, merkle_tree.tree[8]);
assert_eq!(expected_leaf2, merkle_tree.tree[9]);
assert_eq!(expected_leaf3, merkle_tree.tree[10]);
assert_eq!(expected_leaf4, merkle_tree.tree[11]);
assert_eq!(path_hasher.hash_empty()?, merkle_tree.tree[12]);
let expected_left0 = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right0 = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
let expected_left1 = PathHash::hash_children(path_hasher, &expected_leaf4, &path_hasher.hash_empty()?)?;
let expected_right1 = PathHash::hash_children(path_hasher, &path_hasher.hash_empty()?, &path_hasher.hash_empty()?)?;
assert_eq!(expected_left0, merkle_tree.tree[3]);
assert_eq!(expected_right0, merkle_tree.tree[4]);
assert_eq!(expected_left1, merkle_tree.tree[5]);
assert_eq!(expected_right1, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left0, &expected_right0)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_left1, &expected_right1)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, merkle_tree.tree[0]);
assert_eq!(expected_root, *merkle_tree.root());
Ok(())
}
fn check_merkle_tree_depth_4_padded<E: Environment, LH: LeafHash<Hash = PH::Hash>, PH: PathHash<Hash = Field<E>>>(
leaf_hasher: &LH,
path_hasher: &PH,
leaves: &[LH::Leaf],
additional_leaves: &[LH::Leaf],
) -> Result<()> {
assert_eq!(4, leaves.len(), "Padded depth-4 test requires 4 leaves (out of 16)");
assert_eq!(2, additional_leaves.len(), "Padded depth-4 test requires 2 additional leaves");
let mut merkle_tree = MerkleTree::<E, LH, PH, 4>::new(leaf_hasher, path_hasher, leaves)?;
assert_eq!(7, merkle_tree.tree.len());
assert_eq!(4, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
assert_eq!(expected_leaf0, merkle_tree.tree[3]);
assert_eq!(expected_leaf1, merkle_tree.tree[4]);
assert_eq!(expected_leaf2, merkle_tree.tree[5]);
assert_eq!(expected_leaf3, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
let expected_right = path_hasher.hash_empty()?;
assert_eq!(expected_left, merkle_tree.tree[0]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
let expected_right = path_hasher.hash_empty()?;
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, *merkle_tree.root());
merkle_tree.append(&[additional_leaves[0].clone()])?;
assert_eq!(13, merkle_tree.tree.len());
assert_eq!(5, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
let expected_leaf4 = LeafHash::hash_leaf(leaf_hasher, &additional_leaves[0])?;
assert_eq!(expected_leaf0, merkle_tree.tree[7]);
assert_eq!(expected_leaf1, merkle_tree.tree[8]);
assert_eq!(expected_leaf2, merkle_tree.tree[9]);
assert_eq!(expected_leaf3, merkle_tree.tree[10]);
assert_eq!(expected_leaf4, merkle_tree.tree[11]);
assert_eq!(path_hasher.hash_empty()?, merkle_tree.tree[12]);
let expected_left0 = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right0 = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
let expected_left1 = PathHash::hash_children(path_hasher, &expected_leaf4, &path_hasher.hash_empty()?)?;
let expected_right1 = PathHash::hash_children(path_hasher, &path_hasher.hash_empty()?, &path_hasher.hash_empty()?)?;
assert_eq!(expected_left0, merkle_tree.tree[3]);
assert_eq!(expected_right0, merkle_tree.tree[4]);
assert_eq!(expected_left1, merkle_tree.tree[5]);
assert_eq!(expected_right1, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left0, &expected_right0)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_left1, &expected_right1)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
let expected_right = path_hasher.hash_empty()?;
assert_eq!(expected_left, merkle_tree.tree[0]);
assert_eq!(expected_right, path_hasher.hash_empty()?);
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, *merkle_tree.root());
assert_eq!(13, merkle_tree.tree.len());
assert_eq!(5, merkle_tree.number_of_leaves);
merkle_tree.append(&[additional_leaves[1].clone()])?;
assert_eq!(13, merkle_tree.tree.len());
assert_eq!(6, merkle_tree.number_of_leaves);
let expected_leaf0 = LeafHash::hash_leaf(leaf_hasher, &leaves[0])?;
let expected_leaf1 = LeafHash::hash_leaf(leaf_hasher, &leaves[1])?;
let expected_leaf2 = LeafHash::hash_leaf(leaf_hasher, &leaves[2])?;
let expected_leaf3 = LeafHash::hash_leaf(leaf_hasher, &leaves[3])?;
let expected_leaf4 = LeafHash::hash_leaf(leaf_hasher, &additional_leaves[0])?;
let expected_leaf5 = LeafHash::hash_leaf(leaf_hasher, &additional_leaves[1])?;
assert_eq!(expected_leaf0, merkle_tree.tree[7]);
assert_eq!(expected_leaf1, merkle_tree.tree[8]);
assert_eq!(expected_leaf2, merkle_tree.tree[9]);
assert_eq!(expected_leaf3, merkle_tree.tree[10]);
assert_eq!(expected_leaf4, merkle_tree.tree[11]);
assert_eq!(expected_leaf5, merkle_tree.tree[12]);
let expected_left0 = PathHash::hash_children(path_hasher, &expected_leaf0, &expected_leaf1)?;
let expected_right0 = PathHash::hash_children(path_hasher, &expected_leaf2, &expected_leaf3)?;
let expected_left1 = PathHash::hash_children(path_hasher, &expected_leaf4, &expected_leaf5)?;
let expected_right1 = PathHash::hash_children(path_hasher, &path_hasher.hash_empty()?, &path_hasher.hash_empty()?)?;
assert_eq!(expected_left0, merkle_tree.tree[3]);
assert_eq!(expected_right0, merkle_tree.tree[4]);
assert_eq!(expected_left1, merkle_tree.tree[5]);
assert_eq!(expected_right1, merkle_tree.tree[6]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left0, &expected_right0)?;
let expected_right = PathHash::hash_children(path_hasher, &expected_left1, &expected_right1)?;
assert_eq!(expected_left, merkle_tree.tree[1]);
assert_eq!(expected_right, merkle_tree.tree[2]);
let expected_left = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
let expected_right = path_hasher.hash_empty()?;
assert_eq!(expected_left, merkle_tree.tree[0]);
assert_eq!(expected_right, path_hasher.hash_empty()?);
let expected_root = PathHash::hash_children(path_hasher, &expected_left, &expected_right)?;
assert_eq!(expected_root, *merkle_tree.root());
Ok(())
}
#[test]
fn test_merkle_tree_bhp() -> Result<()> {
fn run_test<const DEPTH: u8>(rng: &mut TestRng) -> Result<()> {
type LH = BHP1024<CurrentEnvironment>;
type PH = BHP512<CurrentEnvironment>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
for i in 0..ITERATIONS {
for j in 0..ITERATIONS {
let num_leaves = core::cmp::min(2u128.pow(DEPTH as u32), i);
let num_additional_leaves = core::cmp::min(2u128.pow(DEPTH as u32) - num_leaves, j);
check_merkle_tree::<CurrentEnvironment, LH, PH, DEPTH>(
&leaf_hasher,
&path_hasher,
&(0..num_leaves)
.map(|_| Field::<CurrentEnvironment>::rand(rng).to_bits_le())
.collect::<Vec<Vec<bool>>>(),
&(0..num_additional_leaves)
.map(|_| Field::<CurrentEnvironment>::rand(rng).to_bits_le())
.collect::<Vec<Vec<bool>>>(),
rng,
)?;
}
}
Ok(())
}
let mut rng = TestRng::default();
assert!(run_test::<0>(&mut rng).is_err());
assert!(run_test::<1>(&mut rng).is_ok());
assert!(run_test::<2>(&mut rng).is_ok());
assert!(run_test::<3>(&mut rng).is_ok());
assert!(run_test::<4>(&mut rng).is_ok());
assert!(run_test::<5>(&mut rng).is_ok());
assert!(run_test::<6>(&mut rng).is_ok());
assert!(run_test::<7>(&mut rng).is_ok());
assert!(run_test::<8>(&mut rng).is_ok());
assert!(run_test::<9>(&mut rng).is_ok());
assert!(run_test::<10>(&mut rng).is_ok());
assert!(run_test::<15>(&mut rng).is_ok());
assert!(run_test::<16>(&mut rng).is_ok());
assert!(run_test::<17>(&mut rng).is_ok());
assert!(run_test::<31>(&mut rng).is_ok());
assert!(run_test::<32>(&mut rng).is_ok());
assert!(run_test::<64>(&mut rng).is_ok());
Ok(())
}
#[test]
fn test_merkle_tree_poseidon() -> Result<()> {
fn run_test<const DEPTH: u8>(rng: &mut TestRng) -> Result<()> {
type LH = Poseidon<CurrentEnvironment, 4>;
type PH = Poseidon<CurrentEnvironment, 2>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
for i in 0..ITERATIONS {
for j in 0..ITERATIONS {
let num_leaves = core::cmp::min(2u128.pow(DEPTH as u32), i);
let num_additional_leaves = core::cmp::min(2u128.pow(DEPTH as u32) - num_leaves, j);
check_merkle_tree::<CurrentEnvironment, LH, PH, DEPTH>(
&leaf_hasher,
&path_hasher,
&(0..num_leaves).map(|_| vec![Uniform::rand(rng)]).collect::<Vec<_>>(),
&(0..num_additional_leaves).map(|_| vec![Uniform::rand(rng)]).collect::<Vec<_>>(),
rng,
)?;
}
}
Ok(())
}
let mut rng = TestRng::default();
assert!(run_test::<0>(&mut rng).is_err());
assert!(run_test::<1>(&mut rng).is_ok());
assert!(run_test::<2>(&mut rng).is_ok());
assert!(run_test::<3>(&mut rng).is_ok());
assert!(run_test::<4>(&mut rng).is_ok());
assert!(run_test::<5>(&mut rng).is_ok());
assert!(run_test::<6>(&mut rng).is_ok());
assert!(run_test::<7>(&mut rng).is_ok());
assert!(run_test::<8>(&mut rng).is_ok());
assert!(run_test::<9>(&mut rng).is_ok());
assert!(run_test::<10>(&mut rng).is_ok());
assert!(run_test::<15>(&mut rng).is_ok());
assert!(run_test::<16>(&mut rng).is_ok());
assert!(run_test::<17>(&mut rng).is_ok());
assert!(run_test::<31>(&mut rng).is_ok());
assert!(run_test::<32>(&mut rng).is_ok());
assert!(run_test::<64>(&mut rng).is_ok());
Ok(())
}
#[test]
fn test_merkle_tree_depth_2_bhp() -> Result<()> {
type LH = BHP1024<CurrentEnvironment>;
type PH = BHP512<CurrentEnvironment>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_2::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| Field::<CurrentEnvironment>::rand(&mut rng).to_bits_le()).collect::<Vec<Vec<bool>>>(),
)
}
#[test]
fn test_merkle_tree_depth_2_poseidon() -> Result<()> {
type LH = Poseidon<CurrentEnvironment, 4>;
type PH = Poseidon<CurrentEnvironment, 2>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_2::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| vec![Uniform::rand(&mut rng)]).collect::<Vec<_>>(),
)
}
#[test]
fn test_merkle_tree_depth_3_bhp() -> Result<()> {
type LH = BHP1024<CurrentEnvironment>;
type PH = BHP512<CurrentEnvironment>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_3_padded::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| Field::<CurrentEnvironment>::rand(&mut rng).to_bits_le()).collect::<Vec<Vec<bool>>>(),
&(0..1).map(|_| Field::<CurrentEnvironment>::rand(&mut rng).to_bits_le()).collect::<Vec<Vec<bool>>>(),
)
}
#[test]
fn test_merkle_tree_depth_3_poseidon() -> Result<()> {
type LH = Poseidon<CurrentEnvironment, 4>;
type PH = Poseidon<CurrentEnvironment, 2>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_3_padded::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| vec![Uniform::rand(&mut rng)]).collect::<Vec<_>>(),
&(0..1).map(|_| vec![Uniform::rand(&mut rng)]).collect::<Vec<_>>(),
)
}
#[test]
fn test_merkle_tree_depth_4_bhp() -> Result<()> {
type LH = BHP1024<CurrentEnvironment>;
type PH = BHP512<CurrentEnvironment>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_4_padded::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| Field::<CurrentEnvironment>::rand(&mut rng).to_bits_le()).collect::<Vec<Vec<bool>>>(),
&(0..2).map(|_| Field::<CurrentEnvironment>::rand(&mut rng).to_bits_le()).collect::<Vec<Vec<bool>>>(),
)
}
#[test]
fn test_merkle_tree_depth_4_poseidon() -> Result<()> {
type LH = Poseidon<CurrentEnvironment, 4>;
type PH = Poseidon<CurrentEnvironment, 2>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
check_merkle_tree_depth_4_padded::<CurrentEnvironment, LH, PH>(
&leaf_hasher,
&path_hasher,
&(0..4).map(|_| vec![Uniform::rand(&mut rng)]).collect::<Vec<_>>(),
&(0..2).map(|_| vec![Uniform::rand(&mut rng)]).collect::<Vec<_>>(),
)
}
#[ignore]
#[test]
fn test_profiler() -> Result<()> {
const DEPTH: u8 = 32;
const NUM_LEAVES: &[usize] = &[1000, 10000];
macro_rules! generate_leaves {
($num_leaves:expr, $rng:expr) => {{ (0..$num_leaves).map(|_| Field::<CurrentEnvironment>::rand($rng).to_bits_le()).collect::<Vec<_>>() }};
}
type LH = BHP1024<CurrentEnvironment>;
type PH = BHP512<CurrentEnvironment>;
let leaf_hasher = LH::setup("AleoMerkleTreeTest0")?;
let path_hasher = PH::setup("AleoMerkleTreeTest1")?;
let mut rng = TestRng::default();
for num_leaves in NUM_LEAVES {
let leaves = generate_leaves!(*num_leaves, &mut rng);
let mut merkle_tree =
MerkleTree::<CurrentEnvironment, LH, PH, DEPTH>::new(&leaf_hasher, &path_hasher, &leaves)?;
let new_leaf = generate_leaves!(1, &mut rng);
merkle_tree.append(&new_leaf)?;
}
bail!("\n\nRemember to #[ignore] this test!\n\n")
}