Merge remote-tracking branch 'origin/unstable' into tree-states

This commit is contained in:
Michael Sproul
2022-09-22 10:13:02 +10:00
38 changed files with 1118 additions and 223 deletions

View File

@@ -29,11 +29,18 @@ pub trait TryFromIter<T>: Sized {
impl<T> TryFromIter<T> for Vec<T> {
type Error = Infallible;
fn try_from_iter<I>(iter: I) -> Result<Self, Self::Error>
fn try_from_iter<I>(values: I) -> Result<Self, Self::Error>
where
I: IntoIterator<Item = T>,
{
Ok(Self::from_iter(iter))
// Pre-allocate the expected size of the Vec, which is parsed from the SSZ input bytes as
// `num_items`. This length has already been checked to be less than or equal to the type's
// maximum length in `decode_list_of_variable_length_items`.
let iter = values.into_iter();
let (_, opt_max_len) = iter.size_hint();
let mut vec = Vec::with_capacity(opt_max_len.unwrap_or(0));
vec.extend(iter);
Ok(vec)
}
}

View File

@@ -1,6 +1,5 @@
use super::*;
use ethereum_types::{H160, H256, U128, U256};
use smallvec::{smallvec, ToSmallVec};
fn int_to_hash256(int: u64) -> Hash256 {
let mut bytes = [0; HASHSIZE];
@@ -16,7 +15,7 @@ macro_rules! impl_for_bitsize {
}
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
self.to_le_bytes().to_smallvec()
PackedEncoding::from_slice(&self.to_le_bytes())
}
fn tree_hash_packing_factor() -> usize {
@@ -89,9 +88,9 @@ impl TreeHash for U128 {
}
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
let mut result = smallvec![0; 16];
let mut result = [0; 16];
self.to_little_endian(&mut result);
result
PackedEncoding::from_slice(&result)
}
fn tree_hash_packing_factor() -> usize {
@@ -111,9 +110,9 @@ impl TreeHash for U256 {
}
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
let mut result = smallvec![0; 32];
let mut result = [0; 32];
self.to_little_endian(&mut result);
result
PackedEncoding::from_slice(&result)
}
fn tree_hash_packing_factor() -> usize {
@@ -133,9 +132,9 @@ impl TreeHash for H160 {
}
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
let mut result = smallvec![0; 32];
let mut result = [0; 32];
result[0..20].copy_from_slice(self.as_bytes());
result
PackedEncoding::from_slice(&result)
}
fn tree_hash_packing_factor() -> usize {
@@ -155,7 +154,7 @@ impl TreeHash for H256 {
}
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
self.as_bytes().to_smallvec()
PackedEncoding::from_slice(self.as_bytes())
}
fn tree_hash_packing_factor() -> usize {

View File

@@ -14,9 +14,10 @@ pub const BYTES_PER_CHUNK: usize = 32;
pub const HASHSIZE: usize = 32;
pub const MERKLE_HASH_CHUNK: usize = 2 * BYTES_PER_CHUNK;
pub const MAX_UNION_SELECTOR: u8 = 127;
pub const SMALLVEC_SIZE: usize = 32;
pub type Hash256 = ethereum_types::H256;
pub type PackedEncoding = SmallVec<[u8; BYTES_PER_CHUNK]>;
pub type PackedEncoding = SmallVec<[u8; SMALLVEC_SIZE]>;
/// Convenience method for `MerkleHasher` which also provides some fast-paths for small trees.
///

View File

@@ -1,5 +1,5 @@
use ssz_derive::Encode;
use tree_hash::{Hash256, MerkleHasher, TreeHash, BYTES_PER_CHUNK};
use tree_hash::{Hash256, MerkleHasher, PackedEncoding, TreeHash, BYTES_PER_CHUNK};
use tree_hash_derive::TreeHash;
#[derive(Encode)]
@@ -18,7 +18,7 @@ impl tree_hash::TreeHash for HashVec {
tree_hash::TreeHashType::List
}
fn tree_hash_packed_encoding(&self) -> tree_hash::PackedEncoding {
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
unreachable!("List should never be packed.")
}

View File

@@ -66,6 +66,8 @@ pub struct BeaconBlock<T: EthSpec, Payload: ExecPayload<T> = FullPayload<T>> {
pub body: BeaconBlockBodyMerge<T, Payload>,
}
pub type BlindedBeaconBlock<E> = BeaconBlock<E, BlindedPayload<E>>;
impl<T: EthSpec, Payload: ExecPayload<T>> SignedRoot for BeaconBlock<T, Payload> {}
impl<'a, T: EthSpec, Payload: ExecPayload<T>> SignedRoot for BeaconBlockRef<'a, T, Payload> {}

View File

@@ -7,7 +7,7 @@ use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer};
use ssz::{Decode, DecodeError, Encode};
use std::fmt;
use std::str::FromStr;
use tree_hash::TreeHash;
use tree_hash::{PackedEncoding, TreeHash};
pub const GRAFFITI_BYTES_LEN: usize = 32;
@@ -159,7 +159,7 @@ impl TreeHash for Graffiti {
<[u8; GRAFFITI_BYTES_LEN]>::tree_hash_type()
}
fn tree_hash_packed_encoding(&self) -> tree_hash::PackedEncoding {
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
self.0.tree_hash_packed_encoding()
}

View File

@@ -98,7 +98,7 @@ pub use crate::attestation_duty::AttestationDuty;
pub use crate::attester_slashing::AttesterSlashing;
pub use crate::beacon_block::{
BeaconBlock, BeaconBlockAltair, BeaconBlockBase, BeaconBlockMerge, BeaconBlockRef,
BeaconBlockRefMut,
BeaconBlockRefMut, BlindedBeaconBlock,
};
pub use crate::beacon_block_body::{
BeaconBlockBody, BeaconBlockBodyAltair, BeaconBlockBodyBase, BeaconBlockBodyMerge,

View File

@@ -3,7 +3,7 @@ use safe_arith::{ArithError, SafeArith};
use serde_derive::{Deserialize, Serialize};
use ssz::{Decode, DecodeError, Encode};
use test_random_derive::TestRandom;
use tree_hash::{TreeHash, TreeHashType};
use tree_hash::{PackedEncoding, TreeHash, TreeHashType};
#[derive(Debug, Default, Clone, Copy, PartialEq, Deserialize, Serialize, TestRandom)]
#[serde(transparent)]
@@ -78,7 +78,7 @@ impl TreeHash for ParticipationFlags {
u8::tree_hash_type()
}
fn tree_hash_packed_encoding(&self) -> tree_hash::PackedEncoding {
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
self.bits.tree_hash_packed_encoding()
}

View File

@@ -7,7 +7,7 @@ use std::convert::TryFrom;
use std::fmt::Debug;
use std::hash::Hash;
use test_random_derive::TestRandom;
use tree_hash::TreeHash;
use tree_hash::{PackedEncoding, TreeHash};
#[derive(Debug)]
pub enum BlockType {
@@ -175,7 +175,7 @@ impl<T: EthSpec> TreeHash for BlindedPayload<T> {
<ExecutionPayloadHeader<T>>::tree_hash_type()
}
fn tree_hash_packed_encoding(&self) -> tree_hash::PackedEncoding {
fn tree_hash_packed_encoding(&self) -> PackedEncoding {
self.execution_payload_header.tree_hash_packed_encoding()
}