Skip to content

Commit 4752948

Browse files
author
Naohiro Yoshida
committed
refactor
Signed-off-by: Naohiro Yoshida <naohiro.yoshida@datachain.jp>
1 parent 66ff49c commit 4752948

File tree

3 files changed

+57
-14
lines changed

3 files changed

+57
-14
lines changed

light-client/src/header/eth_header.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
335370
pub 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 {

light-client/src/header/eth_headers.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use crate::header::epoch::{EitherEpoch, Epoch, TrustedEpoch};
99
use crate::misc::{BlockNumber, ChainId, Validators};
1010

1111
use super::eth_header::ETHHeader;
12-
use super::BLOCKS_PER_EPOCH;
1312

1413
#[derive(Clone, Debug, PartialEq)]
1514
pub struct ETHHeaders {
@@ -34,10 +33,18 @@ impl ETHHeaders {
3433
previous_epoch: &TrustedEpoch,
3534
) -> Result<(), Error> {
3635
// Ensure the header after the next or next checkpoint must not exist.
37-
let epoch = self.target.number / BLOCKS_PER_EPOCH;
38-
let checkpoint = epoch * BLOCKS_PER_EPOCH + previous_epoch.checkpoint();
39-
let next_checkpoint = (epoch + 1) * BLOCKS_PER_EPOCH + current_epoch.checkpoint();
40-
let n_val = self.verify_header_size(epoch, checkpoint, next_checkpoint, current_epoch)?;
36+
let current_epoch_block_number = self.target.current_epoch_block_number();
37+
let checkpoint = current_epoch_block_number + previous_epoch.checkpoint();
38+
39+
let next_epoch_block_number = self.target.next_epoch_block_number();
40+
let next_checkpoint = next_epoch_block_number + current_epoch.checkpoint();
41+
42+
let n_val = self.verify_header_size(
43+
self.target.next_next_epoch_block_number(),
44+
checkpoint,
45+
next_checkpoint,
46+
current_epoch,
47+
)?;
4148

4249
// Ensure all the headers are successfully chained.
4350
self.verify_cascading_fields()?;
@@ -140,7 +147,7 @@ impl ETHHeaders {
140147
/// checkpoint range and ensures that they meet the size requirements for the current and next epochs.
141148
fn verify_header_size(
142149
&self,
143-
epoch: u64,
150+
next_next_epoch_block_number: BlockNumber,
144151
checkpoint: u64,
145152
next_checkpoint: u64,
146153
current_epoch: &EitherEpoch,
@@ -176,7 +183,7 @@ impl ETHHeaders {
176183
return Ok(None);
177184
}
178185

179-
let next_next_checkpoint = (epoch + 2) * BLOCKS_PER_EPOCH + next_epoch.checkpoint();
186+
let next_next_checkpoint = next_next_epoch_block_number + next_epoch.checkpoint();
180187

181188
// Ensure headers are before the next_next_checkpoint
182189
if hs.iter().any(|h| h.number >= next_next_checkpoint) {

light-client/src/header/mod.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use parlia_ibc_proto::ibc::lightclients::parlia::v1::Header as RawHeader;
77
use crate::consensus_state::ConsensusState;
88
use crate::fork_spec::ForkSpec;
99
use crate::header::epoch::{EitherEpoch, Epoch, TrustedEpoch, UntrustedEpoch};
10-
use crate::header::eth_header::{validate_turn_length, ETHHeader};
10+
use crate::header::eth_header::{current_epoch_block_number, validate_turn_length, ETHHeader};
1111

1212
use crate::header::eth_headers::ETHHeaders;
1313
use crate::misc::{new_height, new_timestamp, ChainId, Hash};
@@ -106,11 +106,11 @@ fn verify_epoch<'a>(
106106
current_epoch: &'a Epoch,
107107
) -> Result<(EitherEpoch<'a>, TrustedEpoch<'a>), Error> {
108108
let is_epoch = target.is_epoch();
109-
let header_epoch = height.revision_height() / BLOCKS_PER_EPOCH;
110-
let trusted_epoch = trusted_height.revision_height() / BLOCKS_PER_EPOCH;
109+
let trusted_epoch = current_epoch_block_number(trusted_height.revision_height());
111110

112111
if is_epoch {
113-
if header_epoch != trusted_epoch + 1 {
112+
let header_previous_epoch = target.previous_epoch_block_number();
113+
if header_previous_epoch != trusted_epoch {
114114
return Err(Error::UnexpectedTrustedHeight(
115115
trusted_height.revision_height(),
116116
height.revision_height(),
@@ -144,6 +144,7 @@ fn verify_epoch<'a>(
144144
TrustedEpoch::new(previous_epoch),
145145
))
146146
} else {
147+
let header_epoch = target.current_epoch_block_number();
147148
if header_epoch != trusted_epoch {
148149
return Err(Error::UnexpectedTrustedHeight(
149150
trusted_height.revision_height(),

0 commit comments

Comments
 (0)