feat: compute genesis root (#1020)

This commit is contained in:
Giovanni Napoli
2023-01-25 19:20:33 +01:00
committed by GitHub
parent 572f05a2e5
commit 99c52e55ba
5 changed files with 53 additions and 10 deletions

View File

@@ -1,6 +1,6 @@
use crate::{
proofs::genesis_state_root, BlockNumber, Chain, ForkFilter, ForkHash, ForkId, Genesis,
GenesisAccount, Hardfork, Header, H160, H256, U256,
BlockNumber, Chain, ForkFilter, ForkHash, ForkId, Genesis, GenesisAccount, Hardfork, Header,
H160, H256, U256,
};
use ethers_core::utils::Genesis as EthersGenesis;
use hex_literal::hex;
@@ -195,8 +195,6 @@ impl From<EthersGenesis> for ChainSpec {
.map(|(addr, account)| (addr.0.into(), account.clone().into()))
.collect::<HashMap<H160, GenesisAccount>>();
let state_root = genesis_state_root(alloc.clone());
let genesis_block = Genesis {
nonce: genesis.nonce.as_u64(),
timestamp: genesis.timestamp.as_u64(),
@@ -206,7 +204,6 @@ impl From<EthersGenesis> for ChainSpec {
coinbase: genesis.coinbase.0.into(),
extra_data: genesis.extra_data.0.into(),
alloc,
state_root,
};
let genesis_hash = Header::from(genesis_block.clone()).seal().hash();

View File

@@ -16,6 +16,14 @@ pub const EIP1559_ELASTICITY_MULTIPLIER: u64 = 2;
pub const MAINNET_GENESIS: H256 =
H256(hex!("d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3"));
/// Goerli genesis hash.
pub const GOERLI_GENESIS: H256 =
H256(hex!("bf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a"));
/// Sepolia genesis hash.
pub const SEPOLIA_GENESIS: H256 =
H256(hex!("25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9"));
/// Keccak256 over empty array.
pub const KECCAK_EMPTY: H256 =
H256(hex!("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"));

View File

@@ -2,7 +2,7 @@ use std::collections::HashMap;
use crate::{
keccak256,
proofs::{KeccakHasher, EMPTY_ROOT},
proofs::{genesis_state_root, KeccakHasher, EMPTY_ROOT},
utils::serde_helpers::deserialize_stringified_u64,
Address, Bytes, Header, H256, KECCAK_EMPTY, U256,
};
@@ -33,8 +33,6 @@ pub struct Genesis {
pub mix_hash: H256,
/// The genesis header coinbase address.
pub coinbase: Address,
/// The genesis state root.
pub state_root: H256,
/// The initial state of accounts in the genesis block.
pub alloc: HashMap<Address, GenesisAccount>,
}
@@ -46,7 +44,7 @@ impl From<Genesis> for Header {
difficulty: genesis.difficulty,
nonce: genesis.nonce,
extra_data: genesis.extra_data,
state_root: genesis.state_root,
state_root: genesis_state_root(genesis.alloc),
timestamp: genesis.timestamp,
mix_hash: genesis.mix_hash,
beneficiary: genesis.coinbase,

View File

@@ -40,7 +40,9 @@ pub use bloom::Bloom;
pub use chain::{
Chain, ChainInfo, ChainSpec, ChainSpecBuilder, ParisStatus, GOERLI, MAINNET, SEPOLIA,
};
pub use constants::{EMPTY_OMMER_ROOT, KECCAK_EMPTY, MAINNET_GENESIS};
pub use constants::{
EMPTY_OMMER_ROOT, GOERLI_GENESIS, KECCAK_EMPTY, MAINNET_GENESIS, SEPOLIA_GENESIS,
};
pub use forkid::{ForkFilter, ForkHash, ForkId, ForkTransition, ValidationError};
pub use genesis::{Genesis, GenesisAccount};
pub use hardfork::Hardfork;

View File

@@ -68,3 +68,41 @@ pub fn init_genesis<DB: Database>(db: Arc<DB>, chain: ChainSpec) -> Result<H256,
tx.commit()?;
Ok(hash)
}
#[cfg(test)]
mod tests {
use super::init_genesis;
use crate::utils::init::WriteMap;
use reth_db::mdbx::test_utils::create_test_rw_db;
use reth_primitives::{
GOERLI, GOERLI_GENESIS, MAINNET, MAINNET_GENESIS, SEPOLIA, SEPOLIA_GENESIS,
};
#[test]
fn success_init_genesis_mainnet() {
let db = create_test_rw_db::<WriteMap>();
let genesis_hash = init_genesis(db.clone(), MAINNET.clone()).unwrap();
// actual, expected
assert_eq!(genesis_hash, MAINNET_GENESIS);
}
#[test]
fn success_init_genesis_goerli() {
let db = create_test_rw_db::<WriteMap>();
let genesis_hash = init_genesis(db.clone(), GOERLI.clone()).unwrap();
// actual, expected
assert_eq!(genesis_hash, GOERLI_GENESIS);
}
#[test]
fn success_init_genesis_sepolia() {
let db = create_test_rw_db::<WriteMap>();
let genesis_hash = init_genesis(db.clone(), SEPOLIA.clone()).unwrap();
// actual, expected
assert_eq!(genesis_hash, SEPOLIA_GENESIS);
}
}