Skip to content

Commit

Permalink
Merge pull request #7 from crodriguezvega/carlos/use-bytes-wrapped-cl…
Browse files Browse the repository at this point in the history
…ient

refactor messages to use bytes
  • Loading branch information
misko9 authored Dec 6, 2023
2 parents 884151d + 9c885ab commit da23507
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 89 deletions.
5 changes: 4 additions & 1 deletion ibc/modules/src/core/ics23_commitment/commitment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
use crate::{core::ics23_commitment::error::Error, prelude::*, proofs::ProofError};

use core::{convert::TryFrom, fmt};
#[cfg(feature = "cosmwasm")]
use cosmwasm_schema::schemars::{self, JsonSchema};
use ibc_proto::ibc::core::commitment::v1::MerkleProof as RawMerkleProof;
use serde::{Deserialize, Serialize};
use subtle_encoding::{Encoding, Hex};
Expand Down Expand Up @@ -61,7 +63,8 @@ impl From<Vec<u8>> for CommitmentRoot {
#[derive(Clone, Debug, PartialEq)]
pub struct CommitmentPath;

#[derive(Clone, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "cosmwasm", derive(JsonSchema))]
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CommitmentProofBytes {
#[serde(serialize_with = "crate::serializers::ser_hex_upper")]
Expand Down
14 changes: 7 additions & 7 deletions light-clients/ics07-tendermint-cw/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::{
check_substitute_and_update_state, prune_oldest_consensus_state, verify_delay_passed,
verify_upgrade_and_update_state,
},
ics23::{FakeInner, ReadonlyProcessedStates},
ics23::ReadonlyProcessedStates,
msg::{
CheckForMisbehaviourMsg, ContractResult, ExportMetadataMsg, QueryMsg,
QueryResponse, StatusMsg, SudoMsg, UpdateStateMsg, UpdateStateOnMisbehaviourMsg,
Expand Down Expand Up @@ -130,16 +130,16 @@ impl CommitValidator for HostFunctions {}
impl HostFunctionsProvider for HostFunctions {}

fn process_instantiate_msg(
msg: InstantiateMessage<FakeInner, FakeInner, FakeInner>,
msg: InstantiateMessage,
ctx: &mut Context<HostFunctions>,
client_id: ClientId,
) -> Result<Binary, ContractError> {
let any = Any::decode(&mut msg.client_state.data.as_slice())?;
let any = Any::decode(&mut msg.client_state.as_slice())?;
let client_state = ClientState::decode_vec(&any.value)?;
let any = Any::decode(&mut msg.consensus_state.data.as_slice())?;
let any = Any::decode(&mut msg.consensus_state.as_slice())?;
let consensus_state = ConsensusState::decode_vec(&any.value)?;

ctx.checksum = Some(msg.client_state.checksum);
ctx.checksum = Some(msg.checksum);
let height = client_state.latest_height();
ctx.store_client_state(client_id.clone(), client_state)
.map_err(|e| ContractError::Tendermint(e.to_string()))?;
Expand All @@ -159,7 +159,7 @@ pub fn instantiate(
deps: DepsMut,
env: Env,
_info: MessageInfo,
msg: InstantiateMessage<FakeInner, FakeInner, FakeInner>,
msg: InstantiateMessage,
) -> Result<Response, ContractError> {
let client_id = ClientId::from_str(env.contract.address.as_str()).expect("client id is valid");
let mut ctx = Context::<HostFunctions>::new(deps, env);
Expand Down Expand Up @@ -294,7 +294,7 @@ fn process_message(
let old_client_state = ctx
.client_state(&client_id)
.map_err(|e| ContractError::Tendermint(e.to_string()))?;
let msg: VerifyUpgradeAndUpdateStateMsg =
let msg: VerifyUpgradeAndUpdateStateMsg<HostFunctions> =
VerifyUpgradeAndUpdateStateMsg::try_from(msg)?;
verify_upgrade_and_update_state::<HostFunctions>(
ctx,
Expand Down
33 changes: 11 additions & 22 deletions light-clients/ics07-tendermint-cw/src/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use serde::{Deserialize, Serialize};

use crate::{
context::Context,
ics23::{ConsensusStates, FakeInner, ProcessedStates},
ics23::{ConsensusStates, ProcessedStates},
msg::SudoMsg,
};
use cosmwasm_std::{to_binary, Addr, CosmosMsg, StdResult, WasmMsg};
Expand All @@ -32,12 +32,8 @@ use ibc::core::{
ics23_commitment::{commitment::CommitmentProofBytes, merkle::MerkleProof},
ics24_host::identifier::ClientId,
};
use ibc_proto::{
google::protobuf::Any,
ibc::core::commitment::v1::{MerklePath, MerkleProof as RawMerkleProof},
};
use ibc_proto::ibc::core::commitment::v1::{MerklePath, MerkleProof as RawMerkleProof};
use prost::Message;
use tendermint_proto::Protobuf;

use ics07_tendermint::{
client_state::{ClientState, UpgradeOptions},
Expand All @@ -46,10 +42,7 @@ use ics07_tendermint::{
HostFunctionsProvider,
};

use ics08_wasm::{
client_state::ClientState as WasmClientState,
consensus_state::ConsensusState as WasmConsensusState, SUBJECT_PREFIX, SUBSTITUTE_PREFIX,
};
use ics08_wasm::{SUBJECT_PREFIX, SUBSTITUTE_PREFIX};

/// CwTemplateContract is a wrapper around Addr that provides a lot of helpers
/// for working with this.
Expand Down Expand Up @@ -98,8 +91,8 @@ pub fn verify_upgrade_and_update_state<H: HostFunctionsProvider + 'static>(
ctx: &mut Context<H>,
client_id: ClientId,
old_client_state: ClientState<H>,
upgrade_client_state: WasmClientState<FakeInner, FakeInner, FakeInner>,
upgrade_consensus_state: WasmConsensusState<FakeInner>,
upgrade_client_state: ClientState<H>,
upgrade_consensus_state: ConsensusState,
proof_upgrade_client: CommitmentProofBytes,
proof_upgrade_consensus_state: CommitmentProofBytes,
) -> Result<(ClientState<H>, ConsensusState), Ics02Error> {
Expand Down Expand Up @@ -162,21 +155,17 @@ pub fn verify_upgrade_and_update_state<H: HostFunctionsProvider + 'static>(
)
.unwrap();

let any = Any::decode(&mut upgrade_client_state.data.as_slice()).unwrap();
let upgrade_client_state_inner = ClientState::<H>::decode_vec(&any.value).unwrap();
let new_client_state = old_client_state.upgrade(
upgrade_client_state_inner.latest_height,
upgrade_client_state.latest_height,
UpgradeOptions {
unbonding_period: upgrade_client_state_inner.unbonding_period,
proof_specs: upgrade_client_state_inner.proof_specs.clone(),
upgrade_path: upgrade_client_state_inner.upgrade_path.clone(),
unbonding_period: upgrade_client_state.unbonding_period,
proof_specs: upgrade_client_state.proof_specs.clone(),
upgrade_path: upgrade_client_state.upgrade_path.clone(),
},
upgrade_client_state_inner.chain_id,
upgrade_client_state.chain_id,
);

let any = Any::decode(&mut upgrade_consensus_state.data.as_slice()).unwrap();
let upgrade_consensus_state_inner = ConsensusState::decode_vec(&any.value).unwrap();
Ok((new_client_state, upgrade_consensus_state_inner))
Ok((new_client_state, upgrade_consensus_state))
}

pub fn check_substitute_and_update_state<H: HostFunctionsProvider + 'static>(
Expand Down
59 changes: 31 additions & 28 deletions light-clients/ics07-tendermint-cw/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.

use crate::{contract::HostFunctions, ics23::FakeInner, Bytes, ContractError};
use crate::{Bytes, ContractError};
use core::{str::FromStr, time::Duration};
use cosmwasm_schema::cw_serde;
use ibc::{
Expand All @@ -29,10 +29,7 @@ use ibc_proto::{google::protobuf::Any, ibc::core::client::v1::Height as HeightRa
use ics07_tendermint::{
client_message::{ClientMessage, Header, Misbehaviour, TENDERMINT_HEADER_TYPE_URL, TENDERMINT_MISBEHAVIOUR_TYPE_URL},
client_state::ClientState,
};
use ics08_wasm::{
client_state::ClientState as WasmClientState,
consensus_state::ConsensusState as WasmConsensusState,
consensus_state::ConsensusState,
};
use prost::Message;
use serde::{Deserializer, Serializer};
Expand Down Expand Up @@ -155,15 +152,10 @@ pub struct MerklePath {
}

#[cw_serde]
pub struct ClientMessageRaw {
pub struct VerifyClientMessageRaw {
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub data: Bytes,
}

#[cw_serde]
pub struct VerifyClientMessageRaw {
pub client_message: ClientMessageRaw,
pub client_message: Bytes,
}

pub struct VerifyClientMessage {
Expand All @@ -180,8 +172,8 @@ impl TryFrom<VerifyClientMessageRaw> for VerifyClientMessage {
}

impl VerifyClientMessage {
fn decode_client_message(raw: ClientMessageRaw) -> Result<ClientMessage, ContractError> {
let any = Any::decode(raw.data.as_slice())?;
fn decode_client_message(raw: Bytes) -> Result<ClientMessage, ContractError> {
let any = Any::decode(&mut raw.as_slice())?;
let client_message = match &*any.type_url {
TENDERMINT_HEADER_TYPE_URL => ClientMessage::Header(Header::decode_vec(&any.value)?),
TENDERMINT_MISBEHAVIOUR_TYPE_URL => ClientMessage::Misbehaviour(Misbehaviour::decode_vec(&any.value)?),
Expand All @@ -193,7 +185,9 @@ impl VerifyClientMessage {

#[cw_serde]
pub struct CheckForMisbehaviourMsgRaw {
pub client_message: ClientMessageRaw,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub client_message: Bytes,
}

pub struct CheckForMisbehaviourMsg {
Expand All @@ -211,7 +205,9 @@ impl TryFrom<CheckForMisbehaviourMsgRaw> for CheckForMisbehaviourMsg {

#[cw_serde]
pub struct UpdateStateOnMisbehaviourMsgRaw {
pub client_message: ClientMessageRaw,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub client_message: Bytes,
}

pub struct UpdateStateOnMisbehaviourMsg {
Expand All @@ -229,7 +225,9 @@ impl TryFrom<UpdateStateOnMisbehaviourMsgRaw> for UpdateStateOnMisbehaviourMsg {

#[cw_serde]
pub struct UpdateStateMsgRaw {
pub client_message: ClientMessageRaw,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub client_message: Bytes,
}

pub struct UpdateStateMsg {
Expand Down Expand Up @@ -335,8 +333,12 @@ impl TryFrom<VerifyNonMembershipMsgRaw> for VerifyNonMembershipMsg {

#[cw_serde]
pub struct VerifyUpgradeAndUpdateStateMsgRaw {
pub upgrade_client_state: WasmClientState<FakeInner, FakeInner, FakeInner>,
pub upgrade_consensus_state: WasmConsensusState<FakeInner>,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub upgrade_client_state: Bytes,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub upgrade_consensus_state: Bytes,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub proof_upgrade_client: Bytes,
Expand All @@ -345,20 +347,21 @@ pub struct VerifyUpgradeAndUpdateStateMsgRaw {
pub proof_upgrade_consensus_state: Bytes,
}

pub struct VerifyUpgradeAndUpdateStateMsg {
pub upgrade_client_state: WasmClientState<FakeInner, FakeInner, FakeInner>,
pub upgrade_consensus_state: WasmConsensusState<FakeInner>,
pub struct VerifyUpgradeAndUpdateStateMsg<H> {
pub upgrade_client_state: ClientState<H>,
pub upgrade_consensus_state: ConsensusState,
pub proof_upgrade_client: CommitmentProofBytes,
pub proof_upgrade_consensus_state: CommitmentProofBytes,
}

impl TryFrom<VerifyUpgradeAndUpdateStateMsgRaw> for VerifyUpgradeAndUpdateStateMsg {
impl<H: Clone> TryFrom<VerifyUpgradeAndUpdateStateMsgRaw> for VerifyUpgradeAndUpdateStateMsg<H> {
type Error = ContractError;

fn try_from(raw: VerifyUpgradeAndUpdateStateMsgRaw) -> Result<Self, Self::Error> {
let any = Any::decode(&mut raw.upgrade_client_state.data.as_slice())?;
let upgrade_client_state: ics07_tendermint::client_state::ClientState<HostFunctions> =
ClientState::decode_vec(&any.value)?;
let any = Any::decode(&mut raw.upgrade_client_state.as_slice())?;
let upgrade_client_state = ClientState::decode_vec(&any.value)?;
let any = Any::decode(&mut raw.upgrade_consensus_state.as_slice())?;
let upgrade_consensus_state = ConsensusState::decode_vec(&any.value)?;
if upgrade_client_state.trust_level != TrustThreshold::ZERO ||
upgrade_client_state.trusting_period != Duration::ZERO ||
upgrade_client_state.max_clock_drift != Duration::ZERO ||
Expand All @@ -370,8 +373,8 @@ impl TryFrom<VerifyUpgradeAndUpdateStateMsgRaw> for VerifyUpgradeAndUpdateStateM
}

Ok(VerifyUpgradeAndUpdateStateMsg {
upgrade_client_state: raw.upgrade_client_state,
upgrade_consensus_state: raw.upgrade_consensus_state,
upgrade_client_state: upgrade_client_state,
upgrade_consensus_state: upgrade_consensus_state,
proof_upgrade_client: CommitmentProofBytes::try_from(raw.proof_upgrade_client)?,
proof_upgrade_consensus_state: CommitmentProofBytes::try_from(
raw.proof_upgrade_consensus_state,
Expand Down
21 changes: 12 additions & 9 deletions light-clients/ics08-wasm/src/instantiate.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
use super::client_state::ClientState;
use crate::consensus_state::ConsensusState;
use crate::Bytes;
use crate::msg::Base64;
#[cfg(feature = "cosmwasm")]
use cosmwasm_schema::cw_serde;

#[cfg_attr(feature = "cosmwasm", cw_serde)]
#[cfg_attr(not(feature = "cosmwasm"), derive(Clone, Debug, PartialEq))]
#[derive(Eq)]
pub struct InstantiateMessage<
AnyClient: Default,
AnyClientState: Default,
AnyConsensusState: Default,
> {
pub client_state: ClientState<AnyClient, AnyClientState, AnyConsensusState>,
pub consensus_state: ConsensusState<AnyConsensusState>,
pub struct InstantiateMessage {
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub client_state: Bytes,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub consensus_state: Bytes,
#[schemars(with = "String")]
#[serde(with = "Base64", default)]
pub checksum: Bytes
}
11 changes: 5 additions & 6 deletions light-clients/ics10-grandpa-cw/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
use crate::{
context::Context,
error::ContractError,
ics23::FakeInner,
log,
msg::{
CheckForMisbehaviourMsg,
Expand Down Expand Up @@ -118,17 +117,17 @@ impl grandpa_light_client_primitives::HostFunctions for HostFunctions {
}

fn process_instantiate_msg(
msg: InstantiateMessage<FakeInner, FakeInner, FakeInner>,
msg: InstantiateMessage,
ctx: &mut Context<HostFunctions>,
client_id: ClientId,
) -> Result<Binary, ContractError> {
let any = Any::decode(&mut msg.client_state.data.as_slice())?;
let any = Any::decode(&mut msg.client_state.as_slice())?;
let client_state = ClientState::decode_vec(&any.value)?;
let any = Any::decode(&mut msg.consensus_state.data.as_slice())?;
let any = Any::decode(&mut msg.consensus_state.as_slice())?;
let consensus_state = ConsensusState::decode_vec(&any.value)?;

let height = client_state.latest_height();
ctx.checksum = Some(msg.client_state.checksum);
ctx.checksum = Some(msg.checksum);
ctx.store_client_state(client_id.clone(), client_state)
.map_err(|e| ContractError::Grandpa(e.to_string()))?;
ctx.store_consensus_state(client_id, height, consensus_state)
Expand All @@ -141,7 +140,7 @@ pub fn instantiate(
deps: DepsMut,
env: Env,
_info: MessageInfo,
msg: InstantiateMessage<FakeInner, FakeInner, FakeInner>,
msg: InstantiateMessage,
) -> Result<Response, ContractError> {
let client_id = ClientId::from_str(env.contract.address.as_str()).expect("client id is valid");
let mut ctx = Context::<HostFunctions>::new(deps, env);
Expand Down
Loading

0 comments on commit da23507

Please sign in to comment.