ckb_types/utilities/
merkle_tree.rs1use ckb_hash::new_blake2b;
2use merkle_cbt::{merkle_tree::Merge, MerkleProof as ExMerkleProof, CBMT as ExCBMT};
3
4use crate::{packed::Byte32, prelude::*};
5
6pub struct MergeByte32;
8
9impl Merge for MergeByte32 {
10 type Item = Byte32;
11 fn merge(left: &Self::Item, right: &Self::Item) -> Self::Item {
12 let mut ret = [0u8; 32];
13 let mut blake2b = new_blake2b();
14
15 blake2b.update(left.as_slice());
16 blake2b.update(right.as_slice());
17 blake2b.finalize(&mut ret);
18 ret.pack()
19 }
20}
21
22pub type CBMT = ExCBMT<Byte32, MergeByte32>;
24pub type MerkleProof = ExMerkleProof<Byte32, MergeByte32>;
26
27pub fn merkle_root(leaves: &[Byte32]) -> Byte32 {
29 CBMT::build_merkle_root(leaves)
30}