cmtree
Deterministic, no-std friendly Cartesian Merkle Tree for Rust. cmtree blends binary-search
ordering, heap-based balancing, and Merkle authentication so every node carries useful state
and proofs remain compact.
Features
- π Deterministic treap β keys derive their priority from a configurable digest, so the resulting shape is independent of insertion order.
- π Merkle authentication β generate membership and non-membership proofs for any key in
O(log n)time, with hash ordering that matches the research paper. - π§΅ No-std first β uses
alloconly; works in embedded and wasm contexts. - π§© Pluggable hashers β swap
Sha256for anyDigest + Clonesuch asblake3orsha3. - π§ͺ Tested β extensive unit, doc, and large-structure tests plus a CI pipeline covering
cargo fmt,clippy,doc, andtest.
Quick start
[]
= "0.1"
use CMTree;
Working with proofs
use CMTree;
let mut tree = new;
for key in
let root = tree.root_hash;
let proof = tree.generate_proof.unwrap;
assert!;
assert!;
let missing = b"not-here".to_vec;
let proof = tree.generate_proof.unwrap;
assert!;
assert!;
Proofs follow the definition in Cartesian Merkle Tree (Chystiakov et al., 2025), storing an ordered prefix of parent key digests and sibling hashes alongside the queried nodeβs children.
Determinism & complexity
insert,remove,contains,generate_proof: expectedO(log n)fornstored keys (treap balancing).root_hash:O(1)thanks to cached node hashes.Prooflength:O(log n).- Space:
O(n); one node (with cached key digest) per key.
Determinism stems from hashing the key to produce the heap priority. Using a strong digest ensures priorities act like random values, maintaining balance with high probability.
Customization
- Alternative digests β instantiate
CMTree::<Vec<u8>, sha3::Sha3_256>::new(),CMTree::<Vec<u8>, Sha512>::new(), or any otherDigest + Clonehasher. - Smaller priorities β use
CMTree::<Vec<u8>, Sha256, u64>::new()(or anyPriorityimplementer) when memory pressure outweighs collision resistance. - Generic keys β keys only need
Clone + Ord + Hash; the tree hashes them into priorities and Merkle payloads. - No-std environments β enable
alloc, disable default features of your digest crate if necessary.
Project status
The library is production-ready, enforced by:
- exhaustive unit suite (including large-tree stress tests),
- doc tests that mirror README examples,
cargo fmt,clippy -- -D warnings,doc, andtestchecks in CI.
Planned enhancements:
- optional serde support for proofs,
- benchmarking utilities to compare digests,
- safe concurrency primitives for read-mostly workloads.
Feedback and contributions are welcome! Open an issue or pull request to discuss ideas or report edge cases.