Skip to content

Commit 4419a80

Browse files
authored
Merge pull request #6 from shunkakinoki/feat/ini-sort
feat: add `is_sort` tree fn
2 parents 4eda26d + aacb6c6 commit 4419a80

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/tree.rs

+42
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub struct MerkleProof {
1212
#[derive(Debug)]
1313
pub struct MerkleTree {
1414
leaves: Vec<B256>,
15+
is_sort: bool,
1516
is_tree_ready: bool,
1617
layers: Vec<Vec<B256>>,
1718
depth: u64,
@@ -28,13 +29,22 @@ impl MerkleTree {
2829
pub fn new() -> Self {
2930
MerkleTree {
3031
leaves: Vec::new(),
32+
is_sort: false,
3133
is_tree_ready: false,
3234
layers: Vec::new(),
3335
depth: 0,
3436
root: B256::default(),
3537
}
3638
}
3739

40+
pub fn set_sort(&mut self, sort: bool) {
41+
self.is_sort = sort;
42+
}
43+
44+
pub fn is_sorted(&self) -> bool {
45+
self.is_sort
46+
}
47+
3848
pub fn insert(&mut self, leaf: B256) {
3949
self.leaves.push(leaf);
4050
}
@@ -52,6 +62,12 @@ impl MerkleTree {
5262
return;
5363
}
5464

65+
// Sort leaves if not sorted
66+
if self.is_sort {
67+
self.leaves.sort();
68+
self.is_sort = true;
69+
}
70+
5571
self.depth = 1;
5672
self.layers.push(self.leaves.clone());
5773

@@ -139,4 +155,30 @@ mod test {
139155
assert!(MerkleTree::verify_proof(&proof));
140156
}
141157
}
158+
159+
#[test]
160+
fn test_tree_sorted() {
161+
let mut tree = MerkleTree::new();
162+
tree.set_sort(true);
163+
164+
// Should be 2 ^ N leaves
165+
let num_leaves = 16;
166+
for i in (0..num_leaves).rev() {
167+
tree.insert(B256::from(U256::from(i)));
168+
}
169+
tree.finish();
170+
171+
// Verify that the tree is sorted
172+
assert!(tree.is_sorted());
173+
174+
// Check if the leaves are actually sorted
175+
let sorted_leaves = tree.leaves.clone();
176+
assert!(sorted_leaves.windows(2).all(|w| w[0] <= w[1]));
177+
178+
for i in 0..num_leaves {
179+
let leaf = B256::from(U256::from(i));
180+
let proof = tree.create_proof(&leaf).unwrap();
181+
assert!(MerkleTree::verify_proof(&proof));
182+
}
183+
}
142184
}

0 commit comments

Comments
 (0)