Skip to content

Commit

Permalink
Merge pull request #5 from datachainlab/generic-fork-parameters
Browse files Browse the repository at this point in the history
Make fork parameters generic

Signed-off-by: Jun Kimura <[email protected]>
  • Loading branch information
bluele authored May 10, 2023
2 parents 154a020 + b490f51 commit aac304f
Show file tree
Hide file tree
Showing 11 changed files with 181 additions and 145 deletions.
4 changes: 2 additions & 2 deletions crates/consensus/src/bellatrix.rs
Original file line number Diff line number Diff line change
Expand Up @@ -483,9 +483,9 @@ mod test {

// ensure that signing_root calculation is correct

let ctx = DefaultChainContext::new_with_config(0.into(), config::mainnet::CONFIG);
let ctx = DefaultChainContext::new_with_config(0.into(), config::mainnet::get_config());
let fork_version =
compute_fork_version(&ctx, compute_epoch_at_slot(&ctx, update.signature_slot));
compute_fork_version(&ctx, compute_epoch_at_slot(&ctx, update.signature_slot)).unwrap();
let domain = compute_domain(
&ctx,
DOMAIN_SYNC_COMMITTEE,
Expand Down
19 changes: 4 additions & 15 deletions crates/consensus/src/compute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use crate::{

/// https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/beacon-chain.md#compute_timestamp_at_slot
pub fn compute_timestamp_at_slot<C: ChainContext>(ctx: &C, slot: Slot) -> U64 {
let slots_since_genesis = slot - ctx.fork_parameters().genesis_slot;
let slots_since_genesis = slot - ctx.fork_parameters().genesis_slot();
ctx.genesis_time() + slots_since_genesis * ctx.seconds_per_slot()
}

Expand All @@ -36,19 +36,8 @@ pub fn compute_sync_committee_period<C: ChainContext>(
}

/// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/fork.md#compute_fork_version
pub fn compute_fork_version<C: ChainContext>(ctx: &C, epoch: Epoch) -> Version {
let fork_parameters = ctx.fork_parameters().clone();
if epoch >= fork_parameters.eip4844_fork_epoch {
fork_parameters.eip4844_fork_version
} else if epoch >= fork_parameters.capella_fork_epoch {
fork_parameters.capella_fork_version
} else if epoch >= fork_parameters.bellatrix_fork_epoch {
fork_parameters.bellatrix_fork_version
} else if epoch >= fork_parameters.altair_fork_epoch {
fork_parameters.altair_fork_version
} else {
fork_parameters.genesis_fork_version
}
pub fn compute_fork_version<C: ChainContext>(ctx: &C, epoch: Epoch) -> Result<Version, Error> {
Ok(ctx.fork_parameters().compute_fork_version(epoch)?.clone())
}

/// https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#compute_fork_data_root
Expand All @@ -70,7 +59,7 @@ pub fn compute_domain<C: ChainContext>(
genesis_validators_root: Option<Root>,
) -> Result<Domain, Error> {
let fork_data_root = compute_fork_data_root(
fork_version.unwrap_or(ctx.fork_parameters().genesis_fork_version.clone()),
fork_version.unwrap_or(ctx.fork_parameters().genesis_version.clone()),
genesis_validators_root.unwrap_or_default(),
)?;
let mut domain: [u8; 32] = Default::default();
Expand Down
45 changes: 22 additions & 23 deletions crates/consensus/src/config/goerli.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
use crate::{beacon::Version, fork::ForkParameters, preset, types::U64};

use super::Config;

pub const CONFIG: Config = Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters {
genesis_fork_version: Version([0, 0, 16, 32]),
genesis_slot: U64(0),

altair_fork_version: Version([1, 0, 16, 32]),
altair_fork_epoch: U64(36660),

bellatrix_fork_version: Version([2, 0, 16, 32]),
bellatrix_fork_epoch: U64(112260),

capella_fork_version: Version([3, 0, 16, 32]),
capella_fork_epoch: U64(162304),

// NOTE: dummy data
eip4844_fork_version: Version([4, 0, 0, 0]),
eip4844_fork_epoch: U64(u64::MAX),
},
min_genesis_time: U64(1614588812),
use crate::{
beacon::Version,
fork::{ForkParameter, ForkParameters},
internal_prelude::*,
preset,
types::U64,
};

pub fn get_config() -> Config {
Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters::new(
Version([0, 0, 16, 32]),
vec![
ForkParameter::new(Version([4, 0, 16, 32]), U64(u64::MAX)),
ForkParameter::new(Version([3, 0, 16, 32]), U64(162304)),
ForkParameter::new(Version([2, 0, 16, 32]), U64(112260)),
ForkParameter::new(Version([1, 0, 16, 32]), U64(36660)),
],
),
min_genesis_time: U64(1614588812),
}
}
45 changes: 22 additions & 23 deletions crates/consensus/src/config/mainnet.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
use crate::{beacon::Version, fork::ForkParameters, preset, types::U64};

use super::Config;

pub const CONFIG: Config = Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters {
genesis_fork_version: Version([0, 0, 0, 0]),
genesis_slot: U64(0),

altair_fork_version: Version([1, 0, 0, 0]),
altair_fork_epoch: U64(74240),

bellatrix_fork_version: Version([2, 0, 0, 0]),
bellatrix_fork_epoch: U64(144896),

capella_fork_version: Version([3, 0, 0, 0]),
capella_fork_epoch: U64(194048),

// NOTE: dummy data
eip4844_fork_version: Version([4, 0, 0, 0]),
eip4844_fork_epoch: U64(u64::MAX),
},
min_genesis_time: U64(1606824000),
use crate::{
beacon::Version,
fork::{ForkParameter, ForkParameters},
internal_prelude::*,
preset,
types::U64,
};

pub fn get_config() -> Config {
Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters::new(
Version([0, 0, 0, 0]),
vec![
ForkParameter::new(Version([4, 0, 0, 0]), U64(u64::MAX)),
ForkParameter::new(Version([3, 0, 0, 0]), U64(194048)),
ForkParameter::new(Version([2, 0, 0, 0]), U64(144896)),
ForkParameter::new(Version([1, 0, 0, 0]), U64(74240)),
],
),
min_genesis_time: U64(1606824000),
}
}
45 changes: 22 additions & 23 deletions crates/consensus/src/config/minimal.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
use crate::{beacon::Version, fork::ForkParameters, preset, types::U64};

use super::Config;

pub const CONFIG: Config = Config {
preset: preset::minimal::PRESET,
fork_parameters: ForkParameters {
genesis_fork_version: Version([0, 0, 0, 1]),
genesis_slot: U64(0),

altair_fork_version: Version([1, 0, 0, 1]),
altair_fork_epoch: U64(0),

bellatrix_fork_version: Version([2, 0, 0, 1]),
bellatrix_fork_epoch: U64(0),

capella_fork_version: Version([3, 0, 0, 1]),
capella_fork_epoch: U64(0),

// NOTE: dummy data
eip4844_fork_version: Version([4, 0, 0, 1]),
eip4844_fork_epoch: U64(u64::MAX),
},
min_genesis_time: U64(1578009600),
use crate::{
beacon::Version,
fork::{ForkParameter, ForkParameters},
internal_prelude::*,
preset,
types::U64,
};

pub fn get_config() -> Config {
Config {
preset: preset::minimal::PRESET,
fork_parameters: ForkParameters::new(
Version([0, 0, 0, 1]),
vec![
ForkParameter::new(Version([4, 0, 0, 1]), U64(u64::MAX)),
ForkParameter::new(Version([3, 0, 0, 1]), U64(0)),
ForkParameter::new(Version([2, 0, 0, 1]), U64(0)),
ForkParameter::new(Version([1, 0, 0, 1]), U64(0)),
],
),
min_genesis_time: U64(1578009600),
}
}
45 changes: 22 additions & 23 deletions crates/consensus/src/config/sepolia.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
use crate::{beacon::Version, fork::ForkParameters, preset, types::U64};

use super::Config;

pub const CONFIG: Config = Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters {
genesis_fork_version: Version([144, 0, 0, 105]),
genesis_slot: U64(0),

altair_fork_version: Version([144, 0, 0, 112]),
altair_fork_epoch: U64(50),

bellatrix_fork_version: Version([144, 0, 0, 113]),
bellatrix_fork_epoch: U64(100),

capella_fork_version: Version([144, 0, 0, 114]),
capella_fork_epoch: U64(56832),

// NOTE: dummy data
eip4844_fork_version: Version([4, 0, 0, 0]),
eip4844_fork_epoch: U64(u64::MAX),
},
min_genesis_time: U64(1655647200),
use crate::{
beacon::Version,
fork::{ForkParameter, ForkParameters},
internal_prelude::*,
preset,
types::U64,
};

pub fn get_config() -> Config {
Config {
preset: preset::mainnet::PRESET,
fork_parameters: ForkParameters::new(
Version([144, 0, 0, 105]),
vec![
ForkParameter::new(Version([144, 0, 0, 0]), U64(u64::MAX)),
ForkParameter::new(Version([144, 0, 0, 114]), U64(56832)),
ForkParameter::new(Version([144, 0, 0, 113]), U64(100)),
ForkParameter::new(Version([144, 0, 0, 112]), U64(50)),
],
),
min_genesis_time: U64(1655647200),
}
}
4 changes: 3 additions & 1 deletion crates/consensus/src/errors.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{beacon::Root, bls::PublicKey, internal_prelude::*, types::H256};
use crate::{beacon::Root, bls::PublicKey, fork::ForkParameters, internal_prelude::*, types::H256};
use displaydoc::Display;

#[derive(Debug, Display)]
Expand All @@ -19,6 +19,8 @@ pub enum Error {
BLSAggregatePublicKeyMismatch(PublicKey, PublicKey),
/// invalid address length: `expected={0} actual={1}`
InvalidAddressLength(usize, usize),
/// invalid fork parameters order: `{0:?}`
InvalidForkParamersOrder(ForkParameters),
/// other error: `{description}`
Other { description: String },
}
Expand Down
53 changes: 43 additions & 10 deletions crates/consensus/src/fork.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,52 @@
use crate::beacon::{Epoch, Slot, Version};
use crate::errors::Error;
use crate::internal_prelude::*;
use crate::types::U64;

#[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct ForkParameters {
pub genesis_fork_version: Version,
pub genesis_slot: Slot,
pub genesis_version: Version,
pub forks: Vec<ForkParameter>,
}

impl ForkParameters {
pub const fn new(genesis_version: Version, forks: Vec<ForkParameter>) -> Self {
Self {
genesis_version,
forks,
}
}

pub fn validate(&self) -> Result<(), Error> {
if self.forks.windows(2).all(|f| f[0].epoch >= f[1].epoch) {
Ok(())
} else {
Err(Error::InvalidForkParamersOrder(self.clone()))
}
}

pub altair_fork_version: Version,
pub altair_fork_epoch: Epoch,
pub fn genesis_slot(&self) -> Slot {
U64(0)
}

pub bellatrix_fork_version: Version,
pub bellatrix_fork_epoch: Epoch,
pub fn compute_fork_version(&self, epoch: Epoch) -> Result<&Version, Error> {
for fork in self.forks.iter() {
if epoch >= fork.epoch {
return Ok(&fork.version);
}
}
Ok(&self.genesis_version)
}
}

pub capella_fork_version: Version,
pub capella_fork_epoch: Epoch,
#[derive(Debug, Default, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct ForkParameter {
pub version: Version,
pub epoch: Epoch,
}

pub eip4844_fork_version: Version,
pub eip4844_fork_epoch: Epoch,
impl ForkParameter {
pub const fn new(version: Version, epoch: Epoch) -> Self {
Self { version, epoch }
}
}
4 changes: 3 additions & 1 deletion crates/light-client-cli/bin/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ use ethereum_light_client_cli::cli::Cli;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
env_logger::init();
env_logger::init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);
Ok(Cli::parse().run().await?)
}
8 changes: 4 additions & 4 deletions crates/light-client-cli/src/chain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ impl Network {

pub fn config(&self) -> Config {
match self {
Network::Minimal => config::minimal::CONFIG,
Network::Mainnet => config::mainnet::CONFIG,
Network::Goerli => config::goerli::CONFIG,
Network::Sepolia => config::sepolia::CONFIG,
Network::Minimal => config::minimal::get_config(),
Network::Mainnet => config::mainnet::get_config(),
Network::Goerli => config::goerli::get_config(),
Network::Sepolia => config::sepolia::get_config(),
}
}
}
Loading

0 comments on commit aac304f

Please sign in to comment.