Skip to content

Commit 4dce63a

Browse files
authored
Merge pull request #93 from datachainlab/S3
S3
2 parents ddfd92e + 2472405 commit 4dce63a

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

light-client/src/errors.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ pub enum Error {
141141
UnexpectedMissingForkSpecInCurrentEpochCalculation(BlockNumber, alloc::boxed::Box<Error>),
142142
UnexpectedMissingForkSpecInPreviousEpochCalculation(BlockNumber, alloc::boxed::Box<Error>),
143143
UnexpectedPreviousEpochInCalculatingNextEpoch(BlockNumber, BlockNumber, BlockNumber),
144+
MustBeEpoch(BlockNumber, ForkSpec),
145+
MustNotBeEpoch(BlockNumber, ForkSpec),
144146

145147
// Misbehaviour
146148
MissingHeader1,
@@ -506,6 +508,12 @@ impl core::fmt::Display for Error {
506508
Error::UnexpectedEpochInfo(e1, e2) => {
507509
write!(f, "UnexpectedEpochInfo : {} {}", e1, e2)
508510
}
511+
Error::MustBeEpoch(e1, e2) => {
512+
write!(f, "MustBeEpoch : {} {:?}", e1, e2)
513+
}
514+
Error::MustNotBeEpoch(e1, e2) => {
515+
write!(f, "MustNotBeEpoch : {} {:?}", e1, e2)
516+
}
509517
}
510518
}
511519
}

light-client/src/header/eth_header.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,27 @@ impl ETHHeader {
361361
}
362362
}
363363

364+
pub fn verify_epoch_info(&self) -> Result<(), Error> {
365+
let be = self
366+
.boundary_epochs
367+
.as_ref()
368+
.ok_or(Error::MissingBoundaryEpochs(self.number))?;
369+
if self.number == be.current_epoch_block_number(self.number) {
370+
if !self.is_epoch() {
371+
return Err(Error::MustBeEpoch(
372+
self.number,
373+
be.current_fork_spec().clone(),
374+
));
375+
}
376+
} else if self.is_epoch() {
377+
return Err(Error::MustNotBeEpoch(
378+
self.number,
379+
be.current_fork_spec().clone(),
380+
));
381+
}
382+
Ok(())
383+
}
384+
364385
// https://github.com/bnb-chain/BEPs/blob/master/BEPs/BEP-520.md#411-millisecond-representation-in-block-header
365386
pub fn milli_timestamp(&self) -> u64 {
366387
let mut milliseconds: u64 = 0;
@@ -999,4 +1020,29 @@ pub(crate) mod test {
9991020
_ => unreachable!("invalid error {:?}", err),
10001021
}
10011022
}
1023+
1024+
#[rstest]
1025+
#[case::localnet(localnet())]
1026+
fn test_error_verify_epoch_info(#[case] hp: Box<dyn Network>) {
1027+
let mut header = hp.epoch_header();
1028+
header.epoch = None;
1029+
let err = header.verify_epoch_info().unwrap_err();
1030+
match err {
1031+
Error::MustBeEpoch(number, _fs) => {
1032+
assert_eq!(number, header.number);
1033+
}
1034+
_ => unreachable!("invalid error {:?}", err),
1035+
}
1036+
1037+
let mut header = hp.epoch_header();
1038+
header.epoch = Some(Epoch::new(vec![].into(), 1));
1039+
header.number += 1;
1040+
let err = header.verify_epoch_info().unwrap_err();
1041+
match err {
1042+
Error::MustNotBeEpoch(number, _fs) => {
1043+
assert_eq!(number, header.number);
1044+
}
1045+
_ => unreachable!("invalid error {:?}", err),
1046+
}
1047+
}
10021048
}

light-client/src/header/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ impl Header {
8282
}
8383
// Ensure HF height is required for target without seeking next headers
8484
self.headers.target.set_boundary_epochs(&fork_specs)?;
85+
// Verify epoch is really epoch
86+
self.headers.target.verify_epoch_info()?;
8587

8688
// Try to set HF height
8789
if !fork_specs.is_empty() {
@@ -97,9 +99,11 @@ impl Header {
9799
}
98100
}
99101

100-
// Set boundary epoch to verify header size.
101102
for header in &mut self.headers.all {
102-
header.set_boundary_epochs(&fork_specs)?
103+
// Set boundary epoch to verify header size.
104+
header.set_boundary_epochs(&fork_specs)?;
105+
// Verify epoch is really epoch
106+
header.verify_epoch_info()?;
103107
}
104108

105109
self.fork_specs = fork_specs;

0 commit comments

Comments
 (0)