@@ -288,7 +288,7 @@ impl ETHHeader {
288288 if self . extra_data . len ( ) <= EXTRA_VANITY + EXTRA_SEAL {
289289 return Err ( Error :: UnexpectedVoteLength ( self . extra_data . len ( ) ) ) ;
290290 }
291- let attestation_bytes = if self . number % BLOCKS_PER_EPOCH != 0 {
291+ let attestation_bytes = if ! self . is_epoch ( ) {
292292 & self . extra_data [ EXTRA_VANITY ..self . extra_data . len ( ) - EXTRA_SEAL ]
293293 } else {
294294 let num = self . extra_data [ EXTRA_VANITY ] as usize ;
@@ -307,7 +307,26 @@ impl ETHHeader {
307307 }
308308
309309 pub fn is_epoch ( & self ) -> bool {
310- self . number % BLOCKS_PER_EPOCH == 0
310+ is_epoch ( self . number )
311+ }
312+
313+ pub fn current_epoch_block_number ( & self ) -> BlockNumber {
314+ current_epoch_block_number ( self . number )
315+ }
316+
317+ pub fn previous_epoch_block_number ( & self ) -> BlockNumber {
318+ let current_epoch = self . current_epoch_block_number ( ) ;
319+ previous_epoch_block_number_from ( current_epoch)
320+ }
321+
322+ pub fn next_epoch_block_number ( & self ) -> BlockNumber {
323+ let current_epoch = self . current_epoch_block_number ( ) ;
324+ next_epoch_block_number_from ( current_epoch)
325+ }
326+
327+ pub fn next_next_epoch_block_number ( & self ) -> BlockNumber {
328+ let next_epoch = self . next_epoch_block_number ( ) ;
329+ next_epoch_block_number_from ( next_epoch)
311330 }
312331
313332 pub fn verify_fork_rule ( & self , fork_specs : & [ ForkSpec ] ) -> Result < ( ) , Error > {
@@ -332,6 +351,22 @@ impl ETHHeader {
332351 }
333352}
334353
354+ fn is_epoch ( number : BlockNumber ) -> bool {
355+ number % BLOCKS_PER_EPOCH == 0
356+ }
357+
358+ pub fn current_epoch_block_number ( number : BlockNumber ) -> BlockNumber {
359+ number - ( number % BLOCKS_PER_EPOCH )
360+ }
361+
362+ fn previous_epoch_block_number_from ( base_epoch_block_number : BlockNumber ) -> BlockNumber {
363+ base_epoch_block_number - BLOCKS_PER_EPOCH
364+ }
365+
366+ fn next_epoch_block_number_from ( base_epoch_block_number : BlockNumber ) -> BlockNumber {
367+ base_epoch_block_number + BLOCKS_PER_EPOCH
368+ }
369+
335370pub fn get_validator_bytes_and_turn_length ( extra_data : & [ u8 ] ) -> Result < ( Validators , u8 ) , Error > {
336371 if extra_data. len ( ) <= EXTRA_VANITY + EXTRA_SEAL {
337372 return Err ( Error :: UnexpectedExtraDataLength ( extra_data. len ( ) ) ) ;
@@ -428,7 +463,7 @@ impl TryFrom<RawETHHeader> for ETHHeader {
428463 }
429464 let hash: Hash = keccak_256 ( value. header . as_slice ( ) ) ;
430465
431- let epoch = if number % BLOCKS_PER_EPOCH == 0 {
466+ let epoch = if is_epoch ( number) {
432467 let ( validators, turn_length) = get_validator_bytes_and_turn_length ( & extra_data) ?;
433468 Some ( Epoch :: new ( validators. into ( ) , turn_length) )
434469 } else {
0 commit comments