1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
// Copyright 2020 ChainSafe Systems
// SPDX-License-Identifier: Apache-2.0
use crate::*;
/// Trait for implementing binary merkle tree
pub trait MerkleTree {
/// Type of the leaf data
type Item;
/// Type of the hash values
type Hash;
/// Height of the tree, leaf nodes that store data are counted
fn height(&self) -> u32;
/// Number of leafs
fn count(&self) -> usize;
/// Root hash, lazy-evaluated
fn root(&mut self) -> Option<Self::Hash>;
/// Adds a new leaf
fn add(&mut self, item: Self::Item) {
self.add_batch(vec![item])
}
/// Adds a batch of leaves in the give order
fn add_batch(&mut self, items: impl IntoIterator<Item = Self::Item>);
}
/// Trait for implementing sparse binary merkle tree.
/// It is essentially a collection of [MerkleProof]
pub trait SparseMerkleTree {
/// Type of the merkle proof
type MerkleProof: MerkleProof;
/// Adds a single [MerkleProof]
fn add(&mut self, proof: Self::MerkleProof) {
self.add_batch(vec![proof])
}
/// Adds a collection of [MerkleProof]
fn add_batch(&mut self, proofs: impl IntoIterator<Item = Self::MerkleProof>);
}