From cb9b59b93d90a727c9a4e3eac0423a7a42d0eca0 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Mon, 15 Apr 2019 11:49:50 +1000 Subject: [PATCH] Remove panics from packed_encoding --- eth2/utils/tree_hash/src/impls.rs | 20 +++++++++++--------- eth2/utils/tree_hash/src/lib.rs | 3 ++- eth2/utils/tree_hash/tests/tests.rs | 8 ++++---- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/eth2/utils/tree_hash/src/impls.rs b/eth2/utils/tree_hash/src/impls.rs index 4349d73d8..05da2753a 100644 --- a/eth2/utils/tree_hash/src/impls.rs +++ b/eth2/utils/tree_hash/src/impls.rs @@ -22,8 +22,8 @@ impl CachedTreeHash for u64 { 8 } - fn packed_encoding(&self) -> Vec { - ssz_encode(self) + fn packed_encoding(&self) -> Result, Error> { + Ok(ssz_encode(self)) } fn packing_factor() -> usize { @@ -55,7 +55,9 @@ where fn build_tree_hash_cache(&self) -> Result { match T::item_type() { - ItemType::Basic => TreeHashCache::from_bytes(merkleize(get_packed_leaves(self)), false), + ItemType::Basic => { + TreeHashCache::from_bytes(merkleize(get_packed_leaves(self)?), false) + } ItemType::Composite | ItemType::List => { let subtrees = self .iter() @@ -88,8 +90,8 @@ where self.iter().fold(0, |acc, item| acc + item.num_bytes()) } - fn packed_encoding(&self) -> Vec { - panic!("List should never be packed") + fn packed_encoding(&self) -> Result, Error> { + Err(Error::ShouldNeverBePacked(Self::item_type())) } fn packing_factor() -> usize { @@ -142,7 +144,7 @@ where match T::item_type() { ItemType::Basic => { - let leaves = get_packed_leaves(self); + let leaves = get_packed_leaves(self)?; for (i, chunk) in offset_handler.iter_leaf_nodes().enumerate() { if let Some(latest) = leaves.get(i * HASHSIZE..(i + 1) * HASHSIZE) { @@ -213,7 +215,7 @@ where } } -fn get_packed_leaves(vec: &Vec) -> Vec +fn get_packed_leaves(vec: &Vec) -> Result, Error> where T: CachedTreeHash, { @@ -223,8 +225,8 @@ where let mut packed = Vec::with_capacity(num_leaves * HASHSIZE); for item in vec { - packed.append(&mut item.packed_encoding()); + packed.append(&mut item.packed_encoding()?); } - sanitise_bytes(packed) + Ok(sanitise_bytes(packed)) } diff --git a/eth2/utils/tree_hash/src/lib.rs b/eth2/utils/tree_hash/src/lib.rs index 4e1cff0e8..76752e5b2 100644 --- a/eth2/utils/tree_hash/src/lib.rs +++ b/eth2/utils/tree_hash/src/lib.rs @@ -23,6 +23,7 @@ pub enum Error { UnableToObtainSlices, UnableToGrowMerkleTree, UnableToShrinkMerkleTree, + ShouldNeverBePacked(ItemType), BytesAreNotEvenChunks(usize), NoModifiedFieldForChunk(usize), NoBytesForChunk(usize), @@ -47,7 +48,7 @@ pub trait CachedTreeHash: Debug { fn btree_overlay(&self, chunk_offset: usize) -> Result; - fn packed_encoding(&self) -> Vec; + fn packed_encoding(&self) -> Result, Error>; fn packing_factor() -> usize; diff --git a/eth2/utils/tree_hash/tests/tests.rs b/eth2/utils/tree_hash/tests/tests.rs index a315feeed..17ec121a8 100644 --- a/eth2/utils/tree_hash/tests/tests.rs +++ b/eth2/utils/tree_hash/tests/tests.rs @@ -55,8 +55,8 @@ impl CachedTreeHash for Inner { BTreeOverlay::from_lengths(chunk_offset, lengths) } - fn packed_encoding(&self) -> Vec { - panic!("Struct should never be packed") + fn packed_encoding(&self) -> Result, Error> { + Err(Error::ShouldNeverBePacked(Self::item_type())) } fn packing_factor() -> usize { @@ -133,8 +133,8 @@ impl CachedTreeHash for Outer { BTreeOverlay::from_lengths(chunk_offset, lengths) } - fn packed_encoding(&self) -> Vec { - panic!("Struct should never be packed") + fn packed_encoding(&self) -> Result, Error> { + Err(Error::ShouldNeverBePacked(Self::item_type())) } fn packing_factor() -> usize {