Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit 6d2cc08

Browse files
committed
fix: correctly encode multihashes with serde
The number of digest bytes written needs to match the size. See the upstream issue here: multiformats/rust-multihash#140 The one change is to not allocate.
1 parent c511971 commit 6d2cc08

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

src/multihash.rs

+26-10
Original file line numberDiff line numberDiff line change
@@ -194,11 +194,9 @@ impl<const S: usize> parity_scale_codec::Encode for Multihash<S> {
194194
&self,
195195
dest: &mut EncOut,
196196
) {
197-
let mut digest = [0; S];
198-
digest.copy_from_slice(&self.digest);
199197
self.code.encode_to(dest);
200198
self.size.encode_to(dest);
201-
digest.encode_to(dest);
199+
dest.write(self.digest());
202200
}
203201
}
204202

@@ -210,11 +208,13 @@ impl<const S: usize> parity_scale_codec::Decode for Multihash<S> {
210208
fn decode<DecIn: parity_scale_codec::Input>(
211209
input: &mut DecIn,
212210
) -> Result<Self, parity_scale_codec::Error> {
213-
Ok(Multihash {
211+
let mut mh = Multihash {
214212
code: parity_scale_codec::Decode::decode(input)?,
215213
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)
218218
}
219219
}
220220

@@ -318,15 +318,31 @@ mod tests {
318318
#[test]
319319
#[cfg(feature = "scale-codec")]
320320
fn test_scale() {
321+
use crate::{Hasher, Sha2_256};
321322
use parity_scale_codec::{
322323
Decode,
323324
Encode,
324325
};
325326

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);
330346
}
331347

332348
#[test]

0 commit comments

Comments
 (0)