From 7d25a700fc850371d886e31230c0c55808eba2f9 Mon Sep 17 00:00:00 2001 From: Giacomo Pasini Date: Tue, 24 Aug 2021 09:32:20 +0200 Subject: [PATCH 1/4] encode fragment length as u32 --- chain-impl-mockchain/src/block/mod.rs | 4 ++-- chain-impl-mockchain/src/fragment/raw.rs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/chain-impl-mockchain/src/block/mod.rs b/chain-impl-mockchain/src/block/mod.rs index 73e33a487..d19e750d8 100644 --- a/chain-impl-mockchain/src/block/mod.rs +++ b/chain-impl-mockchain/src/block/mod.rs @@ -145,7 +145,7 @@ impl Readable for Block { let mut contents = ContentsBuilder::new(); while remaining_content_size > 0 { - let message_size = buf.get_u16()?; + let message_size = buf.get_u32()?; let mut message_buf = buf.split_to(message_size as usize)?; // return error here if message serialize sized is bigger than remaining size @@ -153,7 +153,7 @@ impl Readable for Block { let message = Fragment::read(&mut message_buf)?; contents.push(message); - remaining_content_size -= 2 + message_size as u32; + remaining_content_size -= 4 + message_size as u32; } Ok(Block { diff --git a/chain-impl-mockchain/src/fragment/raw.rs b/chain-impl-mockchain/src/fragment/raw.rs index 7d046641d..2157b48c8 100644 --- a/chain-impl-mockchain/src/fragment/raw.rs +++ b/chain-impl-mockchain/src/fragment/raw.rs @@ -9,7 +9,7 @@ pub struct FragmentRaw(pub(super) Vec); impl FragmentRaw { pub fn size_bytes_plus_size(&self) -> usize { - 2 + self.0.len() + 4 + self.0.len() } pub fn id(&self) -> FragmentId { @@ -28,7 +28,7 @@ impl property::Deserialize for FragmentRaw { fn deserialize(reader: R) -> Result { use chain_core::packer::*; let mut codec = Codec::new(reader); - let size = codec.get_u16()?; + let size = codec.get_u32()?; let mut v = vec![0u8; size as usize]; codec.into_inner().read_exact(&mut v)?; Ok(FragmentRaw(v)) @@ -41,7 +41,7 @@ impl property::Serialize for FragmentRaw { use chain_core::packer::*; let mut codec = Codec::new(writer); - codec.put_u16(self.0.len() as u16)?; + codec.put_u32(self.0.len() as u32)?; codec.into_inner().write_all(&self.0)?; Ok(()) } From aa918870f70b707d0e76936535c6537460761c71 Mon Sep 17 00:00:00 2001 From: Giacomo Pasini Date: Tue, 24 Aug 2021 10:20:18 +0200 Subject: [PATCH 2/4] add fragment/transactions ser/de tests --- chain-impl-mockchain/src/fragment/test.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/chain-impl-mockchain/src/fragment/test.rs b/chain-impl-mockchain/src/fragment/test.rs index 85afd79e2..49f5368b6 100644 --- a/chain-impl-mockchain/src/fragment/test.rs +++ b/chain-impl-mockchain/src/fragment/test.rs @@ -1,7 +1,7 @@ use super::*; use crate::config::ConfigParam; #[cfg(test)] -use crate::testing::serialization::serialization_bijection_r; +use crate::testing::serialization::{serialization_bijection, serialization_bijection_r}; #[cfg(test)] use quickcheck::TestResult; use quickcheck::{Arbitrary, Gen}; @@ -30,11 +30,16 @@ impl Arbitrary for Fragment { } #[quickcheck] -fn fragment_serialization_bijection(b: Fragment) -> TestResult { +fn fragment_raw_bijection(b: Fragment) -> TestResult { let b_got = Fragment::from_raw(&b.to_raw()).unwrap(); TestResult::from_bool(b == b_got) } +#[quickcheck] +fn fragment_serialization_bijection(b: Fragment) -> TestResult { + serialization_bijection(b) +} + quickcheck! { fn initial_ents_serialization_bijection(config_params: ConfigParams) -> TestResult { serialization_bijection_r(config_params) From 8d95cf9fc57cf21cbd781e24febfa53c5c8396d5 Mon Sep 17 00:00:00 2001 From: Giacomo Pasini Date: Tue, 24 Aug 2021 11:03:57 +0200 Subject: [PATCH 3/4] add constant for fragment size encoding --- chain-impl-mockchain/src/block/mod.rs | 10 +++++++--- chain-impl-mockchain/src/fragment/mod.rs | 2 +- chain-impl-mockchain/src/fragment/raw.rs | 3 ++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/chain-impl-mockchain/src/block/mod.rs b/chain-impl-mockchain/src/block/mod.rs index d19e750d8..5dc9bb8af 100644 --- a/chain-impl-mockchain/src/block/mod.rs +++ b/chain-impl-mockchain/src/block/mod.rs @@ -13,7 +13,9 @@ mod headerraw; pub mod test; //pub use self::builder::BlockBuilder; -pub use crate::fragment::{BlockContentHash, BlockContentSize, Contents, ContentsBuilder}; +pub use crate::fragment::{ + BlockContentHash, BlockContentSize, Contents, ContentsBuilder, FRAGMENT_SIZE_BYTES_LEN, +}; pub use self::headerraw::HeaderRaw; pub use crate::header::{ @@ -145,7 +147,9 @@ impl Readable for Block { let mut contents = ContentsBuilder::new(); while remaining_content_size > 0 { - let message_size = buf.get_u32()?; + let mut size_buf = [0u8; FRAGMENT_SIZE_BYTES_LEN]; + size_buf.copy_from_slice(buf.get_slice(FRAGMENT_SIZE_BYTES_LEN)?); + let message_size = u32::from_be_bytes(size_buf); let mut message_buf = buf.split_to(message_size as usize)?; // return error here if message serialize sized is bigger than remaining size @@ -153,7 +157,7 @@ impl Readable for Block { let message = Fragment::read(&mut message_buf)?; contents.push(message); - remaining_content_size -= 4 + message_size as u32; + remaining_content_size -= FRAGMENT_SIZE_BYTES_LEN as u32 + message_size as u32; } Ok(Block { diff --git a/chain-impl-mockchain/src/fragment/mod.rs b/chain-impl-mockchain/src/fragment/mod.rs index af5d442ff..935a002e9 100644 --- a/chain-impl-mockchain/src/fragment/mod.rs +++ b/chain-impl-mockchain/src/fragment/mod.rs @@ -7,7 +7,7 @@ use chain_core::mempack::{ReadBuf, ReadError, Readable}; use chain_core::property; pub use config::ConfigParams; -pub use raw::{FragmentId, FragmentRaw}; +pub use raw::{FragmentId, FragmentRaw, FRAGMENT_SIZE_BYTES_LEN}; pub use content::{BlockContentHash, BlockContentSize, Contents, ContentsBuilder}; diff --git a/chain-impl-mockchain/src/fragment/raw.rs b/chain-impl-mockchain/src/fragment/raw.rs index 2157b48c8..bea91cdbe 100644 --- a/chain-impl-mockchain/src/fragment/raw.rs +++ b/chain-impl-mockchain/src/fragment/raw.rs @@ -2,6 +2,7 @@ use crate::key::Hash; use chain_core::property; pub type FragmentId = Hash; +pub const FRAGMENT_SIZE_BYTES_LEN: usize = 4; /// A serialized Message #[derive(Debug, Clone, PartialEq, Eq)] @@ -9,7 +10,7 @@ pub struct FragmentRaw(pub(super) Vec); impl FragmentRaw { pub fn size_bytes_plus_size(&self) -> usize { - 4 + self.0.len() + FRAGMENT_SIZE_BYTES_LEN + self.0.len() } pub fn id(&self) -> FragmentId { From 1033ef44f12dee553ad55aac494a8c127ea188af Mon Sep 17 00:00:00 2001 From: Giacomo Pasini Date: Tue, 24 Aug 2021 12:16:53 +0200 Subject: [PATCH 4/4] impl Readable for FragmentRaw --- chain-impl-mockchain/src/block/mod.rs | 15 ++++++--------- chain-impl-mockchain/src/fragment/mod.rs | 2 +- chain-impl-mockchain/src/fragment/raw.rs | 10 ++++++++++ 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/chain-impl-mockchain/src/block/mod.rs b/chain-impl-mockchain/src/block/mod.rs index 5dc9bb8af..46625cf6e 100644 --- a/chain-impl-mockchain/src/block/mod.rs +++ b/chain-impl-mockchain/src/block/mod.rs @@ -13,9 +13,7 @@ mod headerraw; pub mod test; //pub use self::builder::BlockBuilder; -pub use crate::fragment::{ - BlockContentHash, BlockContentSize, Contents, ContentsBuilder, FRAGMENT_SIZE_BYTES_LEN, -}; +pub use crate::fragment::{BlockContentHash, BlockContentSize, Contents, ContentsBuilder}; pub use self::headerraw::HeaderRaw; pub use crate::header::{ @@ -147,17 +145,16 @@ impl Readable for Block { let mut contents = ContentsBuilder::new(); while remaining_content_size > 0 { - let mut size_buf = [0u8; FRAGMENT_SIZE_BYTES_LEN]; - size_buf.copy_from_slice(buf.get_slice(FRAGMENT_SIZE_BYTES_LEN)?); - let message_size = u32::from_be_bytes(size_buf); - let mut message_buf = buf.split_to(message_size as usize)?; + let message_raw = FragmentRaw::read(buf)?; + let message_size = message_raw.size_bytes_plus_size(); // return error here if message serialize sized is bigger than remaining size - let message = Fragment::read(&mut message_buf)?; + let message = Fragment::from_raw(&message_raw) + .map_err(|e| ReadError::StructureInvalid(e.to_string()))?; contents.push(message); - remaining_content_size -= FRAGMENT_SIZE_BYTES_LEN as u32 + message_size as u32; + remaining_content_size -= message_size as u32; } Ok(Block { diff --git a/chain-impl-mockchain/src/fragment/mod.rs b/chain-impl-mockchain/src/fragment/mod.rs index 935a002e9..af5d442ff 100644 --- a/chain-impl-mockchain/src/fragment/mod.rs +++ b/chain-impl-mockchain/src/fragment/mod.rs @@ -7,7 +7,7 @@ use chain_core::mempack::{ReadBuf, ReadError, Readable}; use chain_core::property; pub use config::ConfigParams; -pub use raw::{FragmentId, FragmentRaw, FRAGMENT_SIZE_BYTES_LEN}; +pub use raw::{FragmentId, FragmentRaw}; pub use content::{BlockContentHash, BlockContentSize, Contents, ContentsBuilder}; diff --git a/chain-impl-mockchain/src/fragment/raw.rs b/chain-impl-mockchain/src/fragment/raw.rs index bea91cdbe..bcbe40ad4 100644 --- a/chain-impl-mockchain/src/fragment/raw.rs +++ b/chain-impl-mockchain/src/fragment/raw.rs @@ -1,5 +1,6 @@ use crate::key::Hash; use chain_core::property; +use chain_ser::mempack::{ReadBuf, ReadError, Readable}; pub type FragmentId = Hash; pub const FRAGMENT_SIZE_BYTES_LEN: usize = 4; @@ -24,6 +25,15 @@ impl AsRef<[u8]> for FragmentRaw { } } +impl Readable for FragmentRaw { + fn read(buf: &mut ReadBuf) -> Result { + let size = buf.get_u32()?; + let mut v = vec![0u8; size as usize]; + buf.copy_to_slice_mut(&mut v)?; + Ok(FragmentRaw(v)) + } +} + impl property::Deserialize for FragmentRaw { type Error = std::io::Error; fn deserialize(reader: R) -> Result {