From db42ee24d475354462ba716a4ebba43b47dc1930 Mon Sep 17 00:00:00 2001 From: Farhad Shabani Date: Tue, 21 Nov 2023 18:29:04 -0800 Subject: [PATCH] fix: move consensus_state API implementation into ibc-client-tendermint --- ibc-clients/ics07-tendermint/Cargo.toml | 1 + .../ics07-tendermint/src/client_state.rs | 77 ++++++++-------- .../src/client_state/misbehaviour.rs | 15 ++-- .../src/client_state/update_client.rs | 24 ++--- .../ics07-tendermint/src/consensus_state.rs | 90 +++++++++++++++++++ ibc-clients/ics07-tendermint/src/context.rs | 3 +- ibc-clients/ics07-tendermint/src/lib.rs | 3 +- .../types/src/client_state.rs | 18 ---- .../types/src/consensus_state.rs | 16 ---- .../ics07-tendermint/types/src/header.rs | 18 ++++ ibc-core/ics02-client/context/src/lib.rs | 2 +- .../cosmos/src/validate_self_client.rs | 4 +- ibc-testkit/src/hosts/block.rs | 5 +- ibc-testkit/src/testapp/ibc/clients/mod.rs | 16 ++-- ibc-testkit/src/testapp/ibc/core/core_ctx.rs | 4 +- ibc-testkit/src/testapp/ibc/core/types.rs | 4 +- .../src/utils/dummies/clients/tendermint.rs | 26 +++--- .../tests/core/ics02_client/update_client.rs | 4 +- 18 files changed, 204 insertions(+), 126 deletions(-) create mode 100644 ibc-clients/ics07-tendermint/src/consensus_state.rs diff --git a/ibc-clients/ics07-tendermint/Cargo.toml b/ibc-clients/ics07-tendermint/Cargo.toml index f13d4e078..f59ee647b 100644 --- a/ibc-clients/ics07-tendermint/Cargo.toml +++ b/ibc-clients/ics07-tendermint/Cargo.toml @@ -30,6 +30,7 @@ ibc-core-handler-types = { workspace = true } ibc-primitives = { workspace = true } # cosmos dependencies +tendermint = { workspace = true } tendermint-light-client-verifier = { workspace = true, features = ["rust-crypto"] } [features] diff --git a/ibc-clients/ics07-tendermint/src/client_state.rs b/ibc-clients/ics07-tendermint/src/client_state.rs index 4d3e3dce9..517d5da35 100644 --- a/ibc-clients/ics07-tendermint/src/client_state.rs +++ b/ibc-clients/ics07-tendermint/src/client_state.rs @@ -2,12 +2,13 @@ use ibc_client_tendermint_types::error::Error; use ibc_client_tendermint_types::proto::v1::ClientState as RawTmClientState; use ibc_client_tendermint_types::proto::{Any, Protobuf}; use ibc_client_tendermint_types::{ - client_type as tm_client_type, ClientState as TmClientState, - ConsensusState as TmConsensusState, Header as TmHeader, Misbehaviour as TmMisbehaviour, + client_type as tm_client_type, ClientState as ClientStateType, + ConsensusState as ConsensusStateType, Header as TmHeader, Misbehaviour as TmMisbehaviour, }; use ibc_core_client::context::client_state::{ ClientStateCommon, ClientStateExecution, ClientStateValidation, }; +use ibc_core_client::context::consensus_state::ConsensusState; use ibc_core_client::context::{ClientExecutionContext, ClientValidationContext}; use ibc_core_client::types::error::{ClientError, UpgradeClientError}; use ibc_core_client::types::{Height, Status, UpdateKind}; @@ -24,6 +25,7 @@ use ibc_core_host::ExecutionContext; use ibc_primitives::prelude::*; use prost::Message; +use super::consensus_state::ConsensusState as TmConsensusState; use crate::context::{ CommonContext, ExecutionContext as TmExecutionContext, ValidationContext as TmValidationContext, }; @@ -31,58 +33,59 @@ use crate::context::{ mod misbehaviour; mod update_client; -/// Newtype wrapper around the `ClientState` type imported from the `ibc-client-tendermint-types` -/// crate. This wrapper exists so that we can bypass Rust's orphan rules and implement traits -/// from `ibc::core::client::context` on the `ClientState` type. +/// Newtype wrapper around the `ClientState` type imported from the +/// `ibc-client-tendermint-types` crate. This wrapper exists so that we can +/// bypass Rust's orphan rules and implement traits from +/// `ibc::core::client::context` on the `ClientState` type. #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Clone, Debug, PartialEq)] -pub struct ClientStateWrapper(TmClientState); +pub struct ClientState(ClientStateType); -impl ClientStateWrapper { - pub fn inner(&self) -> &TmClientState { +impl ClientState { + pub fn inner(&self) -> &ClientStateType { &self.0 } } -impl From for ClientStateWrapper { - fn from(client_state: TmClientState) -> Self { +impl From for ClientState { + fn from(client_state: ClientStateType) -> Self { Self(client_state) } } -impl Protobuf for ClientStateWrapper {} +impl Protobuf for ClientState {} -impl TryFrom for ClientStateWrapper { +impl TryFrom for ClientState { type Error = Error; fn try_from(raw: RawTmClientState) -> Result { - Ok(Self(TmClientState::try_from(raw)?)) + Ok(Self(ClientStateType::try_from(raw)?)) } } -impl From for RawTmClientState { - fn from(client_state: ClientStateWrapper) -> Self { +impl From for RawTmClientState { + fn from(client_state: ClientState) -> Self { client_state.0.into() } } -impl Protobuf for ClientStateWrapper {} +impl Protobuf for ClientState {} -impl TryFrom for ClientStateWrapper { +impl TryFrom for ClientState { type Error = ClientError; fn try_from(raw: Any) -> Result { - Ok(Self(TmClientState::try_from(raw)?)) + Ok(Self(ClientStateType::try_from(raw)?)) } } -impl From for Any { - fn from(client_state: ClientStateWrapper) -> Self { +impl From for Any { + fn from(client_state: ClientState) -> Self { client_state.0.into() } } -impl ClientStateCommon for ClientStateWrapper { +impl ClientStateCommon for ClientState { fn verify_consensus_state(&self, consensus_state: Any) -> Result<(), ClientError> { let tm_consensus_state = TmConsensusState::try_from(consensus_state)?; if tm_consensus_state.root().is_empty() { @@ -229,7 +232,7 @@ impl ClientStateCommon for ClientStateWrapper { } } -impl ClientStateValidation for ClientStateWrapper +impl ClientStateValidation for ClientState where V: ClientValidationContext + TmValidationContext, V::AnyConsensusState: TryInto, @@ -310,10 +313,10 @@ where } } -impl ClientStateExecution for ClientStateWrapper +impl ClientStateExecution for ClientState where E: TmExecutionContext + ExecutionContext, - ::AnyClientState: From, + ::AnyClientState: From, ::AnyConsensusState: From, { fn initialise( @@ -372,7 +375,7 @@ where let host_timestamp = CommonContext::host_timestamp(ctx)?; let host_height = CommonContext::host_height(ctx)?; - let new_consensus_state = TmConsensusState::from(header.clone()); + let new_consensus_state = ConsensusStateType::from(header.clone()); let new_client_state = self.0.clone().with_header(header)?; ctx.store_consensus_state( @@ -381,11 +384,11 @@ where new_client_state.latest_height.revision_number(), new_client_state.latest_height.revision_height(), ), - new_consensus_state.into(), + TmConsensusState::from(new_consensus_state).into(), )?; ctx.store_client_state( ClientStatePath::new(client_id), - ClientStateWrapper::from(new_client_state).into(), + ClientState::from(new_client_state).into(), )?; ctx.store_update_time(client_id.clone(), header_height, host_timestamp)?; ctx.store_update_height(client_id.clone(), header_height, host_height)?; @@ -403,7 +406,7 @@ where ) -> Result<(), ClientError> { let frozen_client_state = self.0.clone().with_frozen_height(Height::min(0)); - let wrapped_frozen_client_state = ClientStateWrapper::from(frozen_client_state); + let wrapped_frozen_client_state = ClientState::from(frozen_client_state); ctx.store_client_state( ClientStatePath::new(client_id), @@ -430,7 +433,7 @@ where // parameters are ignored. All chain-chosen parameters come from // committed client, all client-chosen parameters come from current // client. - let new_client_state = TmClientState::new( + let new_client_state = ClientStateType::new( upgraded_tm_client_state.0.chain_id, self.0.trust_level, self.0.trusting_period, @@ -456,10 +459,10 @@ where // the root is empty. The next consensus state submitted using update // will be usable for packet-verification. let sentinel_root = "sentinel_root".as_bytes().to_vec(); - let new_consensus_state = TmConsensusState::new( + let new_consensus_state = ConsensusStateType::new( sentinel_root.into(), - upgraded_tm_cons_state.timestamp, - upgraded_tm_cons_state.next_validators_hash, + upgraded_tm_cons_state.timestamp(), + upgraded_tm_cons_state.next_validators_hash(), ); let latest_height = new_client_state.latest_height; @@ -468,7 +471,7 @@ where ctx.store_client_state( ClientStatePath::new(client_id), - ClientStateWrapper::from(new_client_state).into(), + ClientState::from(new_client_state).into(), )?; ctx.store_consensus_state( ClientConsensusStatePath::new( @@ -476,7 +479,7 @@ where latest_height.revision_number(), latest_height.revision_height(), ), - new_consensus_state.into(), + TmConsensusState::from(new_consensus_state).into(), )?; ctx.store_update_time(client_id.clone(), latest_height, host_timestamp)?; ctx.store_update_height(client_id.clone(), latest_height, host_height)?; @@ -519,7 +522,7 @@ mod tests { struct Test { name: String, height: Height, - setup: Option ClientStateWrapper>>, + setup: Option ClientState>>, want_pass: bool, } @@ -553,8 +556,8 @@ mod tests { ) .expect("Never fails"); let client_state = match test.setup { - Some(setup) => (setup)(ClientStateWrapper(client_state)), - _ => ClientStateWrapper(client_state), + Some(setup) => (setup)(ClientState(client_state)), + _ => ClientState(client_state), }; let res = client_state.validate_proof_height(test.height); diff --git a/ibc-clients/ics07-tendermint/src/client_state/misbehaviour.rs b/ibc-clients/ics07-tendermint/src/client_state/misbehaviour.rs index 9015879ff..c671ffa63 100644 --- a/ibc-clients/ics07-tendermint/src/client_state/misbehaviour.rs +++ b/ibc-clients/ics07-tendermint/src/client_state/misbehaviour.rs @@ -1,8 +1,5 @@ use ibc_client_tendermint_types::error::{Error, IntoResult}; -use ibc_client_tendermint_types::{ - check_header_trusted_next_validator_set, ConsensusState as TmConsensusState, - Header as TmHeader, Misbehaviour as TmMisbehaviour, -}; +use ibc_client_tendermint_types::{Header as TmHeader, Misbehaviour as TmMisbehaviour}; use ibc_core_client::types::error::ClientError; use ibc_core_host::types::identifiers::ClientId; use ibc_core_host::types::path::ClientConsensusStatePath; @@ -10,9 +7,10 @@ use ibc_primitives::prelude::*; use ibc_primitives::Timestamp; use tendermint_light_client_verifier::Verifier; -use super::{ClientStateWrapper, TmValidationContext}; +use super::{ClientState as TmClientState, TmValidationContext}; +use crate::consensus_state::ConsensusState as TmConsensusState; -impl ClientStateWrapper { +impl TmClientState { // verify_misbehaviour determines whether or not two conflicting headers at // the same height would have convinced the light client. pub fn verify_misbehaviour( @@ -70,7 +68,7 @@ impl ClientStateWrapper { current_timestamp: Timestamp, ) -> Result<(), ClientError> { // ensure correctness of the trusted next validator set provided by the relayer - check_header_trusted_next_validator_set(header, trusted_consensus_state)?; + header.check_trusted_next_validator_set(trusted_consensus_state.inner())?; // ensure trusted consensus state is within trusting period { @@ -101,7 +99,8 @@ impl ClientStateWrapper { .map_err(|e| ClientError::Other { description: format!("failed to parse chain id: {}", e), })?; - let trusted_state = header.as_trusted_block_state(trusted_consensus_state, &chain_id)?; + let trusted_state = + header.as_trusted_block_state(trusted_consensus_state.inner(), &chain_id)?; let options = self.0.as_light_client_options()?; let current_timestamp = current_timestamp.into_tm_time().ok_or(ClientError::Other { diff --git a/ibc-clients/ics07-tendermint/src/client_state/update_client.rs b/ibc-clients/ics07-tendermint/src/client_state/update_client.rs index b08c0ae79..89a88d520 100644 --- a/ibc-clients/ics07-tendermint/src/client_state/update_client.rs +++ b/ibc-clients/ics07-tendermint/src/client_state/update_client.rs @@ -1,7 +1,5 @@ use ibc_client_tendermint_types::error::{Error, IntoResult}; -use ibc_client_tendermint_types::{ - check_header_trusted_next_validator_set, ConsensusState as TmConsensusState, Header as TmHeader, -}; +use ibc_client_tendermint_types::{ConsensusState as ConsensusStateType, Header as TmHeader}; use ibc_core_client::context::ClientExecutionContext; use ibc_core_client::types::error::ClientError; use ibc_core_host::types::identifiers::ClientId; @@ -10,10 +8,11 @@ use ibc_primitives::prelude::*; use tendermint_light_client_verifier::types::{TrustedBlockState, UntrustedBlockState}; use tendermint_light_client_verifier::Verifier; -use super::ClientStateWrapper; +use super::ClientState; +use crate::consensus_state::ConsensusState as TmConsensusState; use crate::context::{CommonContext, ValidationContext as TmValidationContext}; -impl ClientStateWrapper { +impl ClientState { pub fn verify_header( &self, ctx: &ClientValidationContext, @@ -47,7 +46,7 @@ impl ClientStateWrapper { description: err.to_string(), })?; - check_header_trusted_next_validator_set(&header, &trusted_consensus_state)?; + header.check_trusted_next_validator_set(trusted_consensus_state.inner())?; TrustedBlockState { chain_id: &self.0.chain_id.to_string().try_into().map_err(|e| { @@ -55,7 +54,7 @@ impl ClientStateWrapper { description: format!("failed to parse chain id: {}", e), } })?, - header_time: trusted_consensus_state.timestamp, + header_time: trusted_consensus_state.timestamp(), height: header.trusted_height.revision_height().try_into().map_err( |_| ClientError::ClientSpecific { description: Error::InvalidHeaderHeight { @@ -65,7 +64,7 @@ impl ClientStateWrapper { }, )?, next_validators: &header.trusted_next_validator_set, - next_validators_hash: trusted_consensus_state.next_validators_hash, + next_validators_hash: trusted_consensus_state.next_validators_hash(), } }; @@ -104,8 +103,6 @@ impl ClientStateWrapper { where ClientValidationContext: TmValidationContext, { - let header_consensus_state = TmConsensusState::from(header.clone()); - let maybe_existing_consensus_state = { let path_at_header_height = ClientConsensusStatePath::new( client_id.clone(), @@ -124,6 +121,9 @@ impl ClientStateWrapper { description: err.to_string(), })?; + let header_consensus_state = + TmConsensusState::from(ConsensusStateType::from(header.clone())); + // There is evidence of misbehaviour if the stored consensus state // is different from the new one we received. Ok(existing_consensus_state != header_consensus_state) @@ -144,7 +144,7 @@ impl ClientStateWrapper { description: err.to_string(), })?; - if header.signed_header.header().time <= prev_cs.timestamp { + if header.signed_header.header().time <= prev_cs.timestamp() { return Ok(true); } } @@ -163,7 +163,7 @@ impl ClientStateWrapper { description: err.to_string(), })?; - if header.signed_header.header().time >= next_cs.timestamp { + if header.signed_header.header().time >= next_cs.timestamp() { return Ok(true); } } diff --git a/ibc-clients/ics07-tendermint/src/consensus_state.rs b/ibc-clients/ics07-tendermint/src/consensus_state.rs new file mode 100644 index 000000000..642462a4b --- /dev/null +++ b/ibc-clients/ics07-tendermint/src/consensus_state.rs @@ -0,0 +1,90 @@ +use ibc_client_tendermint_types::error::Error; +use ibc_client_tendermint_types::proto::v1::ConsensusState as RawTmConsensusState; +use ibc_client_tendermint_types::ConsensusState as ConsensusStateType; +use ibc_core_client::context::consensus_state::ConsensusState as ConsensusStateTrait; +use ibc_core_client::types::error::ClientError; +use ibc_core_commitment_types::commitment::CommitmentRoot; +use ibc_primitives::prelude::*; +use ibc_primitives::proto::{Any, Protobuf}; +use ibc_primitives::Timestamp; +use tendermint::{Hash, Time}; + +/// Newtype wrapper around the `ConsensusState` type imported from the +/// `ibc-client-tendermint-types` crate. This wrapper exists so that we can +/// bypass Rust's orphan rules and implement traits from +/// `ibc::core::client::context` on the `ConsensusState` type. +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq)] +pub struct ConsensusState(ConsensusStateType); + +impl ConsensusState { + pub fn inner(&self) -> &ConsensusStateType { + &self.0 + } + + pub fn timestamp(&self) -> Time { + self.0.timestamp + } + + pub fn next_validators_hash(&self) -> Hash { + self.0.next_validators_hash + } +} + +impl From for ConsensusState { + fn from(consensus_state: ConsensusStateType) -> Self { + Self(consensus_state) + } +} + +impl Protobuf for ConsensusState {} + +impl TryFrom for ConsensusState { + type Error = Error; + + fn try_from(raw: RawTmConsensusState) -> Result { + Ok(Self(ConsensusStateType::try_from(raw)?)) + } +} + +impl From for RawTmConsensusState { + fn from(consensus_state: ConsensusState) -> Self { + consensus_state.0.into() + } +} + +impl Protobuf for ConsensusState {} + +impl TryFrom for ConsensusState { + type Error = ClientError; + + fn try_from(raw: Any) -> Result { + Ok(Self(ConsensusStateType::try_from(raw)?)) + } +} + +impl From for Any { + fn from(client_state: ConsensusState) -> Self { + client_state.0.into() + } +} + +impl From for ConsensusState { + fn from(header: tendermint::block::Header) -> Self { + Self(ConsensusStateType::from(header)) + } +} + +impl ConsensusStateTrait for ConsensusState { + fn root(&self) -> &CommitmentRoot { + &self.0.root + } + + fn timestamp(&self) -> Timestamp { + self.0.timestamp.into() + } + + fn encode_vec(self) -> Vec { + >::encode_vec(self) + } +} diff --git a/ibc-clients/ics07-tendermint/src/context.rs b/ibc-clients/ics07-tendermint/src/context.rs index 99fcb4b0a..2f2579fc6 100644 --- a/ibc-clients/ics07-tendermint/src/context.rs +++ b/ibc-clients/ics07-tendermint/src/context.rs @@ -1,6 +1,5 @@ use alloc::string::ToString; -use ibc_client_tendermint_types::ConsensusState as TmConsensusState; use ibc_core_client::context::ClientExecutionContext; use ibc_core_client::types::Height; use ibc_core_handler_types::error::ContextError; @@ -9,6 +8,8 @@ use ibc_core_host::types::path::ClientConsensusStatePath; use ibc_primitives::prelude::*; use ibc_primitives::Timestamp; +use crate::consensus_state::ConsensusState as TmConsensusState; + /// Client's context required during both validation and execution pub trait CommonContext { type ConversionError: ToString; diff --git a/ibc-clients/ics07-tendermint/src/lib.rs b/ibc-clients/ics07-tendermint/src/lib.rs index 64aca6719..7971d5976 100644 --- a/ibc-clients/ics07-tendermint/src/lib.rs +++ b/ibc-clients/ics07-tendermint/src/lib.rs @@ -3,7 +3,7 @@ #![no_std] #![forbid(unsafe_code)] #![cfg_attr(not(test), deny(clippy::unwrap_used))] -#![cfg_attr(not(test), deny(clippy::disallowed_methods, clippy::disallowed_types,))] +#![cfg_attr(not(test), deny(clippy::disallowed_methods, clippy::disallowed_types))] #![deny( warnings, trivial_casts, @@ -19,6 +19,7 @@ extern crate alloc; extern crate std; pub mod client_state; +pub mod consensus_state; pub mod context; pub const TENDERMINT_CLIENT_TYPE: &str = "07-tendermint"; diff --git a/ibc-clients/ics07-tendermint/types/src/client_state.rs b/ibc-clients/ics07-tendermint/types/src/client_state.rs index d2a9f81c8..172ffdba9 100644 --- a/ibc-clients/ics07-tendermint/types/src/client_state.rs +++ b/ibc-clients/ics07-tendermint/types/src/client_state.rs @@ -22,7 +22,6 @@ use tendermint::trust_threshold::TrustThresholdFraction as TendermintTrustThresh use tendermint_light_client_verifier::options::Options; use tendermint_light_client_verifier::ProdVerifier; -use crate::consensus_state::ConsensusState as TmConsensusState; use crate::error::Error; use crate::header::Header as TmHeader; use crate::trust_threshold::TrustThreshold; @@ -394,23 +393,6 @@ impl From for Any { } } -// `header.trusted_validator_set` was given to us by the relayer. Thus, we -// need to ensure that the relayer gave us the right set, i.e. by ensuring -// that it matches the hash we have stored on chain. -pub fn check_header_trusted_next_validator_set( - header: &TmHeader, - trusted_consensus_state: &TmConsensusState, -) -> Result<(), ClientError> { - if header.trusted_next_validator_set.hash() == trusted_consensus_state.next_validators_hash { - Ok(()) - } else { - Err(ClientError::HeaderVerificationFailure { - reason: "header trusted next validator set hash does not match hash stored on chain" - .to_string(), - }) - } -} - #[cfg(all(test, feature = "serde"))] pub(crate) mod serde_tests { use serde::de::DeserializeOwned; diff --git a/ibc-clients/ics07-tendermint/types/src/consensus_state.rs b/ibc-clients/ics07-tendermint/types/src/consensus_state.rs index 1cb9a5f5f..d8ac3aaa5 100644 --- a/ibc-clients/ics07-tendermint/types/src/consensus_state.rs +++ b/ibc-clients/ics07-tendermint/types/src/consensus_state.rs @@ -1,10 +1,8 @@ //! Defines Tendermint's `ConsensusState` type -use ibc_core_client_context::consensus_state::ConsensusState as ConsensusStateTrait; use ibc_core_client_types::error::ClientError; use ibc_core_commitment_types::commitment::CommitmentRoot; use ibc_primitives::prelude::*; -use ibc_primitives::Timestamp; use ibc_proto::google::protobuf::Any; use ibc_proto::ibc::lightclients::tendermint::v1::ConsensusState as RawConsensusState; use ibc_proto::Protobuf; @@ -46,20 +44,6 @@ impl ConsensusState { } } -impl ConsensusStateTrait for ConsensusState { - fn root(&self) -> &CommitmentRoot { - &self.root - } - - fn timestamp(&self) -> Timestamp { - self.timestamp.into() - } - - fn encode_vec(self) -> Vec { - >::encode_vec(self) - } -} - impl Protobuf for ConsensusState {} impl TryFrom for ConsensusState { diff --git a/ibc-clients/ics07-tendermint/types/src/header.rs b/ibc-clients/ics07-tendermint/types/src/header.rs index f9fd3d375..f70b6f812 100644 --- a/ibc-clients/ics07-tendermint/types/src/header.rs +++ b/ibc-clients/ics07-tendermint/types/src/header.rs @@ -100,6 +100,24 @@ impl Header { Ok(()) } + // `header.trusted_validator_set` was given to us by the relayer. Thus, we + // need to ensure that the relayer gave us the right set, i.e. by ensuring + // that it matches the hash we have stored on chain. + pub fn check_trusted_next_validator_set( + &self, + trusted_consensus_state: &TmConsensusState, + ) -> Result<(), ClientError> { + if self.trusted_next_validator_set.hash() == trusted_consensus_state.next_validators_hash { + Ok(()) + } else { + Err(ClientError::HeaderVerificationFailure { + reason: + "header trusted next validator set hash does not match hash stored on chain" + .to_string(), + }) + } + } + /// Checks if the fields of a given header are consistent with the trusted fields of this header. pub fn validate_basic(&self) -> Result<(), Error> { if self.height().revision_number() != self.trusted_height.revision_number() { diff --git a/ibc-core/ics02-client/context/src/lib.rs b/ibc-core/ics02-client/context/src/lib.rs index d1aaa5ebc..65d41640d 100644 --- a/ibc-core/ics02-client/context/src/lib.rs +++ b/ibc-core/ics02-client/context/src/lib.rs @@ -6,7 +6,7 @@ #![no_std] #![forbid(unsafe_code)] #![cfg_attr(not(test), deny(clippy::unwrap_used))] -#![cfg_attr(not(test), deny(clippy::disallowed_methods, clippy::disallowed_types,))] +#![cfg_attr(not(test), deny(clippy::disallowed_methods, clippy::disallowed_types))] #![deny( warnings, trivial_numeric_casts, diff --git a/ibc-core/ics24-host/cosmos/src/validate_self_client.rs b/ibc-core/ics24-host/cosmos/src/validate_self_client.rs index 13a762a3b..e0cdb9b81 100644 --- a/ibc-core/ics24-host/cosmos/src/validate_self_client.rs +++ b/ibc-core/ics24-host/cosmos/src/validate_self_client.rs @@ -1,6 +1,6 @@ use core::time::Duration; -use ibc_client_tendermint::client_state::ClientStateWrapper; +use ibc_client_tendermint::client_state::ClientState; use ibc_core_client_context::client_state::ClientStateCommon; use ibc_core_client_types::error::ClientError; use ibc_core_client_types::Height; @@ -19,7 +19,7 @@ pub trait ValidateSelfClientContext { &self, client_state_of_host_on_counterparty: Any, ) -> Result<(), ContextError> { - let tm_client_state = ClientStateWrapper::try_from(client_state_of_host_on_counterparty) + let tm_client_state = ClientState::try_from(client_state_of_host_on_counterparty) .map_err(|_| ConnectionError::InvalidClientState { reason: "client must be a tendermint client".to_string(), }) diff --git a/ibc-testkit/src/hosts/block.rs b/ibc-testkit/src/hosts/block.rs index 05bcda6d1..be7419c65 100644 --- a/ibc-testkit/src/hosts/block.rs +++ b/ibc-testkit/src/hosts/block.rs @@ -2,10 +2,9 @@ use core::str::FromStr; +use ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; use ibc::clients::tendermint::types::proto::v1::Header as RawHeader; -use ibc::clients::tendermint::types::{ - ConsensusState as TmConsensusState, Header, TENDERMINT_HEADER_TYPE_URL, -}; +use ibc::clients::tendermint::types::{Header, TENDERMINT_HEADER_TYPE_URL}; use ibc::core::client::types::error::ClientError; use ibc::core::client::types::Height; use ibc::core::host::types::identifiers::ChainId; diff --git a/ibc-testkit/src/testapp/ibc/clients/mod.rs b/ibc-testkit/src/testapp/ibc/clients/mod.rs index c9d55ba52..639d66cf5 100644 --- a/ibc-testkit/src/testapp/ibc/clients/mod.rs +++ b/ibc-testkit/src/testapp/ibc/clients/mod.rs @@ -1,13 +1,13 @@ pub mod mock; use derive_more::{From, TryInto}; -use ibc::clients::tendermint::client_state::ClientStateWrapper; +use ibc::clients::tendermint::client_state::ClientState as TmClientState; +use ibc::clients::tendermint::consensus_state::ConsensusState as TmConsensusState; use ibc::clients::tendermint::types::{ - ConsensusState as TmConsensusState, TENDERMINT_CLIENT_STATE_TYPE_URL, - TENDERMINT_CONSENSUS_STATE_TYPE_URL, + TENDERMINT_CLIENT_STATE_TYPE_URL, TENDERMINT_CONSENSUS_STATE_TYPE_URL, }; use ibc::core::client::context::client_state::ClientState as ClientStateTrait; -use ibc::core::client::context::consensus_state::ConsensusState; +use ibc::core::client::context::consensus_state::ConsensusState as ConsensusStateTrait; use ibc::core::client::types::error::ClientError; use ibc::core::primitives::prelude::*; use ibc::primitives::proto::{Any, Protobuf}; @@ -25,7 +25,7 @@ use crate::testapp::ibc::core::types::MockContext; ClientExecutionContext = MockContext) ] pub enum AnyClientState { - Tendermint(ClientStateWrapper), + Tendermint(TmClientState), Mock(MockClientState), } @@ -36,7 +36,7 @@ impl TryFrom for AnyClientState { fn try_from(raw: Any) -> Result { if raw.type_url == TENDERMINT_CLIENT_STATE_TYPE_URL { - Ok(ClientStateWrapper::try_from(raw)?.into()) + Ok(TmClientState::try_from(raw)?.into()) } else if raw.type_url == MOCK_CLIENT_STATE_TYPE_URL { MockClientState::try_from(raw).map(Into::into) } else { @@ -56,7 +56,7 @@ impl From for Any { } } -#[derive(Debug, Clone, From, TryInto, PartialEq, ConsensusState)] +#[derive(Debug, Clone, From, TryInto, PartialEq, ConsensusStateTrait)] pub enum AnyConsensusState { Tendermint(TmConsensusState), Mock(MockConsensusState), @@ -69,7 +69,7 @@ impl TryFrom for AnyConsensusState { fn try_from(raw: Any) -> Result { if raw.type_url == TENDERMINT_CONSENSUS_STATE_TYPE_URL { - TmConsensusState::try_from(raw).map(Into::into) + Ok(TmConsensusState::try_from(raw)?.into()) } else if raw.type_url == MOCK_CONSENSUS_STATE_TYPE_URL { MockConsensusState::try_from(raw).map(Into::into) } else { diff --git a/ibc-testkit/src/testapp/ibc/core/core_ctx.rs b/ibc-testkit/src/testapp/ibc/core/core_ctx.rs index ed97e178b..1dc063ded 100644 --- a/ibc-testkit/src/testapp/ibc/core/core_ctx.rs +++ b/ibc-testkit/src/testapp/ibc/core/core_ctx.rs @@ -3,7 +3,7 @@ use core::ops::Add; use core::time::Duration; -use ibc::clients::tendermint::client_state::ClientStateWrapper; +use ibc::clients::tendermint::client_state::ClientState; use ibc::core::channel::types::channel::ChannelEnd; use ibc::core::channel::types::commitment::{AcknowledgementCommitment, PacketCommitment}; use ibc::core::channel::types::error::{ChannelError, PacketError}; @@ -53,7 +53,7 @@ impl ValidationContext for MockContext { } fn decode_client_state(&self, client_state: Any) -> Result { - if let Ok(client_state) = ClientStateWrapper::try_from(client_state.clone()) { + if let Ok(client_state) = ClientState::try_from(client_state.clone()) { client_state.inner().validate().map_err(ClientError::from)?; Ok(client_state.into()) } else if let Ok(client_state) = MockClientState::try_from(client_state.clone()) { diff --git a/ibc-testkit/src/testapp/ibc/core/types.rs b/ibc-testkit/src/testapp/ibc/core/types.rs index 153e9f09a..be31e896a 100644 --- a/ibc-testkit/src/testapp/ibc/core/types.rs +++ b/ibc-testkit/src/testapp/ibc/core/types.rs @@ -7,7 +7,7 @@ use core::fmt::Debug; use core::ops::{Add, Sub}; use core::time::Duration; -use ibc::clients::tendermint::client_state::ClientStateWrapper; +use ibc::clients::tendermint::client_state::ClientState as TmClientState; use ibc::clients::tendermint::types::TENDERMINT_CLIENT_TYPE; use ibc::core::channel::types::channel::ChannelEnd; use ibc::core::channel::types::commitment::{AcknowledgementCommitment, PacketCommitment}; @@ -520,7 +520,7 @@ impl MockContext { }) .collect(); - let client_state: ClientStateWrapper = TmClientStateConfig::builder() + let client_state: TmClientState = TmClientStateConfig::builder() .chain_id(client.client_chain_id) .latest_height(client.client_state_height) .trusting_period(client.trusting_period) diff --git a/ibc-testkit/src/utils/dummies/clients/tendermint.rs b/ibc-testkit/src/utils/dummies/clients/tendermint.rs index e95c236b1..80bace16f 100644 --- a/ibc-testkit/src/utils/dummies/clients/tendermint.rs +++ b/ibc-testkit/src/utils/dummies/clients/tendermint.rs @@ -1,12 +1,14 @@ use core::str::FromStr; use core::time::Duration; -use ibc::clients::tendermint::client_state::ClientStateWrapper; +use ibc::clients::tendermint::client_state::ClientState as TmClientState; use ibc::clients::tendermint::types::error::{Error as ClientError, Error}; use ibc::clients::tendermint::types::proto::v1::{ClientState as RawTmClientState, Fraction}; #[cfg(feature = "serde")] use ibc::clients::tendermint::types::Header; -use ibc::clients::tendermint::types::{AllowUpdate, ClientState as TmClientState, TrustThreshold}; +use ibc::clients::tendermint::types::{ + AllowUpdate, ClientState as ClientStateType, TrustThreshold, +}; use ibc::core::client::types::proto::v1::Height as RawHeight; use ibc::core::client::types::Height; use ibc::core::commitment_types::specs::ProofSpecs; @@ -15,19 +17,17 @@ use ibc::core::primitives::prelude::*; use tendermint::block::Header as TmHeader; /// Returns a dummy tendermint `ClientState` by given `frozen_height`, for testing purposes only! -pub fn dummy_tm_client_state_from_raw( - frozen_height: RawHeight, -) -> Result { +pub fn dummy_tm_client_state_from_raw(frozen_height: RawHeight) -> Result { let client_state = - TmClientState::try_from(dummy_raw_tm_client_state(frozen_height)).expect("Never fails"); + ClientStateType::try_from(dummy_raw_tm_client_state(frozen_height)).expect("Never fails"); - Ok(ClientStateWrapper::from(client_state)) + Ok(TmClientState::from(client_state)) } /// Returns a dummy tendermint `ClientState` from a `TmHeader`, for testing purposes only! -pub fn dummy_tm_client_state_from_header(tm_header: TmHeader) -> ClientStateWrapper { +pub fn dummy_tm_client_state_from_header(tm_header: TmHeader) -> TmClientState { let chain_id = ChainId::from_str(tm_header.chain_id.as_str()).expect("Never fails"); - let client_state = TmClientState::new( + let client_state = ClientStateType::new( chain_id.clone(), Default::default(), Duration::from_secs(64000), @@ -43,7 +43,7 @@ pub fn dummy_tm_client_state_from_header(tm_header: TmHeader) -> ClientStateWrap ) .expect("Never fails"); - ClientStateWrapper::from(client_state) + TmClientState::from(client_state) } /// Returns a dummy tendermint `RawTmClientState` by given `frozen_height`, for testing purposes only! @@ -87,11 +87,11 @@ pub struct ClientStateConfig { allow_update: AllowUpdate, } -impl TryFrom for ClientStateWrapper { +impl TryFrom for TmClientState { type Error = ClientError; fn try_from(config: ClientStateConfig) -> Result { - let client_state = TmClientState::new( + let client_state = ClientStateType::new( config.chain_id, config.trust_level, config.trusting_period, @@ -103,7 +103,7 @@ impl TryFrom for ClientStateWrapper { config.allow_update, )?; - Ok(ClientStateWrapper::from(client_state)) + Ok(TmClientState::from(client_state)) } } diff --git a/ibc-testkit/tests/core/ics02_client/update_client.rs b/ibc-testkit/tests/core/ics02_client/update_client.rs index bf0796f31..b629adeed 100644 --- a/ibc-testkit/tests/core/ics02_client/update_client.rs +++ b/ibc-testkit/tests/core/ics02_client/update_client.rs @@ -1,7 +1,7 @@ use core::str::FromStr; use core::time::Duration; -use ibc::clients::tendermint::client_state::ClientStateWrapper; +use ibc::clients::tendermint::client_state::ClientState; use ibc::clients::tendermint::types::proto::v1::{ClientState as RawTmClientState, Fraction}; use ibc::clients::tendermint::types::{ client_type as tm_client_type, ClientState as TmClientState, Header as TmHeader, @@ -571,7 +571,7 @@ fn test_update_synthetic_tendermint_client_duplicate_ok() { let client_state = TmClientState::try_from(raw_client_state).unwrap(); - ClientStateWrapper::from(client_state).into() + ClientState::from(client_state).into() }; let mut ibc_store = ctx_a.ibc_store.lock();