From 6baa1217c531ee4bc4e8ae00fa99a427806b5320 Mon Sep 17 00:00:00 2001 From: Kolby Moroz Liebl <31669092+KolbyML@users.noreply.github.com> Date: Thu, 28 Mar 2024 22:38:37 -0600 Subject: [PATCH 1/6] chore(deps): change ethereum-types to alloy-primitives Update Cargo.toml --- ssz/Cargo.toml | 5 +++-- ssz/src/decode/impls.rs | 18 +++++++++--------- ssz/src/encode/impls.rs | 30 +++++++++++------------------- ssz/tests/tests.rs | 19 ++++++++++--------- 4 files changed, 33 insertions(+), 39 deletions(-) diff --git a/ssz/Cargo.toml b/ssz/Cargo.toml index 0d298dc..9bc831e 100644 --- a/ssz/Cargo.toml +++ b/ssz/Cargo.toml @@ -14,12 +14,13 @@ categories = ["cryptography::cryptocurrencies"] name = "ssz" [dev-dependencies] +alloy-primitives = { version = "0.7.0", features = ["getrandom"] } ethereum_ssz_derive = { version = "0.5.4", path = "../ssz_derive" } [dependencies] -ethereum-types = "0.14.1" +alloy-primitives = "0.7.0" smallvec = { version = "1.6.1", features = ["const_generics"] } itertools = "0.10.3" [features] -arbitrary = ["ethereum-types/arbitrary"] +arbitrary = ["alloy-primitives/arbitrary"] diff --git a/ssz/src/decode/impls.rs b/ssz/src/decode/impls.rs index 3317bd2..08746bf 100644 --- a/ssz/src/decode/impls.rs +++ b/ssz/src/decode/impls.rs @@ -1,7 +1,7 @@ use super::*; use crate::decode::try_from_iter::{TryCollect, TryFromIter}; +use alloy_primitives::{Address, B256, U128, U256}; use core::num::NonZeroUsize; -use ethereum_types::{H160, H256, U128, U256}; use itertools::process_results; use smallvec::SmallVec; use std::collections::{BTreeMap, BTreeSet}; @@ -275,7 +275,7 @@ impl Decode for Arc { } } -impl Decode for H160 { +impl Decode for Address { fn is_ssz_fixed_len() -> bool { true } @@ -296,7 +296,7 @@ impl Decode for H160 { } } -impl Decode for H256 { +impl Decode for B256 { fn is_ssz_fixed_len() -> bool { true } @@ -312,7 +312,7 @@ impl Decode for H256 { if len != expected { Err(DecodeError::InvalidByteLength { len, expected }) } else { - Ok(H256::from_slice(bytes)) + Ok(B256::from_slice(bytes)) } } } @@ -333,7 +333,7 @@ impl Decode for U256 { if len != expected { Err(DecodeError::InvalidByteLength { len, expected }) } else { - Ok(U256::from_little_endian(bytes)) + Ok(U256::from_le_slice(bytes)) } } } @@ -354,7 +354,7 @@ impl Decode for U128 { if len != expected { Err(DecodeError::InvalidByteLength { len, expected }) } else { - Ok(U128::from_little_endian(bytes)) + Ok(U128::from_le_slice(bytes)) } } } @@ -576,9 +576,9 @@ mod tests { } #[test] - fn invalid_h256() { + fn invalid_b256() { assert_eq!( - H256::from_ssz_bytes(&[0; 33]), + B256::from_ssz_bytes(&[0; 33]), Err(DecodeError::InvalidByteLength { len: 33, expected: 32 @@ -586,7 +586,7 @@ mod tests { ); assert_eq!( - H256::from_ssz_bytes(&[0; 31]), + B256::from_ssz_bytes(&[0; 31]), Err(DecodeError::InvalidByteLength { len: 31, expected: 32 diff --git a/ssz/src/encode/impls.rs b/ssz/src/encode/impls.rs index c4bf0c0..f0c1a66 100644 --- a/ssz/src/encode/impls.rs +++ b/ssz/src/encode/impls.rs @@ -1,6 +1,6 @@ use super::*; +use alloy_primitives::{Address, B256, U128, U256}; use core::num::NonZeroUsize; -use ethereum_types::{H160, H256, U128, U256}; use smallvec::SmallVec; use std::collections::{BTreeMap, BTreeSet}; use std::sync::Arc; @@ -409,7 +409,7 @@ impl Encode for NonZeroUsize { } } -impl Encode for H160 { +impl Encode for Address { fn is_ssz_fixed_len() -> bool { true } @@ -423,11 +423,11 @@ impl Encode for H160 { } fn ssz_append(&self, buf: &mut Vec) { - buf.extend_from_slice(self.as_bytes()); + buf.extend_from_slice(self.as_slice()); } } -impl Encode for H256 { +impl Encode for B256 { fn is_ssz_fixed_len() -> bool { true } @@ -441,7 +441,7 @@ impl Encode for H256 { } fn ssz_append(&self, buf: &mut Vec) { - buf.extend_from_slice(self.as_bytes()); + buf.extend_from_slice(self.as_slice()); } } @@ -459,11 +459,7 @@ impl Encode for U256 { } fn ssz_append(&self, buf: &mut Vec) { - let n = ::ssz_fixed_len(); - let s = buf.len(); - - buf.resize(s + n, 0); - self.to_little_endian(&mut buf[s..]); + buf.extend_from_slice(self.as_le_slice()); } } @@ -481,11 +477,7 @@ impl Encode for U128 { } fn ssz_append(&self, buf: &mut Vec) { - let n = ::ssz_fixed_len(); - let s = buf.len(); - - buf.resize(s + n, 0); - self.to_little_endian(&mut buf[s..]); + buf.extend_from_slice(self.as_le_slice()); } } @@ -619,16 +611,16 @@ mod tests { } #[test] - fn ssz_encode_h256() { - assert_eq!(H256::from(&[0; 32]).as_ssz_bytes(), vec![0; 32]); - assert_eq!(H256::from(&[1; 32]).as_ssz_bytes(), vec![1; 32]); + fn ssz_encode_b256() { + assert_eq!(B256::from(&[0; 32]).as_ssz_bytes(), vec![0; 32]); + assert_eq!(B256::from(&[1; 32]).as_ssz_bytes(), vec![1; 32]); let bytes = vec![ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]; - assert_eq!(H256::from_slice(&bytes).as_ssz_bytes(), bytes); + assert_eq!(B256::from_slice(&bytes).as_ssz_bytes(), bytes); } #[test] diff --git a/ssz/tests/tests.rs b/ssz/tests/tests.rs index f52d2c5..17ea623 100644 --- a/ssz/tests/tests.rs +++ b/ssz/tests/tests.rs @@ -1,8 +1,9 @@ -use ethereum_types::H256; use ssz::{Decode, DecodeError, Encode}; use ssz_derive::{Decode, Encode}; mod round_trip { + use alloy_primitives::B256; + use super::*; use std::collections::BTreeMap; use std::iter::FromIterator; @@ -37,28 +38,28 @@ mod round_trip { } #[test] - fn h256() { - let items: Vec = vec![H256::zero(), H256::from([1; 32]), H256::random()]; + fn b256() { + let items: Vec = vec![B256::ZERO, B256::from([1; 32]), B256::random()]; round_trip(items); } #[test] - fn vec_of_h256() { - let items: Vec> = vec![ + fn vec_of_b256() { + let items: Vec> = vec![ vec![], - vec![H256::zero(), H256::from([1; 32]), H256::random()], + vec![B256::ZERO, B256::from([1; 32]), B256::random()], ]; round_trip(items); } #[test] - fn option_vec_h256() { - let items: Vec>> = vec![ + fn option_vec_b256() { + let items: Vec>> = vec![ None, Some(vec![]), - Some(vec![H256::zero(), H256::from([1; 32]), H256::random()]), + Some(vec![B256::ZERO, B256::from([1; 32]), B256::random()]), ]; round_trip(items); From 0c88b6c43b5e2997d246e17165c8d3f190b2a61f Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Wed, 24 Jul 2024 06:54:13 -0700 Subject: [PATCH 2/6] update alloy-primitives package (#24) --- ssz/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssz/Cargo.toml b/ssz/Cargo.toml index 9bc831e..934145e 100644 --- a/ssz/Cargo.toml +++ b/ssz/Cargo.toml @@ -14,11 +14,11 @@ categories = ["cryptography::cryptocurrencies"] name = "ssz" [dev-dependencies] -alloy-primitives = { version = "0.7.0", features = ["getrandom"] } +alloy-primitives = { version = "0.7.7", features = ["getrandom"] } ethereum_ssz_derive = { version = "0.5.4", path = "../ssz_derive" } [dependencies] -alloy-primitives = "0.7.0" +alloy-primitives = "0.7.7" smallvec = { version = "1.6.1", features = ["const_generics"] } itertools = "0.10.3" From 5331ee47edbb2b8aad2e892433fbad1596cc4c6c Mon Sep 17 00:00:00 2001 From: Eitan Seri-Levi Date: Thu, 1 Aug 2024 22:06:11 -0700 Subject: [PATCH 3/6] update alloy-primitives package (#26) add generic alloy types encode/decode --- ssz/src/decode/impls.rs | 36 +++++++++++++++++++++++++---------- ssz/src/encode/impls.rs | 42 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/ssz/src/decode/impls.rs b/ssz/src/decode/impls.rs index 08746bf..9b57745 100644 --- a/ssz/src/decode/impls.rs +++ b/ssz/src/decode/impls.rs @@ -1,6 +1,6 @@ use super::*; use crate::decode::try_from_iter::{TryCollect, TryFromIter}; -use alloy_primitives::{Address, B256, U128, U256}; +use alloy_primitives::{Address, Bytes, FixedBytes, U128, U256}; use core::num::NonZeroUsize; use itertools::process_results; use smallvec::SmallVec; @@ -296,24 +296,27 @@ impl Decode for Address { } } -impl Decode for B256 { +impl Decode for FixedBytes { fn is_ssz_fixed_len() -> bool { true } fn ssz_fixed_len() -> usize { - 32 + N } fn from_ssz_bytes(bytes: &[u8]) -> Result { - let len = bytes.len(); - let expected = ::ssz_fixed_len(); - - if len != expected { - Err(DecodeError::InvalidByteLength { len, expected }) - } else { - Ok(B256::from_slice(bytes)) + if bytes.len() != N { + return Err(DecodeError::InvalidByteLength { + len: bytes.len(), + expected: N, + }); } + + let mut fixed_array = [0u8; N]; + fixed_array.copy_from_slice(bytes); + + Ok(Self(fixed_array)) } } @@ -338,6 +341,18 @@ impl Decode for U256 { } } +impl Decode for Bytes { + #[inline] + fn is_ssz_fixed_len() -> bool { + false + } + + #[inline] + fn from_ssz_bytes(bytes: &[u8]) -> Result { + Ok(bytes.to_vec().into()) + } +} + impl Decode for U128 { fn is_ssz_fixed_len() -> bool { true @@ -527,6 +542,7 @@ pub fn decode_list_of_variable_length_items #[cfg(test)] mod tests { use super::*; + use alloy_primitives::B256; // Note: decoding of valid bytes is generally tested "indirectly" in the `/tests` dir, by // encoding then decoding the element. diff --git a/ssz/src/encode/impls.rs b/ssz/src/encode/impls.rs index f0c1a66..c691164 100644 --- a/ssz/src/encode/impls.rs +++ b/ssz/src/encode/impls.rs @@ -1,5 +1,5 @@ use super::*; -use alloy_primitives::{Address, B256, U128, U256}; +use alloy_primitives::{Address, Bytes, FixedBytes, U128, U256}; use core::num::NonZeroUsize; use smallvec::SmallVec; use std::collections::{BTreeMap, BTreeSet}; @@ -427,21 +427,52 @@ impl Encode for Address { } } -impl Encode for B256 { +impl Encode for FixedBytes { + #[inline] fn is_ssz_fixed_len() -> bool { true } + #[inline] + fn ssz_bytes_len(&self) -> usize { + N + } + + #[inline] fn ssz_fixed_len() -> usize { - 32 + N + } + + #[inline] + fn ssz_append(&self, buf: &mut Vec) { + buf.extend_from_slice(&self.0); + } + + #[inline] + fn as_ssz_bytes(&self) -> Vec { + self.0.to_vec() + } +} + +impl Encode for Bytes { + #[inline] + fn is_ssz_fixed_len() -> bool { + false } + #[inline] fn ssz_bytes_len(&self) -> usize { - 32 + self.0.len() } + #[inline] fn ssz_append(&self, buf: &mut Vec) { - buf.extend_from_slice(self.as_slice()); + buf.extend_from_slice(&self.0); + } + + #[inline] + fn as_ssz_bytes(&self) -> Vec { + self.0.to_vec() } } @@ -510,6 +541,7 @@ impl_encodable_for_u8_array!(48); #[cfg(test)] mod tests { use super::*; + use alloy_primitives::B256; #[test] fn vec_of_u8() { From c312f0ced29e01eb00d5f7bc1185d861ae00c844 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Wed, 14 Aug 2024 10:45:21 +1000 Subject: [PATCH 4/6] Add U128 tests --- ssz/tests/tests.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ssz/tests/tests.rs b/ssz/tests/tests.rs index 5a71561..825d1d5 100644 --- a/ssz/tests/tests.rs +++ b/ssz/tests/tests.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Address, B256}; +use alloy_primitives::{Address, B256, U128}; use ssz::{Decode, DecodeError, Encode}; use ssz_derive::{Decode, Encode}; use std::num::NonZeroUsize; @@ -479,6 +479,28 @@ mod round_trip { let data = vec![Arc::new(vec![0u64]), Arc::new(vec![u64::MAX; 10])]; round_trip(data); } + + #[test] + fn alloy_u128() { + let data = vec![ + U128::from(0), + U128::from(u128::MAX), + U128::from(u64::MAX), + U128::from(255), + ]; + round_trip(data); + } + + #[test] + fn vec_of_option_alloy_u128() { + let data = vec![ + vec![Some(U128::from(u128::MAX)), Some(U128::from(0)), None], + vec![None], + vec![], + vec![Some(U128::from(0))], + ]; + round_trip(data); + } } /// Decode tests that are expected to fail. From 44772ea84445e2ebc2e9fb6541d3bc97862f5919 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Wed, 14 Aug 2024 13:56:46 +1000 Subject: [PATCH 5/6] U256 tests --- ssz/tests/tests.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ssz/tests/tests.rs b/ssz/tests/tests.rs index 825d1d5..35ecf8a 100644 --- a/ssz/tests/tests.rs +++ b/ssz/tests/tests.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Address, B256, U128}; +use alloy_primitives::{Address, B256, U128, U256}; use ssz::{Decode, DecodeError, Encode}; use ssz_derive::{Decode, Encode}; use std::num::NonZeroUsize; @@ -501,6 +501,28 @@ mod round_trip { ]; round_trip(data); } + + #[test] + fn alloy_u256() { + let data = vec![ + U256::from(0), + U256::MAX, + U256::from(u64::MAX), + U256::from(255), + ]; + round_trip(data); + } + + #[test] + fn vec_of_option_alloy_u256() { + let data = vec![ + vec![Some(U256::MAX), Some(U256::from(0)), None], + vec![None], + vec![], + vec![Some(U256::from(0))], + ]; + round_trip(data); + } } /// Decode tests that are expected to fail. From 06d9bcd1f0f36f38919496900c16d16e7f805ea5 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Wed, 14 Aug 2024 14:21:54 +1000 Subject: [PATCH 6/6] Bytes tests --- ssz/tests/tests.rs | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/ssz/tests/tests.rs b/ssz/tests/tests.rs index 35ecf8a..ec5b979 100644 --- a/ssz/tests/tests.rs +++ b/ssz/tests/tests.rs @@ -1,4 +1,4 @@ -use alloy_primitives::{Address, B256, U128, U256}; +use alloy_primitives::{Address, Bytes, B256, U128, U256}; use ssz::{Decode, DecodeError, Encode}; use ssz_derive::{Decode, Encode}; use std::num::NonZeroUsize; @@ -503,7 +503,7 @@ mod round_trip { } #[test] - fn alloy_u256() { + fn u256() { let data = vec![ U256::from(0), U256::MAX, @@ -514,7 +514,7 @@ mod round_trip { } #[test] - fn vec_of_option_alloy_u256() { + fn vec_of_option_u256() { let data = vec![ vec![Some(U256::MAX), Some(U256::from(0)), None], vec![None], @@ -523,6 +523,23 @@ mod round_trip { ]; round_trip(data); } + + #[test] + fn alloy_bytes() { + let data = vec![ + Bytes::new(), + Bytes::from_static(&[1, 2, 3]), + Bytes::from_static(&[0; 32]), + Bytes::from_static(&[0]), + ]; + round_trip(data); + } + + #[test] + fn tuple_option() { + let data = vec![(48u8, Some(0u64)), (0u8, None), (u8::MAX, Some(u64::MAX))]; + round_trip(data); + } } /// Decode tests that are expected to fail.