@@ -9,7 +9,7 @@ use ethrex_rlp::{
9
9
use ethereum_types:: H32 ;
10
10
use tracing:: debug;
11
11
12
- use super :: { BlockHash , BlockNumber , ChainConfig } ;
12
+ use super :: { BlockHash , BlockHeader , BlockNumber , ChainConfig } ;
13
13
14
14
// See https://github.com/ethereum/go-ethereum/blob/530adfc8e3ef9c8b6356facecdec10b30fb81d7d/core/forkid/forkid.go#L51
15
15
const TIMESTAMP_THRESHOLD : u64 = 1438269973 ;
@@ -23,11 +23,14 @@ pub struct ForkId {
23
23
impl ForkId {
24
24
pub fn new (
25
25
chain_config : ChainConfig ,
26
- genesis_hash : BlockHash ,
26
+ genesis_header : BlockHeader ,
27
27
head_timestamp : u64 ,
28
28
head_block_number : u64 ,
29
29
) -> Self {
30
- let ( block_number_based_forks, timestamp_based_forks) = chain_config. gather_forks ( ) ;
30
+ let genesis_hash = genesis_header. compute_block_hash ( ) ;
31
+ let ( block_number_based_forks, timestamp_based_forks) =
32
+ chain_config. gather_forks ( genesis_header) ;
33
+
31
34
let mut fork_next;
32
35
let mut hasher = Hasher :: new ( ) ;
33
36
// Calculate the starting checksum from the genesis hash
@@ -60,9 +63,11 @@ impl ForkId {
60
63
latest_block_number : u64 ,
61
64
head_timestamp : u64 ,
62
65
chain_config : ChainConfig ,
63
- genesis_hash : BlockHash ,
66
+ genesis_header : BlockHeader ,
64
67
) -> bool {
65
- let ( block_number_based_forks, timestamp_based_forks) = chain_config. gather_forks ( ) ;
68
+ let genesis_hash = genesis_header. compute_block_hash ( ) ;
69
+ let ( block_number_based_forks, timestamp_based_forks) =
70
+ chain_config. gather_forks ( genesis_header) ;
66
71
67
72
// Determine whether to compare the remote fork_next using a block number or a timestamp.
68
73
let head = if head_timestamp >= TIMESTAMP_THRESHOLD {
@@ -220,17 +225,22 @@ mod tests {
220
225
fn assert_test_cases (
221
226
test_cases : Vec < TestCase > ,
222
227
chain_config : ChainConfig ,
223
- genesis_hash : BlockHash ,
228
+ genesis_header : BlockHeader ,
224
229
) {
225
230
for test_case in test_cases {
226
- let fork_id = ForkId :: new ( chain_config, genesis_hash, test_case. time , test_case. head ) ;
231
+ let fork_id = ForkId :: new (
232
+ chain_config,
233
+ genesis_header. clone ( ) ,
234
+ test_case. time ,
235
+ test_case. head ,
236
+ ) ;
227
237
assert_eq ! (
228
238
fork_id. is_valid(
229
239
test_case. fork_id,
230
240
test_case. head,
231
241
test_case. time,
232
242
chain_config,
233
- genesis_hash
243
+ genesis_header . clone ( )
234
244
) ,
235
245
test_case. is_valid
236
246
)
@@ -244,7 +254,7 @@ mod tests {
244
254
let genesis_reader = BufReader :: new ( genesis_file) ;
245
255
let genesis: Genesis =
246
256
serde_json:: from_reader ( genesis_reader) . expect ( "Failed to read genesis file" ) ;
247
- let genesis_hash = genesis. get_block ( ) . hash ( ) ;
257
+ let genesis_header = genesis. get_block ( ) . header ;
248
258
249
259
// See https://github.com/ethereum/go-ethereum/blob/4d94bd83b20ce430e435f3107f29632c627cfb26/core/forkid/forkid_test.go#L98
250
260
let test_cases: Vec < TestCase > = vec ! [
@@ -303,17 +313,17 @@ mod tests {
303
313
is_valid: true ,
304
314
} ,
305
315
] ;
306
- assert_test_cases ( test_cases, genesis. config , genesis_hash ) ;
316
+ assert_test_cases ( test_cases, genesis. config , genesis_header ) ;
307
317
}
308
318
309
- fn get_sepolia_genesis ( ) -> ( Genesis , BlockHash ) {
319
+ fn get_sepolia_genesis ( ) -> ( Genesis , BlockHeader ) {
310
320
let genesis_file = std:: fs:: File :: open ( "../../cmd/ethrex/networks/sepolia/genesis.json" )
311
321
. expect ( "Failed to open genesis file" ) ;
312
322
let genesis_reader = BufReader :: new ( genesis_file) ;
313
323
let genesis: Genesis =
314
324
serde_json:: from_reader ( genesis_reader) . expect ( "Failed to read genesis file" ) ;
315
- let genesis_hash = genesis. get_block ( ) . hash ( ) ;
316
- ( genesis, genesis_hash )
325
+ let genesis_header = genesis. get_block ( ) . header ;
326
+ ( genesis, genesis_header )
317
327
}
318
328
#[ test]
319
329
fn sepolia_test_cases ( ) {
@@ -417,14 +427,14 @@ mod tests {
417
427
local_head_block_number,
418
428
0 ,
419
429
ChainConfig :: default ( ) ,
420
- BlockHash :: random ( ) ,
430
+ BlockHeader :: default ( ) ,
421
431
) ;
422
432
let result_b = local_b. is_valid (
423
433
remote,
424
434
local_head_block_number,
425
435
0 ,
426
436
ChainConfig :: default ( ) ,
427
- BlockHash :: random ( ) ,
437
+ BlockHeader :: default ( ) ,
428
438
) ;
429
439
assert ! ( !result_a) ;
430
440
assert ! ( !result_b) ;
0 commit comments