Skip to content

Peponks9/merkle-tree-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Merkle Tree Library in Rust

A Merkle tree library implemented in Rust with proof generation/verification, generic hash support, and comprehensive testing.

Features

  • Binary Merkle Tree: Efficient binary tree implementation for standard use cases
  • Sparse Merkle Tree: Memory-efficient implementation for sparse data sets
  • Multiple Hash Functions: Support for SHA-256, SHA-3, and BLAKE3
  • Proof Generation & Verification: Complete proof system with detailed verification
  • Serialization Support: Optional serde support for proof serialization
  • Performance Optimized: Benchmarked and optimized
  • Comprehensive Testing: Test suite with edges cases

Quick Start

Add this to your Cargo.toml:

[dependencies]
merkle-tree-rs = "0.1.0"

Basic Usage

use merkle_tree::{MerkleTree, Sha256Hasher};

// Create a tree from your data
let data = vec![b"hello", b"world", b"merkle", b"tree"];
let tree = MerkleTree::new(data, Sha256Hasher::new())?;

// Get the root hash
let root = tree.root();
println!("Root hash: {}", hex::encode(root));

// Generate a proof for the first element
let proof = tree.generate_proof(0)?;

// Verify the proof
assert!(tree.verify_proof_against_root(&proof, b"hello"));

Sparse Merkle Tree

use merkle_tree::{SparseMerkleTree, Sha256Hasher};

// Create a sparse tree with depth 20 (can hold 2^20 elements)
let mut tree = SparseMerkleTree::new(20, Sha256Hasher::new())?;

// Insert sparse data
tree.update(1000, b"account_1000")?;
tree.update(50000, b"account_50000")?;

// Generate proof for existence
let proof = tree.generate_proof(1000)?;
assert!(tree.verify_proof(&proof, 1000, b"account_1000"));

// Generate proof for non-existence
let empty_proof = tree.generate_proof(2000)?;
assert!(tree.verify_proof(&empty_proof, 2000, &[0u8; 32]));

Different Hash Functions

use merkle_tree::{MerkleTree, Sha256Hasher, Sha3Hasher, Blake3Hasher};

let data = vec![b"same", b"data"];

let sha256_tree = MerkleTree::new(data.clone(), Sha256Hasher::new())?;
let sha3_tree = MerkleTree::new(data.clone(), Sha3Hasher::new())?;
let blake3_tree = MerkleTree::new(data, Blake3Hasher::new())?;

// Each hasher produces different roots for the same data
assert_ne!(sha256_tree.root(), sha3_tree.root());
assert_ne!(sha256_tree.root(), blake3_tree.root());

Performance

Run benchmarks:

cargo bench

Testing

Run the full test suite:

# Unit tests
cargo test

# Integration tests
cargo test --test integration_tests

# All tests with coverage
cargo test --all-features

Examples

Check out the examples directory:

# Basic usage example
cargo run --example basic_usage

License

This project is licensed under the MIT License.

About

merkle tree implementation in rust

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages