@@ -6,18 +6,7 @@ use plonky2::plonk::config::Hasher;
66use std:: collections:: HashMap ;
77
88use super :: { Hash , Value , EMPTY } ;
9- use crate :: primitives:: merkletree:: { MerkleProof , MerkleTree , MerkleTreeTrait } ;
10-
11- /// Container is a wrapper of a MerkleTree, used to achieve Dictionary, Set, Array frontend types.
12- /// It offers all the methods of the trait `MerkleTreeTrait`, with an additional constructor `new`
13- /// that allows each specific type (ie. Dictionary, Set, Array) to define how each type is
14- /// constructed (for example a Dictionary is built from HashMap<Hash,Value>, whereas a set is built
15- /// from Vec<Value>).
16- pub trait Container : MerkleTreeTrait {
17- type Raw : Clone ;
18-
19- fn new ( raw : & Self :: Raw ) -> Self ;
20- }
9+ use crate :: primitives:: merkletree:: { MerkleProof , MerkleTree } ;
2110
2211/// Dictionary: the user original keys and values are hashed to be used in the leaf.
2312/// leaf.key=hash(original_key)
@@ -28,37 +17,32 @@ pub struct Dictionary {
2817 pub ( crate ) mt : MerkleTree ,
2918}
3019
31- impl Container for Dictionary {
32- type Raw = HashMap < Hash , Value > ;
33-
34- fn new ( raw : & Self :: Raw ) -> Self {
35- let kvs: HashMap < Value , Value > = raw. into_iter ( ) . map ( |( & k, & v) | ( Value ( k. 0 ) , v) ) . collect ( ) ;
20+ impl Dictionary {
21+ pub fn new ( kvs : & HashMap < Hash , Value > ) -> Self {
22+ let kvs: HashMap < Value , Value > = kvs. into_iter ( ) . map ( |( & k, & v) | ( Value ( k. 0 ) , v) ) . collect ( ) ;
3623 Self {
37- mt : MerkleTree :: build ( & kvs) ,
24+ mt : MerkleTree :: new ( & kvs) ,
3825 }
3926 }
40- }
41-
42- impl MerkleTreeTrait for Dictionary {
43- fn root ( & self ) -> Hash {
27+ pub fn commitment ( & self ) -> Hash {
4428 self . mt . root ( )
4529 }
46- fn get ( & self , key : & Value ) -> Result < Value > {
30+ pub fn get ( & self , key : & Value ) -> Result < Value > {
4731 self . mt . get ( key)
4832 }
49- fn prove ( & self , key : & Value ) -> Result < MerkleProof > {
33+ pub fn prove ( & self , key : & Value ) -> Result < MerkleProof > {
5034 self . mt . prove ( key)
5135 }
52- fn prove_nonexistence ( & self , key : & Value ) -> Result < MerkleProof > {
36+ pub fn prove_nonexistence ( & self , key : & Value ) -> Result < MerkleProof > {
5337 self . mt . prove_nonexistence ( key)
5438 }
55- fn verify ( root : Hash , proof : & MerkleProof , key : & Value , value : & Value ) -> Result < ( ) > {
39+ pub fn verify ( root : Hash , proof : & MerkleProof , key : & Value , value : & Value ) -> Result < ( ) > {
5640 MerkleTree :: verify ( root, proof, key, value)
5741 }
58- fn verify_nonexistence ( root : Hash , proof : & MerkleProof , key : & Value ) -> Result < ( ) > {
42+ pub fn verify_nonexistence ( root : Hash , proof : & MerkleProof , key : & Value ) -> Result < ( ) > {
5943 MerkleTree :: verify_nonexistence ( root, proof, key)
6044 }
61- fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
45+ pub fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
6246 self . mt . iter ( )
6347 }
6448}
@@ -86,43 +70,38 @@ pub struct Set {
8670 mt : MerkleTree ,
8771}
8872
89- impl Container for Set {
90- type Raw = Vec < Value > ;
91-
92- fn new ( raw : & Self :: Raw ) -> Self {
93- let kvs: HashMap < Value , Value > = raw
73+ impl Set {
74+ pub fn new ( set : & Vec < Value > ) -> Self {
75+ let kvs: HashMap < Value , Value > = set
9476 . into_iter ( )
9577 . map ( |e| {
9678 let h = PoseidonHash :: hash_no_pad ( & e. 0 ) . elements ;
9779 ( Value ( h) , EMPTY )
9880 } )
9981 . collect ( ) ;
10082 Self {
101- mt : MerkleTree :: build ( & kvs) ,
83+ mt : MerkleTree :: new ( & kvs) ,
10284 }
10385 }
104- }
105-
106- impl MerkleTreeTrait for Set {
107- fn root ( & self ) -> Hash {
86+ pub fn commitment ( & self ) -> Hash {
10887 self . mt . root ( )
10988 }
110- fn get ( & self , key : & Value ) -> Result < Value > {
111- self . mt . get ( key)
89+ pub fn contains ( & self , key : & Value ) -> bool {
90+ self . mt . contains ( key)
11291 }
113- fn prove ( & self , key : & Value ) -> Result < MerkleProof > {
92+ pub fn prove ( & self , key : & Value ) -> Result < MerkleProof > {
11493 self . mt . prove ( key)
11594 }
116- fn prove_nonexistence ( & self , key : & Value ) -> Result < MerkleProof > {
95+ pub fn prove_nonexistence ( & self , key : & Value ) -> Result < MerkleProof > {
11796 self . mt . prove_nonexistence ( key)
11897 }
119- fn verify ( root : Hash , proof : & MerkleProof , key : & Value , value : & Value ) -> Result < ( ) > {
98+ pub fn verify ( root : Hash , proof : & MerkleProof , key : & Value , value : & Value ) -> Result < ( ) > {
12099 MerkleTree :: verify ( root, proof, key, value)
121100 }
122- fn verify_nonexistence ( root : Hash , proof : & MerkleProof , key : & Value ) -> Result < ( ) > {
101+ pub fn verify_nonexistence ( root : Hash , proof : & MerkleProof , key : & Value ) -> Result < ( ) > {
123102 MerkleTree :: verify_nonexistence ( root, proof, key)
124103 }
125- fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
104+ pub fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
126105 self . mt . iter ( )
127106 }
128107}
@@ -143,42 +122,31 @@ pub struct Array {
143122 mt : MerkleTree ,
144123}
145124
146- impl Container for Array {
147- type Raw = Vec < Value > ;
148-
149- fn new ( raw : & Self :: Raw ) -> Self {
150- let kvs: HashMap < Value , Value > = raw
125+ impl Array {
126+ pub fn new ( array : & Vec < Value > ) -> Self {
127+ let kvs: HashMap < Value , Value > = array
151128 . into_iter ( )
152129 . enumerate ( )
153130 . map ( |( i, & e) | ( Value :: from ( i as i64 ) , e) )
154131 . collect ( ) ;
155132
156133 Self {
157- mt : MerkleTree :: build ( & kvs) ,
134+ mt : MerkleTree :: new ( & kvs) ,
158135 }
159136 }
160- }
161-
162- impl MerkleTreeTrait for Array {
163- fn root ( & self ) -> Hash {
137+ pub fn commitment ( & self ) -> Hash {
164138 self . mt . root ( )
165139 }
166- fn get ( & self , key : & Value ) -> Result < Value > {
167- self . mt . get ( key)
168- }
169- fn prove ( & self , key : & Value ) -> Result < MerkleProof > {
170- self . mt . prove ( key)
140+ pub fn get ( & self , i : usize ) -> Result < Value > {
141+ self . mt . get ( & Value :: from ( i as i64 ) )
171142 }
172- fn prove_nonexistence ( & self , key : & Value ) -> Result < MerkleProof > {
173- self . mt . prove_nonexistence ( key )
143+ pub fn prove ( & self , i : usize ) -> Result < MerkleProof > {
144+ self . mt . prove ( & Value :: from ( i as i64 ) )
174145 }
175- fn verify ( root : Hash , proof : & MerkleProof , key : & Value , value : & Value ) -> Result < ( ) > {
176- MerkleTree :: verify ( root, proof, key, value)
177- }
178- fn verify_nonexistence ( root : Hash , proof : & MerkleProof , key : & Value ) -> Result < ( ) > {
179- MerkleTree :: verify_nonexistence ( root, proof, key)
146+ pub fn verify ( root : Hash , proof : & MerkleProof , i : usize , value : & Value ) -> Result < ( ) > {
147+ MerkleTree :: verify ( root, proof, & Value :: from ( i as i64 ) , value)
180148 }
181- fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
149+ pub fn iter ( & self ) -> std:: collections:: hash_map:: Iter < Value , Value > {
182150 self . mt . iter ( )
183151 }
184152}
0 commit comments