Reth の ChainSpec
ChainSpec は、プロトコルの層でそのチェーンが Ethereum メインネットとどう違うかを表す型です。chain ID、genesis、各 hardfork がいつ有効になるか、どの base fee パラメータを使うかを持ちます。Reth のノードはこれを元に組み立てられ、NodeConfig は chain: Arc<ChainSpec> として保持します。
どのチェーン(Ethereum・OP・独自チェーン)でも動かすコードは、具体的な構造体ではなく reth_chainspec の EthChainSpec トレイトを受け取ります。構造体 ChainSpec はこのトレイトを実装し、同じアクセサを固有メソッドとしても持っています。
API の早見表
fn genesis_hash(&self) -> B256- genesis ブロックのハッシュです。ChainSpec では封印済み genesis ヘッダのハッシュ(genesis_header.hash())を返します。EthChainSpec トレイトのメソッドでもあります。
fn genesis_header(&self) -> &Header- genesis ブロックのヘッダです。sealed_genesis_header() はハッシュ付きの SealedHeader として返します。
fn genesis(&self) -> &Genesis- genesis の仕様(アロケーション・gas limit・timestamp など)で、ヘッダではありません。ChainSpec::from_genesis(genesis) でここから spec を作れます。
fn chain(&self) -> Chain / fn chain_id(&self) -> u64- 対象のチェーンと、その数値 ID です(chain_id() は chain().id())。
fn base_fee_params_at_timestamp(&self, timestamp: u64) -> BaseFeeParams- その時刻に有効な EIP-1559 パラメータです。hardfork ごとの設定のうち、その時点で有効な最新のものを返します。どれも有効でなければ最初の設定を、設定が空なら Ethereum の既定値を返します。
ChainSpec::builder()- 独自の spec(chain・genesis・hardfork)をコードで組み立てる ChainSpecBuilder です。テストや独自チェーンで使います。
paradigmxyz/reth の eb4c15e(2026-04-07)で確認: crates/chainspec/src/api.rs, crates/chainspec/src/spec.rs
このトピックのレッスン
mainnet では検証が通るブロックが、あなたの chain では reject される。同じブロック、同じクライアントバイナリ、同じ Revm — なのに結果が違う。ChainSpec のどこかが「この高さでは、こ…
自分が build_payload で作った block を、自分の validate_payload が拒否しないことをどう保証するか? つまり build と validate が 同じルール を使うことをどう担保…
commit で「ローカル bookkeeping」と「Reth engine への通知」のどちらを先にやるべきか? そして engine 呼び出しが失敗したら、確定済みの commit を rollback すべきか?
custom precompile を、Reth が EVM を作るすべての経路(payload build / block validation / eth_call RPC / debug RPC)に、一度の登録で…