From d3309b9f7ebd2f803c018842573398167ea0f054 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Fri, 26 Apr 2019 17:27:39 +1000 Subject: [PATCH] Fix bug with bitfield tree hash caching --- eth2/utils/boolean-bitfield/src/lib.rs | 2 -- eth2/utils/cached_tree_hash/src/lib.rs | 5 +++-- eth2/utils/tree_hash_derive/src/lib.rs | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eth2/utils/boolean-bitfield/src/lib.rs b/eth2/utils/boolean-bitfield/src/lib.rs index cdc58173f..c5fa590d6 100644 --- a/eth2/utils/boolean-bitfield/src/lib.rs +++ b/eth2/utils/boolean-bitfield/src/lib.rs @@ -287,14 +287,12 @@ mod tests { let mut hasher = cached_tree_hash::CachedTreeHasher::new(&original).unwrap(); assert_eq!(hasher.tree_hash_root().unwrap(), original.tree_hash_root()); - /* let modified = BooleanBitfield::from_bytes(&vec![2; 1][..]); hasher.update(&modified).unwrap(); assert_eq!(hasher.tree_hash_root().unwrap(), modified.tree_hash_root()); - */ } #[test] diff --git a/eth2/utils/cached_tree_hash/src/lib.rs b/eth2/utils/cached_tree_hash/src/lib.rs index 24bbe0b07..0faf56ea2 100644 --- a/eth2/utils/cached_tree_hash/src/lib.rs +++ b/eth2/utils/cached_tree_hash/src/lib.rs @@ -125,7 +125,8 @@ macro_rules! cached_tree_hash_bytes_as_list { } fn tree_hash_cache_schema(&self, depth: usize) -> cached_tree_hash::BTreeSchema { - cached_tree_hash::impls::vec::produce_schema(&ssz::ssz_encode(self), depth) + let bytes = self.to_bytes(); + cached_tree_hash::impls::vec::produce_schema(&bytes, depth) } fn update_tree_hash_cache( @@ -145,7 +146,7 @@ macro_rules! cached_tree_hash_bytes_as_list { cache.mix_in_length(new_overlay.chunk_range(), bytes.len())?; // Skip an extra node to clear the length node. - cache.chunk_index = new_overlay.next_node() + 1; + cache.chunk_index += 1; Ok(()) } diff --git a/eth2/utils/tree_hash_derive/src/lib.rs b/eth2/utils/tree_hash_derive/src/lib.rs index 910417b81..fdfe1e5c0 100644 --- a/eth2/utils/tree_hash_derive/src/lib.rs +++ b/eth2/utils/tree_hash_derive/src/lib.rs @@ -88,6 +88,7 @@ pub fn subtree_derive(input: TokenStream) -> TokenStream { fn update_tree_hash_cache(&self, cache: &mut cached_tree_hash::TreeHashCache) -> Result<(), cached_tree_hash::Error> { let overlay = cached_tree_hash::BTreeOverlay::new(self, cache.chunk_index, 0); + // Skip the chunk index to the first leaf node of this struct. cache.chunk_index = overlay.first_leaf_node(); // Skip the overlay index to the first leaf node of this struct.