Skip to main content

ab_merkle_tree/
blake3.rs

1//! BLAKE3 hasher and aliases of Merkle Trees that use it
2
3use crate::{MerkleHasher, balanced, mmr, sparse, unbalanced};
4use ab_blake3::{BLOCK_LEN, KEY_LEN, OUT_LEN};
5use array_reshape::{Flatten, FlattenEach};
6
7/// [`BalancedMerkleTree`](balanced::BalancedMerkleTree) with the default BLAKE3 hasher
8pub type BalancedMerkleTree<'a, const N: usize> =
9    balanced::BalancedMerkleTree<'a, N, Blake3MerkleHasher>;
10/// [`MerkleMountainRange`](mmr::MerkleMountainRange) with the default BLAKE3 hasher
11pub type MerkleMountainRange<const MAX_N: u64> =
12    mmr::MerkleMountainRange<MAX_N, Blake3MerkleHasher>;
13/// [`SparseMerkleTree`](sparse::SparseMerkleTree) with the default BLAKE3 hasher
14pub type SparseMerkleTree<const BITS: u8> = sparse::SparseMerkleTree<BITS, Blake3MerkleHasher>;
15/// [`UnbalancedMerkleTree`](unbalanced::UnbalancedMerkleTree) with the default BLAKE3 hasher
16pub type UnbalancedMerkleTree = unbalanced::UnbalancedMerkleTree<Blake3MerkleHasher>;
17
18/// Keyed BLAKE3 hasher of inner nodes with [`Self::KEY`], which hashes multiple pairs at once with
19/// SIMD
20#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
21pub struct Blake3MerkleHasher;
22
23const impl Default for Blake3MerkleHasher {
24    #[inline(always)]
25    fn default() -> Self {
26        Self
27    }
28}
29
30impl Blake3MerkleHasher {
31    /// Key of keyed BLAKE3 hash, BLAKE3 hash of a string `merkle-tree-inner-node`
32    pub const KEY: [u8; KEY_LEN] = ab_blake3::const_hash(b"merkle-tree-inner-node");
33}
34
35impl MerkleHasher for Blake3MerkleHasher {
36    const OUT_LEN: usize = OUT_LEN;
37
38    #[inline(always)]
39    #[cfg_attr(feature = "no-panic", no_panic::no_panic)]
40    fn hash_pair(&self, pair: &[[u8; OUT_LEN]; 2]) -> [u8; OUT_LEN] {
41        ab_blake3::single_block_keyed_hash(&Self::KEY, pair.flatten_ref::<BLOCK_LEN>())
42            .expect("Exactly one block worth of data; qed")
43    }
44
45    #[inline(always)]
46    #[cfg_attr(feature = "no-panic", no_panic::no_panic)]
47    fn hash_pairs<const NUM_PAIRS: usize>(
48        &self,
49        pairs: &[[[u8; OUT_LEN]; 2]; NUM_PAIRS],
50    ) -> [[u8; OUT_LEN]; NUM_PAIRS] {
51        let pairs = pairs
52            .as_slice()
53            .flatten_each_ref::<BLOCK_LEN>()
54            .as_array::<NUM_PAIRS>()
55            .expect("Same number of pairs as in the input; qed");
56        let mut hashes = [[0; OUT_LEN]; NUM_PAIRS];
57        ab_blake3::single_block_keyed_hash_many_exact(&Self::KEY, pairs, &mut hashes);
58        hashes
59    }
60}