@@ -12,6 +12,7 @@ pub struct MerkleProof {
12
12
#[ derive( Debug ) ]
13
13
pub struct MerkleTree {
14
14
leaves : Vec < B256 > ,
15
+ is_sort : bool ,
15
16
is_tree_ready : bool ,
16
17
layers : Vec < Vec < B256 > > ,
17
18
depth : u64 ,
@@ -28,13 +29,22 @@ impl MerkleTree {
28
29
pub fn new ( ) -> Self {
29
30
MerkleTree {
30
31
leaves : Vec :: new ( ) ,
32
+ is_sort : false ,
31
33
is_tree_ready : false ,
32
34
layers : Vec :: new ( ) ,
33
35
depth : 0 ,
34
36
root : B256 :: default ( ) ,
35
37
}
36
38
}
37
39
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
+
38
48
pub fn insert ( & mut self , leaf : B256 ) {
39
49
self . leaves . push ( leaf) ;
40
50
}
@@ -52,6 +62,12 @@ impl MerkleTree {
52
62
return ;
53
63
}
54
64
65
+ // Sort leaves if not sorted
66
+ if self . is_sort {
67
+ self . leaves . sort ( ) ;
68
+ self . is_sort = true ;
69
+ }
70
+
55
71
self . depth = 1 ;
56
72
self . layers . push ( self . leaves . clone ( ) ) ;
57
73
@@ -139,4 +155,30 @@ mod test {
139
155
assert ! ( MerkleTree :: verify_proof( & proof) ) ;
140
156
}
141
157
}
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
+ }
142
184
}
0 commit comments