Skip to content
This repository has been archived by the owner on Jun 24, 2024. It is now read-only.

Commit

Permalink
chore: use generic hasher for verify_client_message
Browse files Browse the repository at this point in the history
  • Loading branch information
Farhad-Shabani committed Apr 16, 2024
1 parent c6d4bec commit 1693300
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 21 deletions.
12 changes: 7 additions & 5 deletions clients/sov-celestia/src/client_state/misbehaviour.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ use ibc_core::client::context::{Convertible, ExtClientValidationContext};
use ibc_core::client::types::error::ClientError;
use ibc_core::host::types::identifiers::ClientId;
use ibc_core::host::types::path::ClientConsensusStatePath;
use sha2::Sha256;
use sov_celestia_client_types::client_message::SovTmMisbehaviour;
use sov_celestia_client_types::client_state::SovTmClientState;
use sov_celestia_client_types::consensus_state::SovTmConsensusState;
use tendermint::crypto::Sha256;
use tendermint::merkle::MerkleHash;

/// Determines whether or not two conflicting headers at the same height would
/// have convinced the light client.
pub fn verify_misbehaviour<V>(
pub fn verify_misbehaviour<V, H>(
ctx: &V,
client_state: &SovTmClientState,
misbehaviour: &SovTmMisbehaviour,
Expand All @@ -21,8 +22,9 @@ pub fn verify_misbehaviour<V>(
where
V: ExtClientValidationContext,
V::ConsensusStateRef: Convertible<SovTmConsensusState, ClientError>,
H: MerkleHash + Sha256 + Default,
{
misbehaviour.validate_basic()?;
misbehaviour.validate_basic::<H>()?;

let header_1 = misbehaviour.header_1();
let trusted_consensus_state_1 = {
Expand Down Expand Up @@ -50,7 +52,7 @@ where

let current_timestamp = ctx.host_timestamp()?;

verify_misbehaviour_header::<Sha256>(
verify_misbehaviour_header::<H>(
&header_1.da_header,
client_state.chain_id(),
&client_state.as_light_client_options()?,
Expand All @@ -60,7 +62,7 @@ where
verifier,
)?;

verify_misbehaviour_header::<Sha256>(
verify_misbehaviour_header::<H>(
&header_2.da_header,
client_state.chain_id(),
&client_state.as_light_client_options()?,
Expand Down
15 changes: 9 additions & 6 deletions clients/sov-celestia/src/client_state/update_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ use ibc_core::client::types::error::ClientError;
use ibc_core::client::types::Height;
use ibc_core::host::types::identifiers::ClientId;
use ibc_core::host::types::path::ClientConsensusStatePath;
use sha2::Sha256;
use sov_celestia_client_types::client_message::SovTmHeader;
use sov_celestia_client_types::client_state::SovTmClientState;
use sov_celestia_client_types::consensus_state::SovTmConsensusState;
use sov_celestia_client_types::sovereign::{AggregatedProof, CodeCommitment, Root};
use tendermint::crypto::Sha256;
use tendermint::merkle::MerkleHash;
use tendermint_light_client_verifier::types::{TrustedBlockState, UntrustedBlockState};
use tendermint_light_client_verifier::Verifier;

/// Verifies the IBC header type for the Sovereign SDK rollups, which consists
/// of the DA header and the aggregated proof date validation.
pub fn verify_header<V>(
pub fn verify_header<V, H>(
ctx: &V,
client_state: &SovTmClientState,
header: &SovTmHeader,
Expand All @@ -26,16 +27,17 @@ pub fn verify_header<V>(
where
V: ExtClientValidationContext,
V::ConsensusStateRef: Convertible<SovTmConsensusState, ClientError>,
H: MerkleHash + Sha256 + Default,
{
// Checks the sanity of the fields in the header.
header.validate_basic()?;
header.validate_basic::<H>()?;

header.validate_da_height_offset(
client_state.genesis_da_height(),
client_state.latest_height_in_sov(),
)?;

verify_da_header(ctx, client_state, &header.da_header, client_id, verifier)?;
verify_da_header::<V, H>(ctx, client_state, &header.da_header, client_id, verifier)?;

verify_aggregated_proof(
ctx,
Expand All @@ -49,7 +51,7 @@ where

/// Verifies the DA header type for the Sovereign SDK rollups against the
/// trusted state.
pub fn verify_da_header<V>(
pub fn verify_da_header<V, H>(
ctx: &V,
client_state: &SovTmClientState,
da_header: &TmHeader,
Expand All @@ -59,6 +61,7 @@ pub fn verify_da_header<V>(
where
V: ExtClientValidationContext,
V::ConsensusStateRef: Convertible<SovTmConsensusState, ClientError>,
H: MerkleHash + Sha256 + Default,
{
let chain_id = client_state.chain_id();

Expand All @@ -82,7 +85,7 @@ where
.consensus_state(&trusted_client_cons_state_path)?
.try_into()?;

da_header.check_trusted_next_validator_set::<Sha256>(
da_header.check_trusted_next_validator_set::<H>(
&trusted_consensus_state.da_params.next_validators_hash,
)?;

Expand Down
12 changes: 8 additions & 4 deletions clients/sov-celestia/src/client_state/validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ use sov_celestia_client_types::client_message::{
};
use sov_celestia_client_types::client_state::SovTmClientState;
use sov_celestia_client_types::consensus_state::SovTmConsensusState;
use tendermint::crypto::default::Sha256 as DefaultSha256;
use tendermint::crypto::Sha256;
use tendermint::merkle::MerkleHash;

use super::ClientState;
use crate::client_state::{check_da_misbehaviour_on_update, verify_header, verify_misbehaviour};
Expand All @@ -29,7 +32,7 @@ where
client_id: &ClientId,
client_message: Any,
) -> Result<(), ClientError> {
verify_client_message(
verify_client_message::<V, DefaultSha256>(
self.inner(),
ctx,
client_id,
Expand Down Expand Up @@ -58,7 +61,7 @@ where

/// Verify the client message as part of the validation process during the
/// update client flow.
pub fn verify_client_message<V>(
pub fn verify_client_message<V, H>(
client_state: &SovTmClientState,
ctx: &V,
client_id: &ClientId,
Expand All @@ -68,15 +71,16 @@ pub fn verify_client_message<V>(
where
V: ExtClientValidationContext,
V::ConsensusStateRef: Convertible<SovTmConsensusState, ClientError>,
H: MerkleHash + Sha256 + Default,
{
match client_message.type_url.as_str() {
SOV_TENDERMINT_HEADER_TYPE_URL => {
let header = SovTmHeader::try_from(client_message)?;
verify_header(ctx, client_state, &header, client_id, verifier)
verify_header::<V, H>(ctx, client_state, &header, client_id, verifier)
}
SOV_TENDERMINT_MISBEHAVIOUR_TYPE_URL => {
let misbehaviour = SovTmMisbehaviour::try_from(client_message)?;
verify_misbehaviour(ctx, client_state, &misbehaviour, client_id, verifier)
verify_misbehaviour::<V, H>(ctx, client_state, &misbehaviour, client_id, verifier)
}
_ => Err(ClientError::InvalidUpdateClientMessage),
}
Expand Down
7 changes: 4 additions & 3 deletions clients/sov-celestia/types/src/client_message/header.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ use ibc_core::client::types::Height;
use ibc_core::primitives::proto::{Any, Protobuf};
use ibc_core::primitives::Timestamp;
use tendermint::chain::Id as TmChainId;
use tendermint::crypto::default::Sha256;
use tendermint::crypto::Sha256;
use tendermint::merkle::MerkleHash;
use tendermint_light_client_verifier::types::TrustedBlockState;

use crate::consensus_state::SovTmConsensusState;
Expand Down Expand Up @@ -60,9 +61,9 @@ impl SovTmHeader {
}

/// Performs sanity checks on header to ensure the consistency of fields.
pub fn validate_basic(&self) -> Result<(), Error> {
pub fn validate_basic<H: MerkleHash + Sha256 + Default>(&self) -> Result<(), Error> {
self.da_header
.validate_basic::<Sha256>()
.validate_basic::<H>()
.map_err(Error::source)?;

self.aggregated_proof.validate_basic()?;
Expand Down
8 changes: 5 additions & 3 deletions clients/sov-celestia/types/src/client_message/misbehaviour.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ use ibc_client_tendermint::types::{Header as TmHeader, Misbehaviour as TmMisbeha
use ibc_core::client::types::error::ClientError;
use ibc_core::host::types::identifiers::ClientId;
use ibc_core::primitives::proto::{Any, Protobuf};
use tendermint::crypto::Sha256;
use tendermint::merkle::MerkleHash;

use super::header::{Header, SovTmHeader};
use crate::proto::v1::Misbehaviour as RawSovTmMisbehaviour;
Expand Down Expand Up @@ -70,9 +72,9 @@ impl SovTmMisbehaviour {
Protobuf::<RawSovTmMisbehaviour>::decode(&mut value.as_slice()).map_err(Error::source)
}

pub fn validate_basic(&self) -> Result<(), Error> {
self.header_1.validate_basic()?;
self.header_2.validate_basic()?;
pub fn validate_basic<H: MerkleHash + Sha256 + Default>(&self) -> Result<(), Error> {
self.header_1.validate_basic::<H>()?;
self.header_2.validate_basic::<H>()?;

if self.header_1.da_header.signed_header.header.chain_id
!= self.header_2.da_header.signed_header.header.chain_id
Expand Down

0 comments on commit 1693300

Please sign in to comment.