@@ -163,8 +163,19 @@ impl From<KnownChain> for Chain {
163163#[ serde( untagged) ]
164164pub enum ChainLoader {
165165 Known ( KnownChain ) ,
166- Path ( PathBuf ) ,
167- Custom { genesis_time_secs : u64 , slot_time_secs : u64 , genesis_fork_version : Bytes } ,
166+ Path {
167+ /// Genesis time as returned in /eth/v1/beacon/genesis
168+ genesis_time_secs : u64 ,
169+ /// Path to the genesis spec, as returned by /eth/v1/config/spec
170+ /// either in JSON or YAML format
171+ path : PathBuf ,
172+ } ,
173+ Custom {
174+ /// Genesis time as returned in /eth/v1/beacon/genesis
175+ genesis_time_secs : u64 ,
176+ slot_time_secs : u64 ,
177+ genesis_fork_version : Bytes ,
178+ } ,
168179}
169180
170181impl Serialize for Chain {
@@ -199,7 +210,11 @@ impl<'de> Deserialize<'de> for Chain {
199210
200211 match loader {
201212 ChainLoader :: Known ( known) => Ok ( Chain :: from ( known) ) ,
202- ChainLoader :: Path ( path) => load_chain_from_file ( path) . map_err ( serde:: de:: Error :: custom) ,
213+ ChainLoader :: Path { genesis_time_secs, path } => {
214+ let ( slot_time_secs, genesis_fork_version) =
215+ load_chain_from_file ( path) . map_err ( serde:: de:: Error :: custom) ?;
216+ Ok ( Chain :: Custom { genesis_time_secs, slot_time_secs, genesis_fork_version } )
217+ }
203218 ChainLoader :: Custom { genesis_time_secs, slot_time_secs, genesis_fork_version } => {
204219 let genesis_fork_version: [ u8 ; 4 ] =
205220 genesis_fork_version. as_ref ( ) . try_into ( ) . map_err ( serde:: de:: Error :: custom) ?;
@@ -209,38 +224,25 @@ impl<'de> Deserialize<'de> for Chain {
209224 }
210225}
211226
212- /// Load a chain config from a spec file , such as returned by
213- /// /eth/v1/config/spec ref: https://ethereum.github.io/beacon-APIs/#/Config/getSpec
227+ /// Returns seconds_per_slot and genesis_fork_version from a spec, such as
228+ /// returned by /eth/v1/config/spec ref: https://ethereum.github.io/beacon-APIs/#/Config/getSpec
214229/// Try to load two formats:
215230/// - JSON as return the getSpec endpoint, either with or without the `data`
216231/// field
217232/// - YAML as used e.g. in Kurtosis/Ethereum Package
218- pub fn load_chain_from_file ( path : PathBuf ) -> eyre:: Result < Chain > {
233+ pub fn load_chain_from_file ( path : PathBuf ) -> eyre:: Result < ( u64 , [ u8 ; 4 ] ) > {
219234 #[ derive( Deserialize ) ]
220235 #[ serde( rename_all = "UPPERCASE" ) ]
221236 struct QuotedSpecFile {
222- #[ serde( with = "serde_utils::quoted_u64" ) ]
223- min_genesis_time : u64 ,
224- #[ serde( with = "serde_utils::quoted_u64" ) ]
225- genesis_delay : u64 ,
226237 #[ serde( with = "serde_utils::quoted_u64" ) ]
227238 seconds_per_slot : u64 ,
228239 genesis_fork_version : Bytes ,
229240 }
230241
231242 impl QuotedSpecFile {
232- fn to_chain ( & self ) -> eyre:: Result < Chain > {
243+ fn to_chain ( & self ) -> eyre:: Result < ( u64 , [ u8 ; 4 ] ) > {
233244 let genesis_fork_version: [ u8 ; 4 ] = self . genesis_fork_version . as_ref ( ) . try_into ( ) ?;
234-
235- Ok ( Chain :: Custom {
236- // note that this can be wrong, (e.g. it's wrong in mainnet). The correct
237- // value should come from /eth/v1/beacon/genesis
238- // more info here: https://kb.beaconcha.in/ethereum-staking/the-genesis-event
239- // FIXME
240- genesis_time_secs : self . min_genesis_time + self . genesis_delay ,
241- slot_time_secs : self . seconds_per_slot ,
242- genesis_fork_version,
243- } )
245+ Ok ( ( self . seconds_per_slot , genesis_fork_version) )
244246 }
245247 }
246248
@@ -252,21 +254,14 @@ pub fn load_chain_from_file(path: PathBuf) -> eyre::Result<Chain> {
252254 #[ derive( Deserialize ) ]
253255 #[ serde( rename_all = "UPPERCASE" ) ]
254256 struct SpecFile {
255- min_genesis_time : u64 ,
256- genesis_delay : u64 ,
257257 seconds_per_slot : u64 ,
258258 genesis_fork_version : u32 ,
259259 }
260260
261261 impl SpecFile {
262- fn to_chain ( & self ) -> Chain {
262+ fn to_chain ( & self ) -> ( u64 , [ u8 ; 4 ] ) {
263263 let genesis_fork_version: [ u8 ; 4 ] = self . genesis_fork_version . to_be_bytes ( ) ;
264-
265- Chain :: Custom {
266- genesis_time_secs : self . min_genesis_time + self . genesis_delay ,
267- slot_time_secs : self . seconds_per_slot ,
268- genesis_fork_version,
269- }
264+ ( self . seconds_per_slot , genesis_fork_version)
270265 }
271266 }
272267
0 commit comments