Exclusion Complete Binary Merkle Tree

A merkle tree based on Nervos Complete Binary Merkle Tree to support verifiing a leaf is not on a certain tree.

Example Usage

```rust use blake2b_rs::{Blake2b, Blake2bBuilder};

pub struct Blake2bHasher(Blake2b);

const PERSONALIZATION: &[u8] = b"exclusioncbmtree"; impl Default for Blake2bHasher { fn default() -> Self { let blake2b = Blake2bBuilder::new(32).personal(PERSONALIZATION).build(); Blake2bHasher(blake2b) } }

impl Hasher for Blake2bHasher { fn update(&mut self, data: &[u8]) { self.0.update(data); } fn finish(self) -> H256 { let mut hash = [0u8; 32]; self.0.finalize(&mut hash); hash } }

struct MergeBlake2bH256 {}

impl Merge for MergeBlake2bH256 { type Item = H256; fn merge(left: &Self::Item, right: &Self::Item) -> Self::Item { let mut hasher = Blake2bHasher::default(); hasher.update(left); hasher.update(right); hasher.finish() } }

type StrKey = &'static str; type StrLeaf = SimpleLeaf; type StrRangeLeaf = SimpleRangeLeaf; type StrExCBMT = SimpleExclusionCBMT;

let allleaves: Vec = vec!["b", "e", "g", "x"] .intoiter() .map(StrLeaf::newwithkey) .collect(); let allrangeleaves = StrExCBMT::buildrangeleaves(allleaves.clone()); // ["e", "x"] => [("e", "g"), ("x", "b")] let indices: Vec = vec![1, 3]; let rangeleaves: Vec = indices .iter() .map(|index| allrangeleaves[*index as usize].clone()) .collect(); let root = StrExCBMT::buildmerkleroot(&allleaves); let proof: ExclusionMerkleProof = StrExCBMT::buildmerkleproof(&allleaves, &indices).unwrap();

let excludedkeys: Vec = vec!["f", "y", "z", "a"]; asserteq!( proof.verifyexclusion(&root, &rangeleaves, &excluded_keys), Ok(true) ); ```