@@ -194,16 +194,14 @@ impl<const S: usize> From<Multihash<S>> for Vec<u8> {
194
194
#[ cfg( feature = "scale-codec" ) ]
195
195
impl < const S : usize > parity_scale_codec:: Encode for Multihash < S > {
196
196
fn encode_to < EncOut : parity_scale_codec:: Output + ?Sized > ( & self , dest : & mut EncOut ) {
197
- let mut digest = [ 0 ; S ] ;
198
- digest. copy_from_slice ( & self . digest ) ;
199
197
self . code . encode_to ( dest) ;
200
198
self . size . encode_to ( dest) ;
201
199
// **NOTE** We write the digest directly to dest, since we have known the size of digest.
202
200
//
203
201
// We do not choose to encode &[u8] directly, because it will add extra bytes (the compact length of digest).
204
202
// For a valid multihash, the length of digest must equal to `size`.
205
203
// Therefore, we can only read raw bytes whose length is equal to `size` when decoding.
206
- dest. write ( & digest [ .. self . size as usize ] ) ;
204
+ dest. write ( self . digest ( ) ) ;
207
205
}
208
206
}
209
207
@@ -215,15 +213,17 @@ impl<const S: usize> parity_scale_codec::Decode for Multihash<S> {
215
213
fn decode < DecIn : parity_scale_codec:: Input > (
216
214
input : & mut DecIn ,
217
215
) -> Result < Self , parity_scale_codec:: Error > {
218
- let code = parity_scale_codec:: Decode :: decode ( input) ?;
219
- let size = parity_scale_codec:: Decode :: decode ( input) ?;
220
- if size as usize > S {
216
+ let mut mh = Multihash {
217
+ code : parity_scale_codec:: Decode :: decode ( input) ?,
218
+ size : parity_scale_codec:: Decode :: decode ( input) ?,
219
+ digest : [ 0 ; S ] ,
220
+ } ;
221
+ if mh. size as usize > S {
221
222
return Err ( parity_scale_codec:: Error :: from ( "invalid size" ) ) ;
222
223
}
223
224
// For a valid multihash, the length of digest must equal to the size.
224
- let mut digest = [ 0 ; S ] ;
225
- input. read ( & mut digest[ ..size as usize ] ) ?;
226
- Ok ( Multihash { code, size, digest } )
225
+ input. read ( & mut mh. digest [ ..mh. size as usize ] ) ?;
226
+ Ok ( mh)
227
227
}
228
228
}
229
229
0 commit comments