@@ -194,11 +194,9 @@ impl<const S: usize> parity_scale_codec::Encode for Multihash<S> {
194
194
& self ,
195
195
dest : & mut EncOut ,
196
196
) {
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
- digest . encode_to ( dest ) ;
199
+ dest . write ( self . digest ( ) ) ;
202
200
}
203
201
}
204
202
@@ -210,11 +208,13 @@ impl<const S: usize> parity_scale_codec::Decode for Multihash<S> {
210
208
fn decode < DecIn : parity_scale_codec:: Input > (
211
209
input : & mut DecIn ,
212
210
) -> Result < Self , parity_scale_codec:: Error > {
213
- Ok ( Multihash {
211
+ let mut mh = Multihash {
214
212
code : parity_scale_codec:: Decode :: decode ( input) ?,
215
213
size : parity_scale_codec:: Decode :: decode ( input) ?,
216
- digest : <[ u8 ; S ] >:: decode ( input) ?,
217
- } )
214
+ digest : [ 0 ; S ] ,
215
+ } ;
216
+ input. read ( & mut mh. digest [ ..mh. size as usize ] ) ?;
217
+ Ok ( mh)
218
218
}
219
219
}
220
220
@@ -318,15 +318,31 @@ mod tests {
318
318
#[ test]
319
319
#[ cfg( feature = "scale-codec" ) ]
320
320
fn test_scale ( ) {
321
+ use crate :: { Hasher , Sha2_256 } ;
321
322
use parity_scale_codec:: {
322
323
Decode ,
323
324
Encode ,
324
325
} ;
325
326
326
- let mh = Multihash :: < 32 > :: default ( ) ;
327
- let bytes = mh. encode ( ) ;
328
- let mh2: Multihash < 32 > = Decode :: decode ( & mut & bytes[ ..] ) . unwrap ( ) ;
329
- assert_eq ! ( mh, mh2) ;
327
+ let mh1 = Multihash :: < 32 > :: wrap (
328
+ Code :: Sha2_256 . into ( ) ,
329
+ Sha2_256 :: digest ( b"hello world" ) . as_ref ( ) ,
330
+ )
331
+ . unwrap ( ) ;
332
+ // println!("mh1: code = {}, size = {}, digest = {:?}", mh1.code(), mh1.size(), mh1.digest());
333
+ let mh1_bytes = mh1. encode ( ) ;
334
+ // println!("Multihash<32>: {}", hex::encode(&mh1_bytes));
335
+ let mh2: Multihash < 32 > = Decode :: decode ( & mut & mh1_bytes[ ..] ) . unwrap ( ) ;
336
+ assert_eq ! ( mh1, mh2) ;
337
+
338
+ let mh3: Multihash < 64 > = Code :: Sha2_256 . digest ( b"hello world" ) ;
339
+ // println!("mh3: code = {}, size = {}, digest = {:?}", mh3.code(), mh3.size(), mh3.digest());
340
+ let mh3_bytes = mh3. encode ( ) ;
341
+ // println!("Multihash<64>: {}", hex::encode(&mh3_bytes));
342
+ let mh4: Multihash < 64 > = Decode :: decode ( & mut & mh3_bytes[ ..] ) . unwrap ( ) ;
343
+ assert_eq ! ( mh3, mh4) ;
344
+
345
+ assert_eq ! ( mh1_bytes, mh3_bytes) ;
330
346
}
331
347
332
348
#[ test]
0 commit comments