Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove From [u8; n] impl for uint types #859

Merged
merged 6 commits into from
Sep 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ethereum-types/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog].
[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/

## [Unreleased]
### Breaking
- Updated `uint` to 0.10. [#859](https://github.com/paritytech/parity-common/pull/859)

## [0.14.1] - 2022-11-29
- Added `if_ethbloom` conditional macro. [#682](https://github.com/paritytech/parity-common/pull/682)
Expand Down
4 changes: 2 additions & 2 deletions ethereum-types/src/hash.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,12 +74,12 @@ macro_rules! impl_uint_conversions {

fn from_uint(value: &$uint) -> Self {
let mut ret = $hash::zero();
value.to_big_endian(ret.as_bytes_mut());
value.write_as_big_endian(ret.as_bytes_mut());
ret
}

fn into_uint(&self) -> $uint {
$uint::from(self.as_ref() as &[u8])
$uint::from_big_endian(self.as_ref() as &[u8])
}
}
};
Expand Down
4 changes: 2 additions & 2 deletions ethereum-types/src/uint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ mod tests {
#[test]
fn fixed_arrays_roundtrip() {
let raw: U256 = "7094875209347850239487502394881".into();
let array: [u8; 32] = raw.into();
let new_raw = array.into();
let array: [u8; 32] = raw.to_big_endian();
let new_raw = U256::from_big_endian(&array);

assert_eq!(raw, new_raw);
}
Expand Down
2 changes: 2 additions & 0 deletions primitive-types/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog].
[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/

## [Unreleased]
### Breaking
- Updated `uint` to 0.10. [#859](https://github.com/paritytech/parity-common/pull/859)

## [0.12.2] - 2023-10-10
- Added `schemars` support via `json-schema` feature. [#785](https://github.com/paritytech/parity-common/pull/785)
Expand Down
3 changes: 1 addition & 2 deletions primitive-types/impls/codec/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ macro_rules! impl_uint_codec {
($name: ident, $len: expr) => {
impl $crate::codec::Encode for $name {
fn using_encoded<R, F: FnOnce(&[u8]) -> R>(&self, f: F) -> R {
let mut bytes = [0u8; $len * 8];
self.to_little_endian(&mut bytes);
let bytes = self.to_little_endian();
bytes.using_encoded(f)
}
}
Expand Down
5 changes: 2 additions & 3 deletions primitive-types/impls/rlp/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ macro_rules! impl_uint_rlp {
impl $crate::rlp::Encodable for $name {
fn rlp_append(&self, s: &mut $crate::rlp::RlpStream) {
let leading_empty_bytes = $size * 8 - (self.bits() + 7) / 8;
let mut buffer = [0u8; $size * 8];
self.to_big_endian(&mut buffer);
let buffer = self.to_big_endian();
s.encoder().encode_value(&buffer[leading_empty_bytes..]);
}
}
Expand All @@ -35,7 +34,7 @@ macro_rules! impl_uint_rlp {
if !bytes.is_empty() && bytes[0] == 0 {
Err($crate::rlp::DecoderError::RlpInvalidIndirection)
} else if bytes.len() <= $size * 8 {
Ok($name::from(bytes))
Ok($name::from_big_endian(bytes))
} else {
Err($crate::rlp::DecoderError::RlpIsTooBig)
}
Expand Down
4 changes: 4 additions & 0 deletions primitive-types/impls/serde/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ The format is based on [Keep a Changelog].

[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/

## [Unreleased]
### Breaking
- Updated `uint` to 0.10. [#859](https://github.com/paritytech/parity-common/pull/859)

## [0.4.0] - 2022-09-02
- Support deserializing H256 et al from bytes or sequences of bytes, too. [#668](https://github.com/paritytech/parity-common/pull/668)
- Support deserializing H256 et al from newtype structs containing anything compatible, too. [#672](https://github.com/paritytech/parity-common/pull/672)
Expand Down
5 changes: 2 additions & 3 deletions primitive-types/impls/serde/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@ macro_rules! impl_uint_serde {
S: $crate::serde::Serializer,
{
let mut slice = [0u8; 2 + 2 * $len * 8];
let mut bytes = [0u8; $len * 8];
self.to_big_endian(&mut bytes);
let bytes = self.to_big_endian();
$crate::serialize::serialize_uint(&mut slice, &bytes, serializer)
}
}
Expand All @@ -48,7 +47,7 @@ macro_rules! impl_uint_serde {
deserializer,
$crate::serialize::ExpectedLen::Between(0, &mut bytes),
)?;
Ok(bytes[0..wrote].into())
Ok(Self::from_big_endian(&bytes[0..wrote]))
}
}
};
Expand Down
4 changes: 2 additions & 2 deletions rlp/tests/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ fn encode_u256() {
ETestPair::from((U256::from(0x0100_0000_u64), hex!("8401000000"))),
ETestPair::from((U256::from(0xffff_ffff_u64), hex!("84ffffffff"))),
ETestPair::from((
hex!(" 8090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0").into(),
U256::from_big_endian(&hex!(" 8090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0")),
hex!("a08090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0"),
)),
];
Expand Down Expand Up @@ -482,7 +482,7 @@ fn decode_untrusted_u256() {
DTestPair::from((U256::from(0x0100_0000_u64), hex!("8401000000"))),
DTestPair::from((U256::from(0xffff_ffff_u64), hex!("84ffffffff"))),
DTestPair::from((
hex!(" 8090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0").into(),
U256::from_big_endian(&hex!(" 8090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0")),
hex!("a08090a0b0c0d0e0f00910203040506077000000000000000100000000000012f0"),
)),
];
Expand Down
2 changes: 2 additions & 0 deletions uint/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ The format is based on [Keep a Changelog].
[Keep a Changelog]: http://keepachangelog.com/en/1.0.0/

## [Unreleased]
### Breaking
- Removed From<[u8; n]> conversions, renamed `to_big_endian` / `to_little_endian` to write_as_*, and made them return byte arrays. [#859](https://github.com/paritytech/parity-common/pull/859)

## [0.9.5] - 2022-11-29
- Implemented bitwise assign traits. [#690](https://github.com/paritytech/parity-common/pull/690)
Expand Down
7 changes: 3 additions & 4 deletions uint/benches/bigint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,7 @@ criterion_group!(
criterion_main!(bigint);

fn to_biguint(x: U256) -> BigUint {
let mut bytes = [0u8; 32];
x.to_little_endian(&mut bytes);
let bytes = x.to_little_endian();
BigUint::from_bytes_le(&bytes)
}

Expand Down Expand Up @@ -662,8 +661,8 @@ fn from_fixed_array(c: &mut Criterion) {
[255, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 213, 0, 0, 0, 0, 0, 0];
c.bench_function("from_fixed_array", move |b| {
b.iter(|| {
let _: U512 = black_box(black_box(ary512).into());
let _: U256 = black_box(black_box(ary256).into());
let _: U512 = black_box(U512::from_big_endian(black_box(&ary512)));
let _: U256 = black_box(U256::from_big_endian(black_box(&ary256)));
})
});
}
Expand Down
55 changes: 21 additions & 34 deletions uint/src/uint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -743,19 +743,34 @@ macro_rules! construct_uint {
(arr[index / 8] >> (((index % 8)) * 8)) as u8
}

/// Convert to big-endian bytes.
#[inline]
pub fn to_big_endian(&self) -> [u8; $n_words * 8] {
let mut bytes = [0u8; $n_words * 8];
self.write_as_big_endian(&mut bytes);
bytes
}

/// Write to the slice in big-endian format.
#[inline]
pub fn to_big_endian(&self, bytes: &mut [u8]) {
pub fn write_as_big_endian(&self, bytes: &mut [u8]) {
use $crate::byteorder::{ByteOrder, BigEndian};
debug_assert!($n_words * 8 == bytes.len());
for i in 0..$n_words {
BigEndian::write_u64(&mut bytes[8 * i..], self.0[$n_words - i - 1]);
}
}

/// Write to the slice in little-endian format.
/// Convert to little-endian bytes.
#[inline]
pub fn to_little_endian(&self, bytes: &mut [u8]) {
pub fn to_little_endian(&self) -> [u8; $n_words * 8] {
let mut bytes = [0u8; $n_words * 8];
self.write_as_little_endian(&mut bytes);
bytes
}

#[inline]
pub fn write_as_little_endian(&self, bytes: &mut [u8]) {
use $crate::byteorder::{ByteOrder, LittleEndian};
debug_assert!($n_words * 8 == bytes.len());
for i in 0..$n_words {
Expand Down Expand Up @@ -1307,26 +1322,6 @@ macro_rules! construct_uint {
}
}

impl $crate::core_::convert::From<$name> for [u8; $n_words * 8] {
fn from(number: $name) -> Self {
let mut arr = [0u8; $n_words * 8];
number.to_big_endian(&mut arr);
arr
}
}

impl $crate::core_::convert::From<[u8; $n_words * 8]> for $name {
fn from(bytes: [u8; $n_words * 8]) -> Self {
Self::from(&bytes)
}
}

impl<'a> $crate::core_::convert::From<&'a [u8; $n_words * 8]> for $name {
fn from(bytes: &[u8; $n_words * 8]) -> Self {
Self::from(&bytes[..])
}
}

impl $crate::core_::default::Default for $name {
fn default() -> Self {
$name::zero()
Expand Down Expand Up @@ -1360,13 +1355,6 @@ macro_rules! construct_uint {
$crate::impl_map_from!($name, i32, i64);
$crate::impl_map_from!($name, isize, i64);

// Converts from big endian representation.
impl<'a> $crate::core_::convert::From<&'a [u8]> for $name {
fn from(bytes: &[u8]) -> $name {
Self::from_big_endian(bytes)
}
}

$crate::impl_try_from_for_primitive!($name, u8);
$crate::impl_try_from_for_primitive!($name, u16);
$crate::impl_try_from_for_primitive!($name, u32);
Expand Down Expand Up @@ -1736,8 +1724,7 @@ macro_rules! construct_uint {
$crate::hex::decode_to_slice(encoded, out).map_err(Self::Err::from)?;
}

let bytes_ref: &[u8] = &bytes;
Ok(From::from(bytes_ref))
Ok(Self::from_big_endian(&bytes))
}
}

Expand Down Expand Up @@ -1787,7 +1774,7 @@ macro_rules! impl_quickcheck_arbitrary_for_uint {
}
});

res.as_ref().into()
Self::from_big_endian(res.as_ref())
}
}
};
Expand All @@ -1809,7 +1796,7 @@ macro_rules! impl_arbitrary_for_uint {
fn arbitrary(u: &mut $crate::arbitrary::Unstructured<'_>) -> $crate::arbitrary::Result<Self> {
let mut res = [0u8; $n_bytes];
u.fill_buffer(&mut res)?;
Ok(Self::from(res))
Ok(Self::from_big_endian(&res))
}
}
};
Expand Down
Loading
Loading