Skip to content

Commit ed767a3

Browse files
committed
Add Keccak-based Merkle Tree implementation and tests
- Implemented Keccak-based hashing functions and Merkle Tree construction. - Added examples of creating and verifying Merkle Trees using both SHA-256 and Keccak hashing. - Created a new module `merkle.rs` for an alternative Merkle Tree implementation using the `ring` crate. - Added test cases to verify the functionality of both Merkle Tree implementations.
1 parent ef70d37 commit ed767a3

File tree

3 files changed

+284
-3
lines changed

3 files changed

+284
-3
lines changed

Cargo.lock

+219-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
[package]
2-
name = "merkle-treee-rs"
2+
name = "merkle-tree-rs"
33
version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
sha2 = "0.9"
7+
sha2 = "0.9"
8+
tiny-keccak = { version = "2.0", features = ["keccak"] }
9+
hex = "0.4"
10+
ring = "0.16.20"

src/merkle.rs

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use ring::digest::{Context, SHA256};
2+
3+
#[derive(Debug)]
4+
enum Node {
5+
Leaf(Vec<u8>), // Data
6+
Internal(Box<Node>, Box<Node>), // Left, Right children
7+
}
8+
9+
fn calculate_hash(data: &[u8]) -> Vec<u8> {
10+
let mut context = Context::new(&SHA256);
11+
context.update(data);
12+
let digest = context.finish();
13+
digest.as_ref().to_vec()
14+
}
15+
16+
impl Node {
17+
fn new_leaf(data: Vec<u8>) -> Self {
18+
Node::Leaf(data)
19+
}
20+
21+
fn new_internal(left: Node, right: Node) -> Self {
22+
Node::Internal(Box::new(left), Box::new(right))
23+
}
24+
25+
fn compute_hash(&self) -> Vec<u8> {
26+
match self {
27+
Node::Leaf(data) => calculate_hash(data),
28+
Node::Internal(left, right) => {
29+
let left_hash = left.compute_hash();
30+
let right_hash = right.compute_hash();
31+
let combined = [&left_hash[..], &right_hash[..]].concat();
32+
calculate_hash(&combined)
33+
}
34+
}
35+
}
36+
}
37+
38+
fn main() {
39+
let data1 = b"Data Block 1".to_vec();
40+
let data2 = b"Data Block 2".to_vec();
41+
let data3 = b"Data Block 3".to_vec();
42+
43+
let leaf1 = Node::new_leaf(data1);
44+
let leaf2 = Node::new_leaf(data2);
45+
let leaf3 = Node::new_leaf(data3);
46+
47+
let internal1 = Node::new_internal(leaf1, leaf2);
48+
let root = Node::new_internal(internal1, leaf3); // Unbalanced tree
49+
50+
let merkle_root = root.compute_hash();
51+
println!("Merkle Root: {:?}", merkle_root);
52+
53+
54+
// Example of adding a new leaf (making it more unbalanced):
55+
let data4 = b"Data Block 4".to_vec();
56+
let leaf4 = Node::new_leaf(data4);
57+
let new_root = Node::new_internal(root, leaf4);
58+
let new_merkle_root = new_root.compute_hash();
59+
println!("New Merkle Root (after adding data): {:?}", new_merkle_root);
60+
}

0 commit comments

Comments
 (0)