ckb_types/utilities/
merkle_tree.rs

1use ckb_hash::new_blake2b;
2use merkle_cbt::{merkle_tree::Merge, MerkleProof as ExMerkleProof, CBMT as ExCBMT};
3
4use crate::{packed::Byte32, prelude::*};
5
6/// TODO(doc): @quake
7pub 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
22/// TODO(doc): @quake
23pub type CBMT = ExCBMT<Byte32, MergeByte32>;
24/// TODO(doc): @quake
25pub type MerkleProof = ExMerkleProof<Byte32, MergeByte32>;
26
27/// TODO(doc): @quake
28pub fn merkle_root(leaves: &[Byte32]) -> Byte32 {
29    CBMT::build_merkle_root(leaves)
30}