@@ -6,15 +6,65 @@ use jmt::{
6
6
storage:: { NodeBatch , TreeReader , TreeUpdateBatch , TreeWriter } ,
7
7
JellyfishMerkleTree , KeyHash , RootHash , SimpleHasher ,
8
8
} ;
9
- use serde:: { Deserialize , Serialize } ;
9
+ use serde:: { ser :: SerializeTupleStruct , Deserialize , Serialize } ;
10
10
use std:: sync:: Arc ;
11
11
12
12
use crate :: hashchain:: Hashchain ;
13
13
14
14
pub const SPARSE_MERKLE_PLACEHOLDER_HASH : Digest =
15
15
Digest :: new ( * b"SPARSE_MERKLE_PLACEHOLDER_HASH__" ) ;
16
16
17
- pub type Hasher = sha2:: Sha256 ;
17
+ #[ derive( Debug , Clone , Default ) ]
18
+ pub struct Hasher ( sha2:: Sha256 ) ;
19
+
20
+ impl Serialize for Hasher {
21
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
22
+ where
23
+ S : serde:: Serializer ,
24
+ {
25
+ serializer. serialize_tuple_struct ( "Sha256Wrapper" , 0 ) ?. end ( )
26
+ }
27
+ }
28
+
29
+ impl < ' de > Deserialize < ' de > for Hasher {
30
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
31
+ where
32
+ D : serde:: Deserializer < ' de > ,
33
+ {
34
+ struct Sha256WrapperVisitor ;
35
+
36
+ impl < ' de > serde:: de:: Visitor < ' de > for Sha256WrapperVisitor {
37
+ type Value = Hasher ;
38
+
39
+ fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
40
+ formatter. write_str ( "a Sha256Wrapper" )
41
+ }
42
+
43
+ fn visit_seq < A > ( self , _seq : A ) -> Result < Self :: Value , A :: Error >
44
+ where
45
+ A : serde:: de:: SeqAccess < ' de > ,
46
+ {
47
+ Ok ( Hasher :: default ( ) )
48
+ }
49
+ }
50
+
51
+ deserializer. deserialize_tuple_struct ( "Sha256Wrapper" , 0 , Sha256WrapperVisitor )
52
+ }
53
+ }
54
+
55
+ impl SimpleHasher for Hasher {
56
+ fn new ( ) -> Self {
57
+ Self ( sha2:: Sha256 :: new ( ) )
58
+ }
59
+
60
+ fn update ( & mut self , data : & [ u8 ] ) {
61
+ self . 0 . update ( data) ;
62
+ }
63
+
64
+ fn finalize ( self ) -> [ u8 ; 32 ] {
65
+ self . 0 . finalize ( )
66
+ }
67
+ }
18
68
19
69
pub fn hash ( data : & [ u8 ] ) -> Digest {
20
70
let mut hasher = Hasher :: new ( ) ;
@@ -109,49 +159,13 @@ pub struct Batch {
109
159
pub proofs : Vec < Proof > ,
110
160
}
111
161
112
- impl Serialize for Proof {
113
- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
114
- where
115
- S : serde:: Serializer ,
116
- {
117
- let bytes = bincode:: serialize ( self ) . map_err ( serde:: ser:: Error :: custom) ?;
118
- serializer. serialize_bytes ( & bytes)
119
- }
120
- }
121
-
122
- impl < ' de > Deserialize < ' de > for Proof {
123
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
124
- where
125
- D : serde:: Deserializer < ' de > ,
126
- {
127
- struct ProofVisitor ;
128
-
129
- impl < ' de > serde:: de:: Visitor < ' de > for ProofVisitor {
130
- type Value = Proof ;
131
-
132
- fn expecting ( & self , formatter : & mut std:: fmt:: Formatter ) -> std:: fmt:: Result {
133
- formatter. write_str ( "a byte array containing serialized Proof" )
134
- }
135
-
136
- fn visit_bytes < E > ( self , v : & [ u8 ] ) -> Result < Self :: Value , E >
137
- where
138
- E : serde:: de:: Error ,
139
- {
140
- bincode:: deserialize ( v) . map_err ( serde:: de:: Error :: custom)
141
- }
142
- }
143
-
144
- deserializer. deserialize_bytes ( ProofVisitor )
145
- }
146
- }
147
-
148
- #[ derive( Debug , Clone ) ]
162
+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
149
163
pub enum Proof {
150
164
Update ( UpdateProof ) ,
151
165
Insert ( InsertProof ) ,
152
166
}
153
167
154
- #[ derive( Debug , Clone ) ]
168
+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
155
169
pub struct NonMembershipProof {
156
170
pub root : Digest ,
157
171
pub proof : SparseMerkleProof < Hasher > ,
@@ -164,7 +178,7 @@ impl NonMembershipProof {
164
178
}
165
179
}
166
180
167
- #[ derive( Debug , Clone ) ]
181
+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
168
182
pub struct InsertProof {
169
183
pub non_membership_proof : NonMembershipProof ,
170
184
@@ -191,7 +205,7 @@ impl InsertProof {
191
205
}
192
206
}
193
207
194
- #[ derive( Debug , Clone ) ]
208
+ #[ derive( Debug , Clone , Serialize , Deserialize ) ]
195
209
pub struct UpdateProof {
196
210
pub old_root : RootHash ,
197
211
pub new_root : RootHash ,
0 commit comments