Skip to content

Commit

Permalink
Electra: Add Presets, Constants, & Config
Browse files Browse the repository at this point in the history
  • Loading branch information
ethDreamer committed Apr 18, 2024
1 parent 5c30afb commit 14ae684
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 9 deletions.
93 changes: 92 additions & 1 deletion consensus/types/src/chain_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ pub enum Domain {
SyncCommittee,
ContributionAndProof,
SyncCommitteeSelectionProof,
Consolidation,
ApplicationMask(ApplicationDomain),
}

Expand Down Expand Up @@ -76,6 +77,7 @@ pub struct ChainSpec {
pub genesis_fork_version: [u8; 4],
pub bls_withdrawal_prefix_byte: u8,
pub eth1_address_withdrawal_prefix_byte: u8,
pub compounding_withdrawal_prefix_byte: u8,

/*
* Time parameters
Expand Down Expand Up @@ -108,6 +110,7 @@ pub struct ChainSpec {
pub(crate) domain_voluntary_exit: u32,
pub(crate) domain_selection_proof: u32,
pub(crate) domain_aggregate_and_proof: u32,
pub(crate) domain_consolidation: u32,

/*
* Fork choice
Expand Down Expand Up @@ -177,6 +180,15 @@ pub struct ChainSpec {
pub electra_fork_version: [u8; 4],
/// The Electra fork epoch is optional, with `None` representing "Electra never happens".
pub electra_fork_epoch: Option<Epoch>,
pub unset_deposit_receipts_start_index: u64,
pub full_exit_request_amount: u64,
pub min_activation_balance: u64,
pub max_effective_balance_electra: u64,
pub min_slashing_penalty_quotient_electra: u64,
pub whistleblower_reward_quotient_electra: u64,
pub max_pending_partials_per_withdrawals_sweep: u64,
pub min_per_epoch_churn_limit_electra: u64,
pub max_per_epoch_activation_exit_churn_limit: u64,

/*
* Networking
Expand Down Expand Up @@ -364,7 +376,9 @@ impl ChainSpec {
state: &BeaconState<E>,
) -> u64 {
let fork_name = state.fork_name_unchecked();
if fork_name >= ForkName::Merge {
if fork_name >= ForkName::Electra {
self.min_slashing_penalty_quotient_electra
} else if fork_name >= ForkName::Merge {
self.min_slashing_penalty_quotient_bellatrix
} else if fork_name >= ForkName::Altair {
self.min_slashing_penalty_quotient_altair
Expand Down Expand Up @@ -418,6 +432,7 @@ impl ChainSpec {
Domain::SyncCommitteeSelectionProof => self.domain_sync_committee_selection_proof,
Domain::ApplicationMask(application_domain) => application_domain.get_domain_constant(),
Domain::BlsToExecutionChange => self.domain_bls_to_execution_change,
Domain::Consolidation => self.domain_consolidation,
}
}

Expand Down Expand Up @@ -602,6 +617,7 @@ impl ChainSpec {
genesis_fork_version: [0; 4],
bls_withdrawal_prefix_byte: 0x00,
eth1_address_withdrawal_prefix_byte: 0x01,
compounding_withdrawal_prefix_byte: 0x02,

/*
* Time parameters
Expand Down Expand Up @@ -635,6 +651,7 @@ impl ChainSpec {
domain_voluntary_exit: 4,
domain_selection_proof: 5,
domain_aggregate_and_proof: 6,
domain_consolidation: 0x0B,

/*
* Fork choice
Expand Down Expand Up @@ -709,6 +726,30 @@ impl ChainSpec {
*/
electra_fork_version: [0x05, 00, 00, 00],
electra_fork_epoch: None,
unset_deposit_receipts_start_index: u64::MAX,
full_exit_request_amount: 0,
min_activation_balance: option_wrapper(|| {
u64::checked_pow(2, 5)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
max_effective_balance_electra: option_wrapper(|| {
u64::checked_pow(2, 11)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
min_slashing_penalty_quotient_electra: u64::checked_pow(2, 12)
.expect("pow does not overflow"),
whistleblower_reward_quotient_electra: u64::checked_pow(2, 12)
.expect("pow does not overflow"),
max_pending_partials_per_withdrawals_sweep: u64::checked_pow(2, 3)
.expect("pow does not overflow"),
min_per_epoch_churn_limit_electra: option_wrapper(|| {
u64::checked_pow(2, 7)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
max_per_epoch_activation_exit_churn_limit: option_wrapper(|| {
u64::checked_pow(2, 8)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),

/*
* Network specific
Expand Down Expand Up @@ -874,6 +915,7 @@ impl ChainSpec {
genesis_fork_version: [0x00, 0x00, 0x00, 0x64],
bls_withdrawal_prefix_byte: 0x00,
eth1_address_withdrawal_prefix_byte: 0x01,
compounding_withdrawal_prefix_byte: 0x02,

/*
* Time parameters
Expand Down Expand Up @@ -907,6 +949,7 @@ impl ChainSpec {
domain_voluntary_exit: 4,
domain_selection_proof: 5,
domain_aggregate_and_proof: 6,
domain_consolidation: 0x0B,

/*
* Fork choice
Expand Down Expand Up @@ -983,6 +1026,30 @@ impl ChainSpec {
*/
electra_fork_version: [0x05, 0x00, 0x00, 0x64],
electra_fork_epoch: None,
unset_deposit_receipts_start_index: u64::MAX,
full_exit_request_amount: 0,
min_activation_balance: option_wrapper(|| {
u64::checked_pow(2, 5)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
max_effective_balance_electra: option_wrapper(|| {
u64::checked_pow(2, 11)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
min_slashing_penalty_quotient_electra: u64::checked_pow(2, 12)
.expect("pow does not overflow"),
whistleblower_reward_quotient_electra: u64::checked_pow(2, 12)
.expect("pow does not overflow"),
max_pending_partials_per_withdrawals_sweep: u64::checked_pow(2, 3)
.expect("pow does not overflow"),
min_per_epoch_churn_limit_electra: option_wrapper(|| {
u64::checked_pow(2, 7)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),
max_per_epoch_activation_exit_churn_limit: option_wrapper(|| {
u64::checked_pow(2, 8)?.checked_mul(u64::checked_pow(10, 9)?)
})
.expect("calculation does not overflow"),

/*
* Network specific
Expand Down Expand Up @@ -1206,6 +1273,13 @@ pub struct Config {
#[serde(default = "default_blob_sidecar_subnet_count")]
#[serde(with = "serde_utils::quoted_u64")]
blob_sidecar_subnet_count: u64,

#[serde(default = "default_min_per_epoch_churn_limit_electra")]
#[serde(with = "serde_utils::quoted_u64")]
min_per_epoch_churn_limit_electra: u64,
#[serde(default = "default_max_per_epoch_activation_exit_churn_limit")]
#[serde(with = "serde_utils::quoted_u64")]
max_per_epoch_activation_exit_churn_limit: u64,
}

fn default_bellatrix_fork_version() -> [u8; 4] {
Expand Down Expand Up @@ -1320,6 +1394,14 @@ const fn default_blob_sidecar_subnet_count() -> u64 {
6
}

const fn default_min_per_epoch_churn_limit_electra() -> u64 {
128_000_000_000
}

const fn default_max_per_epoch_activation_exit_churn_limit() -> u64 {
256_000_000_000
}

const fn default_epochs_per_subnet_subscription() -> u64 {
256
}
Expand Down Expand Up @@ -1496,6 +1578,10 @@ impl Config {
max_request_blob_sidecars: spec.max_request_blob_sidecars,
min_epochs_for_blob_sidecars_requests: spec.min_epochs_for_blob_sidecars_requests,
blob_sidecar_subnet_count: spec.blob_sidecar_subnet_count,

min_per_epoch_churn_limit_electra: spec.min_per_epoch_churn_limit_electra,
max_per_epoch_activation_exit_churn_limit: spec
.max_per_epoch_activation_exit_churn_limit,
}
}

Expand Down Expand Up @@ -1563,6 +1649,8 @@ impl Config {
max_request_blob_sidecars,
min_epochs_for_blob_sidecars_requests,
blob_sidecar_subnet_count,
min_per_epoch_churn_limit_electra,
max_per_epoch_activation_exit_churn_limit,
} = self;

if preset_base != E::spec_name().to_string().as_str() {
Expand Down Expand Up @@ -1623,6 +1711,8 @@ impl Config {
max_request_blob_sidecars,
min_epochs_for_blob_sidecars_requests,
blob_sidecar_subnet_count,
min_per_epoch_churn_limit_electra,
max_per_epoch_activation_exit_churn_limit,

// We need to re-derive any values that might have changed in the config.
max_blocks_by_root_request: max_blocks_by_root_request_common(max_request_blocks),
Expand Down Expand Up @@ -1695,6 +1785,7 @@ mod tests {
&spec,
);
test_domain(Domain::SyncCommittee, spec.domain_sync_committee, &spec);
test_domain(Domain::Consolidation, spec.domain_consolidation, &spec);

// The builder domain index is zero
let builder_domain_pre_mask = [0; 4];
Expand Down
81 changes: 73 additions & 8 deletions consensus/types/src/eth_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ use crate::*;
use safe_arith::SafeArith;
use serde::{Deserialize, Serialize};
use ssz_types::typenum::{
bit::B0, UInt, U0, U1024, U1048576, U1073741824, U1099511627776, U128, U131072, U16, U16777216,
U2, U2048, U256, U32, U4, U4096, U512, U6, U625, U64, U65536, U8, U8192,
bit::B0, UInt, Unsigned, U0, U1, U1024, U1048576, U1073741824, U1099511627776, U128, U131072,
U134217728, U16, U16777216, U2, U2048, U256, U262144, U32, U4, U4096, U512, U6, U625, U64,
U65536, U8, U8192,
};
use ssz_types::typenum::{U17, U9};
use std::fmt::{self, Debug};
Expand Down Expand Up @@ -137,7 +138,14 @@ pub trait EthSpec:
/*
* New in Electra
*/
type ElectraPlaceholder: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type PendingBalanceDepositsLimit: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type PendingPartialWithdrawalsLimit: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type PendingConsolidationsLimit: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type MaxConsolidations: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type MaxDepositReceiptsPerPayload: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type MaxAttesterSlashingsElectra: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type MaxAttestationsElectra: Unsigned + Clone + Sync + Send + Debug + PartialEq;
type MaxWithdrawalRequestsPerPayload: Unsigned + Clone + Sync + Send + Debug + PartialEq;

fn default_spec() -> ChainSpec;

Expand Down Expand Up @@ -284,8 +292,44 @@ pub trait EthSpec:
Self::KzgCommitmentInclusionProofDepth::to_usize()
}

fn electra_placeholder() -> usize {
Self::ElectraPlaceholder::to_usize()
/// Returns the `PENDING_BALANCE_DEPOSITS_LIMIT` constant for this specification.
fn pending_balance_deposits_limit() -> usize {
Self::PendingBalanceDepositsLimit::to_usize()
}

/// Returns the `PENDING_PARTIAL_WITHDRAWALS_LIMIT` constant for this specification.
fn pending_partial_withdrawals_limit() -> usize {
Self::PendingPartialWithdrawalsLimit::to_usize()
}

/// Returns the `PENDING_CONSOLIDATIONS_LIMIT` constant for this specification.
fn pending_consolidations_limit() -> usize {
Self::PendingConsolidationsLimit::to_usize()
}

/// Returns the `MAX_CONSOLIDATIONS` constant for this specification.
fn max_consolidations() -> usize {
Self::MaxConsolidations::to_usize()
}

/// Returns the `MAX_DEPOSIT_RECEIPTS_PER_PAYLOAD` constant for this specification.
fn max_deposit_receipts_per_payload() -> usize {
Self::MaxDepositReceiptsPerPayload::to_usize()
}

/// Returns the `MAX_ATTESTER_SLASHINGS_ELECTRA` constant for this specification.
fn max_attester_slashings_electra() -> usize {
Self::MaxAttesterSlashingsElectra::to_usize()
}

/// Returns the `MAX_ATTESTATIONS_ELECTRA` constant for this specification.
fn max_attestations_electra() -> usize {
Self::MaxAttestationsElectra::to_usize()
}

/// Returns the `MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD` constant for this specification.
fn max_withdrawal_requests_per_payload() -> usize {
Self::MaxWithdrawalRequestsPerPayload::to_usize()
}
}

Expand Down Expand Up @@ -337,7 +381,14 @@ impl EthSpec for MainnetEthSpec {
type SlotsPerEth1VotingPeriod = U2048; // 64 epochs * 32 slots per epoch
type MaxBlsToExecutionChanges = U16;
type MaxWithdrawalsPerPayload = U16;
type ElectraPlaceholder = U16;
type PendingBalanceDepositsLimit = U134217728;
type PendingPartialWithdrawalsLimit = U134217728;
type PendingConsolidationsLimit = U262144;
type MaxConsolidations = U1;
type MaxDepositReceiptsPerPayload = U8192;
type MaxAttesterSlashingsElectra = U1;
type MaxAttestationsElectra = U8;
type MaxWithdrawalRequestsPerPayload = U16;

fn default_spec() -> ChainSpec {
ChainSpec::mainnet()
Expand Down Expand Up @@ -390,7 +441,14 @@ impl EthSpec for MinimalEthSpec {
MaxBlsToExecutionChanges,
MaxBlobsPerBlock,
BytesPerFieldElement,
ElectraPlaceholder
PendingBalanceDepositsLimit,
PendingPartialWithdrawalsLimit,
PendingConsolidationsLimit,
MaxConsolidations,
MaxDepositReceiptsPerPayload,
MaxAttesterSlashingsElectra,
MaxAttestationsElectra,
MaxWithdrawalRequestsPerPayload
});

fn default_spec() -> ChainSpec {
Expand Down Expand Up @@ -442,7 +500,14 @@ impl EthSpec for GnosisEthSpec {
type BytesPerFieldElement = U32;
type BytesPerBlob = U131072;
type KzgCommitmentInclusionProofDepth = U17;
type ElectraPlaceholder = U16;
type PendingBalanceDepositsLimit = U134217728;
type PendingPartialWithdrawalsLimit = U134217728;
type PendingConsolidationsLimit = U262144;
type MaxConsolidations = U1;
type MaxDepositReceiptsPerPayload = U8192;
type MaxAttesterSlashingsElectra = U1;
type MaxAttestationsElectra = U8;
type MaxWithdrawalRequestsPerPayload = U16;

fn default_spec() -> ChainSpec {
ChainSpec::gnosis()
Expand Down

0 comments on commit 14ae684

Please sign in to comment.