From ba65bdfc6a78b0046574e4d27004c60e1b7a6eb7 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 14:20:23 -0500 Subject: [PATCH 01/10] redundant if and type conversion change --- beacon_chain/utils/ssz/src/impl_decode.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/beacon_chain/utils/ssz/src/impl_decode.rs b/beacon_chain/utils/ssz/src/impl_decode.rs index 2833037f31..b86af13654 100644 --- a/beacon_chain/utils/ssz/src/impl_decode.rs +++ b/beacon_chain/utils/ssz/src/impl_decode.rs @@ -20,7 +20,7 @@ macro_rules! impl_decodable_for_uint { let mut result: $type = 0; for i in index..end_bytes { let offset = ((index + max_bytes) - i - 1) * 8; - result = ((bytes[i] as $type) << offset) | result; + result |= ($type::from(bytes[i])) << offset; }; Ok((result, end_bytes)) } else { @@ -52,10 +52,7 @@ impl Decodable for H256 { fn ssz_decode(bytes: &[u8], index: usize) -> Result<(Self, usize), DecodeError> { - if bytes.len() < 32 { - return Err(DecodeError::TooShort) - } - else if bytes.len() - 32 < index { + if bytes.len() < 32 || bytes.len() - 32 < index { return Err(DecodeError::TooShort) } else { From 9c1d34253a509cd01e820fc3f714b9162e5bbe6b Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 15:15:58 -0500 Subject: [PATCH 02/10] refactoring of impl_decodable_for_uint --- beacon_chain/utils/ssz/src/impl_decode.rs | 14 +++++++------- beacon_chain/utils/ssz/src/impl_encode.rs | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/beacon_chain/utils/ssz/src/impl_decode.rs b/beacon_chain/utils/ssz/src/impl_decode.rs index b86af13654..a6b8843bd7 100644 --- a/beacon_chain/utils/ssz/src/impl_decode.rs +++ b/beacon_chain/utils/ssz/src/impl_decode.rs @@ -8,20 +8,20 @@ use super::{ macro_rules! impl_decodable_for_uint { ($type: ident, $bit_size: expr) => { impl Decodable for $type { - fn ssz_decode(bytes: &[u8], index: usize) + fn ssz_decode(bytes: &[u8], start_bytes: usize) -> Result<(Self, usize), DecodeError> { assert!((0 < $bit_size) & ($bit_size <= 64) & ($bit_size % 8 == 0)); let max_bytes = $bit_size / 8; - if bytes.len() >= (index + max_bytes) { - let end_bytes = index + max_bytes; + if bytes.len() >= (start_bytes + max_bytes) { + let end_bytes = start_bytes + max_bytes; let mut result: $type = 0; - for i in index..end_bytes { - let offset = ((index + max_bytes) - i - 1) * 8; - result |= ($type::from(bytes[i])) << offset; - }; + for (index, byte) in bytes.iter().enumerate().take(end_bytes).skip(start_bytes) { + let offset = (end_bytes - index - 1) * 8; + result |= ($type::from(*byte)) << offset; + } Ok((result, end_bytes)) } else { Err(DecodeError::TooShort) diff --git a/beacon_chain/utils/ssz/src/impl_encode.rs b/beacon_chain/utils/ssz/src/impl_encode.rs index 392f8667e0..36776e0719 100644 --- a/beacon_chain/utils/ssz/src/impl_encode.rs +++ b/beacon_chain/utils/ssz/src/impl_encode.rs @@ -35,7 +35,7 @@ macro_rules! impl_encodable_for_uint { } // Append bytes to the SszStream - s.append_encoded_raw(&mut buf.to_vec()); + s.append_encoded_raw(&buf.to_vec()); } } } From e714ec0489dfcd8e99ab6e275761f5f9b2b082ad Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 17:04:17 -0500 Subject: [PATCH 03/10] cast_lossless warning supressed and better looking vectors --- beacon_chain/utils/ssz/src/encode.rs | 6 +++--- beacon_chain/utils/ssz/src/impl_encode.rs | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index 5080924ccf..b501ebe40a 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -41,7 +41,7 @@ impl SszStream { /// /// The length of the supplied bytes will be concatenated /// to the stream before the supplied bytes. - pub fn append_encoded_val(&mut self, vec: &Vec) { + pub fn append_encoded_val(&mut self, vec: &[u8]) { self.buffer.extend_from_slice( &encode_length(vec.len(), LENGTH_BYTES)); @@ -51,7 +51,7 @@ impl SszStream { /// Append some ssz encoded bytes to the stream without calculating length /// /// The raw bytes will be concatenated to the stream. - pub fn append_encoded_raw(&mut self, vec: &Vec) { + pub fn append_encoded_raw(&mut self, vec: &[u8]) { self.buffer.extend_from_slice(&vec); } @@ -59,7 +59,7 @@ impl SszStream { /// /// The length of the list will be concatenated to the stream, then /// each item in the vector will be encoded and concatenated. - pub fn append_vec(&mut self, vec: &Vec) + pub fn append_vec(&mut self, vec: &[E]) where E: Encodable { let mut list_stream = SszStream::new(); diff --git a/beacon_chain/utils/ssz/src/impl_encode.rs b/beacon_chain/utils/ssz/src/impl_encode.rs index 36776e0719..a2e955d37c 100644 --- a/beacon_chain/utils/ssz/src/impl_encode.rs +++ b/beacon_chain/utils/ssz/src/impl_encode.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(feature = "clippy"), allow(cast_lossless))] + extern crate bytes; use super::{ From 869049d099803354adf652d606e02d70f160849b Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 17:29:12 -0500 Subject: [PATCH 04/10] needless_range ignore and derive[default] tag on sszstream --- beacon_chain/utils/ssz/src/encode.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index b501ebe40a..0a5ac4b4d0 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(feature = "clippy"), allow(needless_range_loop))] + use super::{ LENGTH_BYTES, MAX_LIST_SIZE, @@ -17,6 +19,7 @@ pub trait Encodable { /// Use the `append()` fn to add a value to a list, then use /// the `drain()` method to consume the struct and return the /// ssz encoded bytes. +#[derive(Default)] pub struct SszStream { buffer: Vec } From d3ec313b430090a36eb099eff668238c1f7b7945 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 17:38:32 -0500 Subject: [PATCH 05/10] a few more quick changes and another range loop ignore --- beacon_chain/utils/ssz/src/decode.rs | 4 +++- beacon_chain/utils/ssz/src/encode.rs | 8 +------- beacon_chain/utils/ssz/src/impl_decode.rs | 5 ++--- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/beacon_chain/utils/ssz/src/decode.rs b/beacon_chain/utils/ssz/src/decode.rs index bb51610ee0..3d81b70ba2 100644 --- a/beacon_chain/utils/ssz/src/decode.rs +++ b/beacon_chain/utils/ssz/src/decode.rs @@ -1,3 +1,5 @@ +#![cfg_attr(not(feature = "clippy"), allow(needless_range_loop))] + use super::{ LENGTH_BYTES, }; @@ -79,7 +81,7 @@ pub fn decode_length(bytes: &[u8], index: usize, length_bytes: usize) let mut len: usize = 0; for i in index..index+length_bytes { let offset = (index+length_bytes - i - 1) * 8; - len = ((bytes[i] as usize) << offset) | len; + len |= (bytes[i] as usize) << offset; }; Ok(len) } diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index 0a5ac4b4d0..91753bacf4 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -1,15 +1,9 @@ #![cfg_attr(not(feature = "clippy"), allow(needless_range_loop))] use super::{ - LENGTH_BYTES, - MAX_LIST_SIZE, + LENGTH_BYTES }; -#[derive(Debug)] -pub enum EncodeError { - ListTooLong, -} - pub trait Encodable { fn ssz_append(&self, s: &mut SszStream); } diff --git a/beacon_chain/utils/ssz/src/impl_decode.rs b/beacon_chain/utils/ssz/src/impl_decode.rs index a6b8843bd7..d0b5d2d677 100644 --- a/beacon_chain/utils/ssz/src/impl_decode.rs +++ b/beacon_chain/utils/ssz/src/impl_decode.rs @@ -53,11 +53,10 @@ impl Decodable for H256 { -> Result<(Self, usize), DecodeError> { if bytes.len() < 32 || bytes.len() - 32 < index { - return Err(DecodeError::TooShort) + Err(DecodeError::TooShort) } else { - return Ok((H256::from(&bytes[index..(index + 32)]), - index + 32)); + Ok((H256::from(&bytes[index..(index + 32)]), index + 32)) } } } From 0cab98ffe161108ad63d25f6308451c636e2585a Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 18:43:43 -0500 Subject: [PATCH 06/10] another loop fixed --- beacon_chain/utils/ssz/src/decode.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/beacon_chain/utils/ssz/src/decode.rs b/beacon_chain/utils/ssz/src/decode.rs index 3d81b70ba2..53f82547c2 100644 --- a/beacon_chain/utils/ssz/src/decode.rs +++ b/beacon_chain/utils/ssz/src/decode.rs @@ -1,5 +1,3 @@ -#![cfg_attr(not(feature = "clippy"), allow(needless_range_loop))] - use super::{ LENGTH_BYTES, }; @@ -79,10 +77,10 @@ pub fn decode_length(bytes: &[u8], index: usize, length_bytes: usize) return Err(DecodeError::TooShort); }; let mut len: usize = 0; - for i in index..index+length_bytes { + for (i, byte) in bytes.iter().enumerate().take(index+length_bytes).skip(index) { let offset = (index+length_bytes - i - 1) * 8; - len |= (bytes[i] as usize) << offset; - }; + len |= (*byte as usize) << offset; + } Ok(len) } From 3c1640f41a72561563285dddaa775be5936378d2 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 19:20:01 -0500 Subject: [PATCH 07/10] moved suppress warning tag --- beacon_chain/utils/ssz/src/encode.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index 91753bacf4..74a94605ac 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -1,5 +1,3 @@ -#![cfg_attr(not(feature = "clippy"), allow(needless_range_loop))] - use super::{ LENGTH_BYTES }; @@ -80,6 +78,7 @@ pub fn encode_length(len: usize, length_bytes: usize) -> Vec { assert!(length_bytes > 0); // For sanity assert!((len as usize) < 2usize.pow(length_bytes as u32 * 8)); let mut header: Vec = vec![0; length_bytes]; + #[allow(needless_range_loop)] for i in 0..length_bytes { let offset = (length_bytes - i - 1) * 8; header[i] = ((len >> offset) & 0xff) as u8; From d670294c11983e3526b2b50ec5bcd20ea4ec6fb8 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Sat, 20 Oct 2018 20:31:26 -0500 Subject: [PATCH 08/10] readded cast_lossless supress to encode --- beacon_chain/utils/ssz/src/impl_encode.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/beacon_chain/utils/ssz/src/impl_encode.rs b/beacon_chain/utils/ssz/src/impl_encode.rs index a2e955d37c..b66dd30c84 100644 --- a/beacon_chain/utils/ssz/src/impl_encode.rs +++ b/beacon_chain/utils/ssz/src/impl_encode.rs @@ -1,5 +1,3 @@ -#![cfg_attr(not(feature = "clippy"), allow(cast_lossless))] - extern crate bytes; use super::{ @@ -17,8 +15,8 @@ use self::bytes::{ BytesMut, BufMut }; macro_rules! impl_encodable_for_uint { ($type: ident, $bit_size: expr) => { impl Encodable for $type { - fn ssz_append(&self, s: &mut SszStream) - { + #[allow(cast_lossless)] + fn ssz_append(&self, s: &mut SszStream) { // Ensure bit size is valid assert!((0 < $bit_size) && ($bit_size % 8 == 0) && From 4c272d7f0a5896b9402006a382b667c61caf5aea Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Tue, 23 Oct 2018 19:34:47 -0500 Subject: [PATCH 09/10] suppressed unknown lint warning in test --- beacon_chain/utils/ssz/src/encode.rs | 2 ++ beacon_chain/utils/ssz/src/impl_decode.rs | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index 74a94605ac..905541e2fc 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -1,3 +1,5 @@ +#![allow(unknown_lints)] + use super::{ LENGTH_BYTES }; diff --git a/beacon_chain/utils/ssz/src/impl_decode.rs b/beacon_chain/utils/ssz/src/impl_decode.rs index d0b5d2d677..708287902c 100644 --- a/beacon_chain/utils/ssz/src/impl_decode.rs +++ b/beacon_chain/utils/ssz/src/impl_decode.rs @@ -8,18 +8,18 @@ use super::{ macro_rules! impl_decodable_for_uint { ($type: ident, $bit_size: expr) => { impl Decodable for $type { - fn ssz_decode(bytes: &[u8], start_bytes: usize) + fn ssz_decode(bytes: &[u8], index: usize) -> Result<(Self, usize), DecodeError> { assert!((0 < $bit_size) & ($bit_size <= 64) & ($bit_size % 8 == 0)); let max_bytes = $bit_size / 8; - if bytes.len() >= (start_bytes + max_bytes) { - let end_bytes = start_bytes + max_bytes; + if bytes.len() >= (index + max_bytes) { + let end_bytes = index + max_bytes; let mut result: $type = 0; - for (index, byte) in bytes.iter().enumerate().take(end_bytes).skip(start_bytes) { - let offset = (end_bytes - index - 1) * 8; + for (i, byte) in bytes.iter().enumerate().take(end_bytes).skip(index) { + let offset = (end_bytes - i - 1) * 8; result |= ($type::from(*byte)) << offset; } Ok((result, end_bytes)) From 625fc4c9b956910057086caa906f969556977e06 Mon Sep 17 00:00:00 2001 From: Grant Wuerker Date: Wed, 24 Oct 2018 07:56:58 -0500 Subject: [PATCH 10/10] mutable iterator in encode_length --- beacon_chain/utils/ssz/src/encode.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/beacon_chain/utils/ssz/src/encode.rs b/beacon_chain/utils/ssz/src/encode.rs index 905541e2fc..42ea0b27e8 100644 --- a/beacon_chain/utils/ssz/src/encode.rs +++ b/beacon_chain/utils/ssz/src/encode.rs @@ -1,5 +1,3 @@ -#![allow(unknown_lints)] - use super::{ LENGTH_BYTES }; @@ -80,10 +78,9 @@ pub fn encode_length(len: usize, length_bytes: usize) -> Vec { assert!(length_bytes > 0); // For sanity assert!((len as usize) < 2usize.pow(length_bytes as u32 * 8)); let mut header: Vec = vec![0; length_bytes]; - #[allow(needless_range_loop)] - for i in 0..length_bytes { + for (i, header_byte) in header.iter_mut().enumerate() { let offset = (length_bytes - i - 1) * 8; - header[i] = ((len >> offset) & 0xff) as u8; + *header_byte = ((len >> offset) & 0xff) as u8; }; header }