in crypto/src/merkle/tests.rs [155:208]
fn prove_batch() {
let leaves = Digest256::bytes_as_digests(&LEAVES8).to_vec();
let tree = MerkleTree::<Blake3_256>::new(leaves.clone()).unwrap();
// 1 index
let proof = tree.prove_batch(&[1]).unwrap();
let expected_values = vec![leaves[1]];
let expected_nodes = vec![vec![
leaves[0],
hash_2x1(leaves[2], leaves[3]),
hash_2x1(
hash_2x1(leaves[4], leaves[5]),
hash_2x1(leaves[6], leaves[7]),
),
]];
assert_eq!(expected_values, proof.leaves);
assert_eq!(expected_nodes, proof.nodes);
assert_eq!(3, proof.depth);
// 2 indexes
let proof = tree.prove_batch(&[1, 2]).unwrap();
let expected_values = vec![leaves[1], leaves[2]];
let expected_nodes = vec![
vec![
leaves[0],
hash_2x1(
hash_2x1(leaves[4], leaves[5]),
hash_2x1(leaves[6], leaves[7]),
),
],
vec![leaves[3]],
];
assert_eq!(expected_values, proof.leaves);
assert_eq!(expected_nodes, proof.nodes);
assert_eq!(3, proof.depth);
// 2 indexes on opposite sides
let proof = tree.prove_batch(&[1, 6]).unwrap();
let expected_values = vec![leaves[1], leaves[6]];
let expected_nodes = vec![
vec![leaves[0], hash_2x1(leaves[2], leaves[3])],
vec![leaves[7], hash_2x1(leaves[4], leaves[5])],
];
assert_eq!(expected_values, proof.leaves);
assert_eq!(expected_nodes, proof.nodes);
assert_eq!(3, proof.depth);
// all indexes
let proof = tree.prove_batch(&[0, 1, 2, 3, 4, 5, 6, 7]).unwrap();
let expected_nodes: Vec<Vec<Digest256>> = vec![vec![], vec![], vec![], vec![]];
assert_eq!(leaves, proof.leaves);
assert_eq!(expected_nodes, proof.nodes);
assert_eq!(3, proof.depth);
}