Skip to content

Commit a48fe41

Browse files
author
Naohiro Yoshida
committed
check header before pascal
Signed-off-by: Naohiro Yoshida <[email protected]>
1 parent 6390873 commit a48fe41

File tree

3 files changed

+78
-7
lines changed

3 files changed

+78
-7
lines changed

.github/workflows/ci.yaml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,17 @@ jobs:
5353
name: unit-test-dev-test-pascal
5454
with:
5555
command: test
56-
args: --release --features=dev --manifest-path light-client/Cargo.toml --lib test::dev_test_pascal
56+
args: --release --features=dev --manifest-path light-client/Cargo.toml --lib test::dev_test_after_pascal
5757
env:
5858
MINIMUM_TIMESTAMP_SUPPORTED: 1
5959
MINIMUM_HEIGHT_SUPPORTED: 1
60-
PASCAL_TIMESTAMP: 1
60+
PASCAL_TIMESTAMP: 1
61+
- uses: actions-rs/cargo@v1
62+
name: unit-test-dev-test-pascal
63+
with:
64+
command: test
65+
args: --release --features=dev --manifest-path light-client/Cargo.toml --lib test::dev_test_before_pascal
66+
env:
67+
MINIMUM_TIMESTAMP_SUPPORTED: 1
68+
MINIMUM_HEIGHT_SUPPORTED: 1
69+
PASCAL_TIMESTAMP: 1800000000

light-client/src/errors.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ pub enum Error {
9999
UnexpectedCurrentValidatorsHashInEpoch(Height, Height, Hash, Hash),
100100
UnexpectedUntrustedValidators(BlockNumber, BlockNumber),
101101
MissingRequestsHash(BlockNumber),
102+
UnexpectedRequestsHash(BlockNumber, Vec<u8>),
103+
UnexpectedHeaderRLP(BlockNumber),
102104

103105
// Vote attestation
104106
UnexpectedTooManyHeadersToFinalize(BlockNumber, usize),
@@ -388,6 +390,12 @@ impl core::fmt::Display for Error {
388390
Error::MissingRequestsHash(e1) => {
389391
write!(f, "MissingRequestsHash : {}", e1)
390392
}
393+
Error::UnexpectedRequestsHash(e1, e2) => {
394+
write!(f, "UnexpectedRequestsHash : {} {:?}", e1, e2)
395+
}
396+
Error::UnexpectedHeaderRLP(e1) => {
397+
write!(f, "UnexpectedHeaderRLP : {}", e1)
398+
}
391399
}
392400
}
393401
}

light-client/src/header/eth_header.rs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,6 @@ impl TryFrom<RawETHHeader> for ETHHeader {
421421
if nonce != EMPTY_NONCE {
422422
return Err(Error::UnexpectedNonce(number));
423423
}
424-
425424
let hash: Hash = keccak_256(value.header.as_slice());
426425

427426
let epoch = if number % BLOCKS_PER_EPOCH == 0 {
@@ -432,8 +431,21 @@ impl TryFrom<RawETHHeader> for ETHHeader {
432431
};
433432

434433
#[allow(clippy::absurd_extreme_comparisons)]
435-
if PASCAL_TIMESTAMP > 0 && timestamp >= PASCAL_TIMESTAMP && requests_hash.is_none() {
436-
return Err(Error::MissingRequestsHash(number));
434+
if PASCAL_TIMESTAMP > 0 {
435+
if timestamp >= PASCAL_TIMESTAMP {
436+
if requests_hash.is_none() {
437+
return Err(Error::MissingRequestsHash(number));
438+
}
439+
// Ensure no more header element.
440+
if rlp.try_next().is_ok() {
441+
return Err(Error::UnexpectedHeaderRLP(number));
442+
}
443+
} else if timestamp < PASCAL_TIMESTAMP && requests_hash.is_some() {
444+
return Err(Error::UnexpectedRequestsHash(
445+
number,
446+
requests_hash.unwrap(),
447+
));
448+
}
437449
}
438450

439451
Ok(Self {
@@ -838,7 +850,7 @@ pub(crate) mod test {
838850
}
839851

840852
#[cfg(feature = "dev")]
841-
mod dev_test_pascal {
853+
mod dev_test_after_pascal {
842854
use crate::errors::Error;
843855
use crate::fixture::{decode_header, localnet};
844856
use crate::header::eth_header::ETHHeader;
@@ -847,7 +859,7 @@ pub(crate) mod test {
847859

848860
#[test]
849861
fn test_error_missing_request_hash() {
850-
// number = 401
862+
// timestamp = 1721396460
851863
let raw_header = localnet().epoch_header_plus_1_rlp();
852864
let raw_header = EthHeader { header: raw_header };
853865
let result = ETHHeader::try_from(raw_header).unwrap_err();
@@ -857,10 +869,52 @@ pub(crate) mod test {
857869
}
858870
}
859871

872+
#[test]
873+
fn test_error_invalid_header_rlp_length() {
874+
let mut header = hex!("f90370a04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e04db2de85453e0936b441c339a26d10cfa71b50a0d0a25a7c6b93d5d2e8f7e2075d2886fa62840f31c127b880b7cd503e2d364163a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282071b8402625a008084678f4827b90111d883010503846765746888676f312e32332e35856c696e75780000002f5b9772f8ae0fb860959e5c417ecd8a5e5ddabd85485cf2cc4433f26beea076d77bbc6f461e4129881b8772bdae5fdd6ca927b571662ac5750d4abeca4f44a4406ab3254e0d98e6ee92b5b6396122853b45db2d18d24fb79e8397e253ca10a2a03b3b18e5961173b5f848820719a0e5ef3de482ecc3de5aea0efb17457d7edc5b1a39fc97c29cc5780b4665c9ca2082071aa04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad180aba9a203cbc9ac6e2eabbc44b15f7c526ec5f9d570a0addc005d5958d8415f760794e65762057ff9956dce68034d30cca6d9cc2ac3eb35f699d47c74931c470a01a0000000000000000000000000000000000000000000000000000000000000000088000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000a0e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").to_vec();
875+
// add unnecessary data
876+
header.push(0x80);
877+
let raw_header = EthHeader { header };
878+
let result = ETHHeader::try_from(raw_header).unwrap_err();
879+
match result {
880+
Error::UnexpectedHeaderRLP(_) => {}
881+
_ => unreachable!(),
882+
}
883+
}
884+
860885
#[test]
861886
fn test_success_after_bep466() {
887+
// timestamp=1737443367
862888
let header = hex!("f90370a04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e04db2de85453e0936b441c339a26d10cfa71b50a0d0a25a7c6b93d5d2e8f7e2075d2886fa62840f31c127b880b7cd503e2d364163a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282071b8402625a008084678f4827b90111d883010503846765746888676f312e32332e35856c696e75780000002f5b9772f8ae0fb860959e5c417ecd8a5e5ddabd85485cf2cc4433f26beea076d77bbc6f461e4129881b8772bdae5fdd6ca927b571662ac5750d4abeca4f44a4406ab3254e0d98e6ee92b5b6396122853b45db2d18d24fb79e8397e253ca10a2a03b3b18e5961173b5f848820719a0e5ef3de482ecc3de5aea0efb17457d7edc5b1a39fc97c29cc5780b4665c9ca2082071aa04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad180aba9a203cbc9ac6e2eabbc44b15f7c526ec5f9d570a0addc005d5958d8415f760794e65762057ff9956dce68034d30cca6d9cc2ac3eb35f699d47c74931c470a01a0000000000000000000000000000000000000000000000000000000000000000088000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000a0e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").to_vec();
863889
decode_header(header);
864890
}
865891
}
892+
893+
#[cfg(feature = "dev")]
894+
mod dev_test_before_pascal {
895+
use crate::errors::Error;
896+
use crate::fixture::{decode_header, localnet};
897+
use crate::header::eth_header::ETHHeader;
898+
use hex_literal::hex;
899+
use parlia_ibc_proto::ibc::lightclients::parlia::v1::EthHeader;
900+
901+
#[test]
902+
fn test_error_request_hash() {
903+
// timestamp=1737443367
904+
let header = hex!("f90370a04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e04db2de85453e0936b441c339a26d10cfa71b50a0d0a25a7c6b93d5d2e8f7e2075d2886fa62840f31c127b880b7cd503e2d364163a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000282071b8402625a008084678f4827b90111d883010503846765746888676f312e32332e35856c696e75780000002f5b9772f8ae0fb860959e5c417ecd8a5e5ddabd85485cf2cc4433f26beea076d77bbc6f461e4129881b8772bdae5fdd6ca927b571662ac5750d4abeca4f44a4406ab3254e0d98e6ee92b5b6396122853b45db2d18d24fb79e8397e253ca10a2a03b3b18e5961173b5f848820719a0e5ef3de482ecc3de5aea0efb17457d7edc5b1a39fc97c29cc5780b4665c9ca2082071aa04a99d244666a287d9aaa1a81aa5bba573f156865369023eaa53a4ba8bb303ad180aba9a203cbc9ac6e2eabbc44b15f7c526ec5f9d570a0addc005d5958d8415f760794e65762057ff9956dce68034d30cca6d9cc2ac3eb35f699d47c74931c470a01a0000000000000000000000000000000000000000000000000000000000000000088000000000000000080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b4218080a00000000000000000000000000000000000000000000000000000000000000000a0e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855").to_vec();
905+
let raw_header = EthHeader { header };
906+
let result = ETHHeader::try_from(raw_header).unwrap_err();
907+
match result {
908+
Error::UnexpectedRequestsHash(_, _) => {}
909+
_ => unreachable!(),
910+
}
911+
}
912+
913+
#[test]
914+
fn test_success_before_bep466() {
915+
// timestamp=1721396460
916+
let raw_header = localnet().epoch_header_plus_1_rlp();
917+
decode_header(raw_header);
918+
}
919+
}
866920
}

0 commit comments

Comments
 (0)