Add syntax to more types

This commit is contained in:
Mac L
2024-05-01 13:09:42 +10:00
parent 5c80d92b22
commit 2bac4b8a19
18 changed files with 181 additions and 75 deletions

2
Cargo.lock generated
View File

@@ -7906,7 +7906,7 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
[[package]]
name = "superstruct"
version = "0.7.0"
source = "git+https://github.com/sigp/superstruct?branch=features#06132f875603d2985a414e6e3683c42bc9505f49"
source = "git+https://github.com/sigp/superstruct?branch=features#822403d4d415c181aa7f4765e118606c6772dc58"
dependencies = [
"darling",
"itertools",

View File

@@ -0,0 +1,2 @@
// Dummy build.rs file to enable OUT_DIR usage by superstruct
fn main() {}

View File

@@ -45,8 +45,8 @@ pub fn calculate_execution_block_hash<E: EthSpec>(
KECCAK_EMPTY_LIST_RLP.as_fixed_bytes().into(),
rlp_transactions_root,
rlp_withdrawals_root,
rlp_blob_gas_used,
rlp_excess_blob_gas,
rlp_blob_gas_used.copied(),
rlp_excess_blob_gas.copied(),
parent_beacon_block_root,
);

View File

@@ -27,7 +27,7 @@ pub use types::{
use types::{
ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadElectra, ExecutionPayloadMerge,
KzgProofs,
FeatureName, KzgProofs,
};
pub mod auth;
@@ -155,7 +155,15 @@ pub struct ExecutionBlock {
/// Representation of an execution block with enough detail to reconstruct a payload.
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(Clone, Debug, PartialEq, Serialize, Deserialize,),
serde(bound = "E: EthSpec", rename_all = "camelCase"),
@@ -189,12 +197,12 @@ pub struct ExecutionBlockWithTransactions<E: EthSpec> {
#[serde(rename = "hash")]
pub block_hash: ExecutionBlockHash,
pub transactions: Vec<Transaction>,
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
pub withdrawals: Vec<JsonWithdrawal>,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::u64_hex_be")]
pub blob_gas_used: u64,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::u64_hex_be")]
pub excess_blob_gas: u64,
}
@@ -423,7 +431,15 @@ pub struct ProposeBlindedBlockResponse {
}
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(derive(Clone, Debug, PartialEq),),
map_into(ExecutionPayload),
map_ref_into(ExecutionPayloadRef),
@@ -441,9 +457,9 @@ pub struct GetPayloadResponse<E: EthSpec> {
#[superstruct(only(Electra), partial_getter(rename = "execution_payload_electra"))]
pub execution_payload: ExecutionPayloadElectra<E>,
pub block_value: Uint256,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
pub blobs_bundle: BlobsBundle<E>,
#[superstruct(only(Deneb, Electra), partial_getter(copy))]
#[superstruct(feature(Deneb), partial_getter(copy))]
pub should_override_builder: bool,
}

View File

@@ -5,14 +5,22 @@ use state_processing::per_block_processing::deneb::kzg_commitment_to_versioned_h
use superstruct::superstruct;
use types::{
BeaconBlockRef, BeaconStateError, EthSpec, ExecutionBlockHash, ExecutionPayload,
ExecutionPayloadRef, Hash256, VersionedHash,
ExecutionPayloadRef, FeatureName, ForkName, Hash256, VersionedHash,
};
use types::{
ExecutionPayloadCapella, ExecutionPayloadDeneb, ExecutionPayloadElectra, ExecutionPayloadMerge,
};
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(derive(Clone, Debug, PartialEq),),
map_into(ExecutionPayload),
map_ref_into(ExecutionPayloadRef),
@@ -35,9 +43,9 @@ pub struct NewPayloadRequest<'block, E: EthSpec> {
pub execution_payload: &'block ExecutionPayloadDeneb<E>,
#[superstruct(only(Electra), partial_getter(rename = "execution_payload_electra"))]
pub execution_payload: &'block ExecutionPayloadElectra<E>,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
pub versioned_hashes: Vec<VersionedHash>,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
pub parent_beacon_block_root: Hash256,
}

View File

@@ -0,0 +1,2 @@
// Dummy build.rs file to enable OUT_DIR usage by superstruct
fn main() {}

View File

@@ -14,7 +14,14 @@ use types::*;
///
/// Utilises lazy-loading from separate storage for its vector fields.
#[superstruct(
variants(Base, Altair, Merge, Capella, Deneb, Electra),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(derive(Debug, PartialEq, Clone, Encode, Decode))
)]
#[derive(Debug, PartialEq, Clone, Encode)]
@@ -66,9 +73,9 @@ where
pub current_epoch_attestations: VariableList<PendingAttestation<E>, E::MaxPendingAttestations>,
// Participation (Altair and later)
#[superstruct(only(Altair, Merge, Capella, Deneb, Electra))]
#[superstruct(feature(Altair))]
pub previous_epoch_participation: VariableList<ParticipationFlags, E::ValidatorRegistryLimit>,
#[superstruct(only(Altair, Merge, Capella, Deneb, Electra))]
#[superstruct(feature(Altair))]
pub current_epoch_participation: VariableList<ParticipationFlags, E::ValidatorRegistryLimit>,
// Finality
@@ -78,13 +85,13 @@ where
pub finalized_checkpoint: Checkpoint,
// Inactivity
#[superstruct(only(Altair, Merge, Capella, Deneb, Electra))]
#[superstruct(feature(Altair))]
pub inactivity_scores: VariableList<u64, E::ValidatorRegistryLimit>,
// Light-client sync committees
#[superstruct(only(Altair, Merge, Capella, Deneb, Electra))]
#[superstruct(feature(Altair))]
pub current_sync_committee: Arc<SyncCommittee<E>>,
#[superstruct(only(Altair, Merge, Capella, Deneb, Electra))]
#[superstruct(feature(Altair))]
pub next_sync_committee: Arc<SyncCommittee<E>>,
// Execution
@@ -110,13 +117,13 @@ where
pub latest_execution_payload_header: ExecutionPayloadHeaderElectra<E>,
// Capella
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
pub next_withdrawal_index: u64,
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
pub next_withdrawal_validator_index: u64,
#[ssz(skip_serializing, skip_deserializing)]
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
pub historical_summaries: Option<VariableList<HistoricalSummary, E::HistoricalRootsLimit>>,
}

View File

@@ -12,7 +12,14 @@ use tree_hash_derive::TreeHash;
/// A block of the `BeaconChain`.
#[superstruct(
variants(Base, Altair, Merge, Capella, Deneb, Electra),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name_unchecked"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Debug,

View File

@@ -31,6 +31,12 @@ pub const BLOB_KZG_COMMITMENTS_INDEX: usize = 11;
#[superstruct(
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Debug,

View File

@@ -196,6 +196,12 @@ impl From<BeaconStateHash> for Hash256 {
#[superstruct(
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name_unchecked"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Derivative,
@@ -475,16 +481,16 @@ impl<E: EthSpec> BeaconState<E> {
/// Returns the name of the fork pertaining to `self`.
///
/// Does not check if `self` is consistent with the fork dictated by `self.slot()`.
pub fn fork_name_unchecked(&self) -> ForkName {
match self {
BeaconState::Base { .. } => ForkName::Base,
BeaconState::Altair { .. } => ForkName::Altair,
BeaconState::Merge { .. } => ForkName::Merge,
BeaconState::Capella { .. } => ForkName::Capella,
BeaconState::Deneb { .. } => ForkName::Deneb,
BeaconState::Electra { .. } => ForkName::Electra,
}
}
//pub fn fork_name_unchecked(&self) -> ForkName {
// match self {
// BeaconState::Base { .. } => ForkName::Base,
// BeaconState::Altair { .. } => ForkName::Altair,
// BeaconState::Merge { .. } => ForkName::Merge,
// BeaconState::Capella { .. } => ForkName::Capella,
// BeaconState::Deneb { .. } => ForkName::Deneb,
// BeaconState::Electra { .. } => ForkName::Electra,
// }
//}
/// Specialised deserialisation method that uses the `ChainSpec` as context.
#[allow(clippy::arithmetic_side_effects)]

View File

@@ -2,7 +2,8 @@ use crate::beacon_block_body::KzgCommitments;
use crate::{
ChainSpec, EthSpec, ExecutionPayloadHeaderCapella, ExecutionPayloadHeaderDeneb,
ExecutionPayloadHeaderElectra, ExecutionPayloadHeaderMerge, ExecutionPayloadHeaderRef,
ExecutionPayloadHeaderRefMut, ForkName, ForkVersionDeserialize, SignedRoot, Uint256,
ExecutionPayloadHeaderRefMut, FeatureName, ForkName, ForkVersionDeserialize, SignedRoot,
Uint256,
};
use bls::PublicKeyBytes;
use bls::Signature;
@@ -11,7 +12,15 @@ use superstruct::superstruct;
use tree_hash_derive::TreeHash;
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(PartialEq, Debug, Serialize, Deserialize, TreeHash, Clone),
serde(bound = "E: EthSpec", deny_unknown_fields)
@@ -31,7 +40,7 @@ pub struct BuilderBid<E: EthSpec> {
pub header: ExecutionPayloadHeaderDeneb<E>,
#[superstruct(only(Electra), partial_getter(rename = "header_electra"))]
pub header: ExecutionPayloadHeaderElectra<E>,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
pub blob_kzg_commitments: KzgCommitments<E>,
#[serde(with = "serde_utils::quoted_u256")]
pub value: Uint256,

View File

@@ -1,6 +1,6 @@
use crate::{
consts::altair, AltairPreset, BasePreset, BellatrixPreset, CapellaPreset, ChainSpec, Config,
DenebPreset, ElectraPreset, EthSpec, ForkName,
DenebPreset, ElectraPreset, EthSpec, FeatureName, ForkName,
};
use maplit::hashmap;
use serde::{Deserialize, Serialize};
@@ -12,7 +12,15 @@ use superstruct::superstruct;
///
/// Mostly useful for the API.
#[superstruct(
variants(Capella, Deneb, Electra),
feature(Capella),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(derive(Serialize, Deserialize, Debug, PartialEq, Clone))
)]
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
@@ -29,10 +37,10 @@ pub struct ConfigAndPreset {
pub bellatrix_preset: BellatrixPreset,
#[serde(flatten)]
pub capella_preset: CapellaPreset,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
#[serde(flatten)]
pub deneb_preset: DenebPreset,
#[superstruct(only(Electra))]
#[superstruct(feature(Electra))]
#[serde(flatten)]
pub electra_preset: ElectraPreset,
/// The `extra_fields` map allows us to gracefully decode fields intended for future hard forks.

View File

@@ -15,7 +15,16 @@ pub type Transactions<E> = VariableList<
pub type Withdrawals<E> = VariableList<Withdrawal, <E as EthSpec>::MaxWithdrawalsPerPayload>;
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
//variants(Merge, Capella, Deneb, Electra),
variant_attributes(
derive(
Default,
@@ -81,12 +90,12 @@ pub struct ExecutionPayload<E: EthSpec> {
pub block_hash: ExecutionBlockHash,
#[serde(with = "ssz_types::serde_utils::list_of_hex_var_list")]
pub transactions: Transactions<E>,
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
pub withdrawals: Withdrawals<E>,
#[superstruct(only(Deneb, Electra), partial_getter(copy))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::quoted_u64")]
pub blob_gas_used: u64,
#[superstruct(only(Deneb, Electra), partial_getter(copy))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::quoted_u64")]
pub excess_blob_gas: u64,
}
@@ -189,13 +198,13 @@ impl<E: EthSpec> ForkVersionDeserialize for ExecutionPayload<E> {
}
}
impl<E: EthSpec> ExecutionPayload<E> {
pub fn fork_name(&self) -> ForkName {
match self {
ExecutionPayload::Merge(_) => ForkName::Merge,
ExecutionPayload::Capella(_) => ForkName::Capella,
ExecutionPayload::Deneb(_) => ForkName::Deneb,
ExecutionPayload::Electra(_) => ForkName::Electra,
}
}
}
//impl<E: EthSpec> ExecutionPayload<E> {
// pub fn fork_name(&self) -> ForkName {
// match self {
// ExecutionPayload::Merge(_) => ForkName::Merge,
// ExecutionPayload::Capella(_) => ForkName::Capella,
// ExecutionPayload::Deneb(_) => ForkName::Deneb,
// ExecutionPayload::Electra(_) => ForkName::Electra,
// }
// }
//}

View File

@@ -8,7 +8,15 @@ use tree_hash::TreeHash;
use tree_hash_derive::TreeHash;
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Default,
@@ -76,14 +84,14 @@ pub struct ExecutionPayloadHeader<E: EthSpec> {
pub block_hash: ExecutionBlockHash,
#[superstruct(getter(copy))]
pub transactions_root: Hash256,
#[superstruct(only(Capella, Deneb, Electra))]
#[superstruct(feature(Capella))]
#[superstruct(getter(copy))]
pub withdrawals_root: Hash256,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::quoted_u64")]
#[superstruct(getter(copy))]
pub blob_gas_used: u64,
#[superstruct(only(Deneb, Electra))]
#[superstruct(feature(Deneb))]
#[serde(with = "serde_utils::quoted_u64")]
#[superstruct(getter(copy))]
pub excess_blob_gas: u64,

View File

@@ -3,6 +3,7 @@
//
// For now, older Forks have a single "super-feature" which contains all features associated with
// that Fork. It may be worth splitting these up at a later time.
#[derive(PartialEq)]
pub enum FeatureName {
// Altair.
Altair,
@@ -13,13 +14,5 @@ pub enum FeatureName {
// Deneb.
Deneb,
// Electra.
//
// Supply deposits on chain.
EIP6110,
// EL triggerable exits.
EIP7002,
// Increase MAX_EFFECTIVE_BALANCE.
EIP7251,
// Committee index outside Attestation.
EIP7549,
Electra,
}

View File

@@ -8,7 +8,7 @@ pub const FORK_ORDER: &[(ForkName, &[FeatureName])] = &[
(ForkName::Merge, &[FeatureName::Merge]),
(ForkName::Capella, &[FeatureName::Capella]),
(ForkName::Deneb, &[FeatureName::Deneb]),
(ForkName::Electra, &[]),
(ForkName::Electra, &[FeatureName::Electra]),
];
#[superstruct(feature_dependencies_decl = "FEATURE_DEPENDENCIES")]
@@ -17,6 +17,7 @@ pub const FEATURE_DEPENDENCIES: &[(FeatureName, &[FeatureName])] = &[
(FeatureName::Merge, &[FeatureName::Altair]),
(FeatureName::Capella, &[FeatureName::Merge]),
(FeatureName::Deneb, &[FeatureName::Capella]),
(FeatureName::Electra, &[FeatureName::Deneb]),
];
#[cfg(test)]

View File

@@ -1,5 +1,4 @@
use crate::ChainSpec;
use crate::ForkName;
use crate::ForkVersionDeserialize;
use crate::{light_client_update::*, BeaconBlockBody};
use crate::{
@@ -7,6 +6,7 @@ use crate::{
FixedVector, Hash256, SignedBeaconBlock,
};
use crate::{BeaconBlockHeader, ExecutionPayloadHeader};
use crate::{FeatureName, ForkName};
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use ssz::Decode;
@@ -17,7 +17,15 @@ use test_random_derive::TestRandom;
use tree_hash_derive::TreeHash;
#[superstruct(
variants(Altair, Capella, Deneb),
feature(Altair),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Debug,
@@ -55,7 +63,7 @@ pub struct LightClientHeader<E: EthSpec> {
#[superstruct(only(Deneb), partial_getter(rename = "execution_payload_header_deneb"))]
pub execution: ExecutionPayloadHeaderDeneb<E>,
#[superstruct(only(Capella, Deneb))]
#[superstruct(feature(Capella))]
pub execution_branch: FixedVector<Hash256, ExecutionPayloadProofLen>,
#[ssz(skip_serializing, skip_deserializing)]

View File

@@ -110,7 +110,15 @@ pub trait AbstractExecPayload<E: EthSpec>:
}
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Debug,
@@ -442,7 +450,15 @@ impl<E: EthSpec> TryFrom<ExecutionPayloadHeader<E>> for FullPayload<E> {
}
#[superstruct(
variants(Merge, Capella, Deneb, Electra),
feature(Merge),
variants_and_features_from = "FORK_ORDER",
feature_dependencies = "FEATURE_DEPENDENCIES",
variant_type(name = "ForkName", getter = "fork_name"),
feature_type(
name = "FeatureName",
list = "list_all_features",
check = "is_feature_enabled"
),
variant_attributes(
derive(
Debug,