1use crate::{MerkleHasher, balanced, mmr, sparse, unbalanced};
4use ab_blake3::{BLOCK_LEN, KEY_LEN, OUT_LEN};
5use array_reshape::{Flatten, FlattenEach};
6
7pub type BalancedMerkleTree<'a, const N: usize> =
9 balanced::BalancedMerkleTree<'a, N, Blake3MerkleHasher>;
10pub type MerkleMountainRange<const MAX_N: u64> =
12 mmr::MerkleMountainRange<MAX_N, Blake3MerkleHasher>;
13pub type SparseMerkleTree<const BITS: u8> = sparse::SparseMerkleTree<BITS, Blake3MerkleHasher>;
15pub type UnbalancedMerkleTree = unbalanced::UnbalancedMerkleTree<Blake3MerkleHasher>;
17
18#[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 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}