fn prove_batch()

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