Skip to content

Commit 2ad6d15

Browse files
authored
Merge pull request #12 from datachainlab/fix/dat2
DAT-2: Add the validation for frozen and latest_height
2 parents 49439f0 + fc06501 commit 2ad6d15

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

light-client/src/client.rs

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ impl<const L1_SYNC_COMMITTEE_SIZE: usize> LightClient
5454
let height = client_state.latest_height;
5555
let timestamp = consensus_state.timestamp;
5656

57+
if client_state.frozen {
58+
return Err(Error::CannotInitializeFrozenClient.into());
59+
}
60+
if client_state.latest_height.revision_height() == 0 {
61+
return Err(Error::UnexpectedLatestHeight(client_state.latest_height).into());
62+
}
63+
5764
Ok(CreateClientResult {
5865
height,
5966
message: UpdateStateProxyMessage {
@@ -289,6 +296,7 @@ mod test {
289296
use prost::Message;
290297
extern crate std;
291298

299+
#[derive(Default)]
292300
struct MockClientReader {
293301
client_state: Option<ClientState>,
294302
consensus_state: BTreeMap<Height, ConsensusState>,
@@ -406,11 +414,7 @@ mod test {
406414
let any_cs = Any::try_from(cs.clone()).unwrap();
407415
let result = client
408416
.create_client(
409-
&MockClientReader {
410-
client_state: None,
411-
consensus_state: BTreeMap::new(),
412-
time: None,
413-
},
417+
&MockClientReader::default(),
414418
any_cs.clone(),
415419
Any::try_from(cons_state.clone()).unwrap(),
416420
)
@@ -438,6 +442,51 @@ mod test {
438442
}
439443
}
440444

445+
#[test]
446+
fn test_create_client_error_frozen() {
447+
let client = OptimismLightClient::<
448+
{ ethereum_consensus::preset::minimal::PRESET.SYNC_COMMITTEE_SIZE },
449+
>;
450+
let (mut cs, cons_state) = get_initial_state();
451+
cs.frozen = true;
452+
let any_cs = Any::try_from(cs.clone()).unwrap();
453+
let err = client
454+
.create_client(
455+
&MockClientReader::default(),
456+
any_cs.clone(),
457+
Any::try_from(cons_state.clone()).unwrap(),
458+
)
459+
.unwrap_err();
460+
assert!(
461+
err.to_string().contains("CannotInitializeFrozenClient"),
462+
"{:?}",
463+
err
464+
);
465+
}
466+
467+
#[test]
468+
fn test_create_client_error_invalid_height() {
469+
let client = OptimismLightClient::<
470+
{ ethereum_consensus::preset::minimal::PRESET.SYNC_COMMITTEE_SIZE },
471+
>;
472+
let (mut cs, cons_state) = get_initial_state();
473+
cs.latest_height = Height::new(0, 0);
474+
475+
let any_cs = Any::try_from(cs.clone()).unwrap();
476+
let err = client
477+
.create_client(
478+
&MockClientReader::default(),
479+
any_cs.clone(),
480+
Any::try_from(cons_state.clone()).unwrap(),
481+
)
482+
.unwrap_err();
483+
assert!(
484+
err.to_string().contains("UnexpectedLatestHeight"),
485+
"{:?}",
486+
err
487+
);
488+
}
489+
441490
#[test]
442491
fn test_update_client() {
443492
let client = OptimismLightClient::<

light-client/src/errors.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ pub enum Error {
5353
NegativeMaxClockDrift,
5454
#[error("UnexpectedRollupConfig: err={0:?}")]
5555
UnexpectedRollupConfig(serde_json::Error),
56+
#[error("CannotInitializeFrozenClient")]
57+
CannotInitializeFrozenClient,
58+
#[error("UnexpectedLatestHeight: height={0}")]
59+
UnexpectedLatestHeight(Height),
5660

5761
// ConsState error
5862
#[error("UnexpectedStorageRoot: proof_height={0} latest_height={1}")]

0 commit comments

Comments
 (0)