#cosmwasm #ibc #tendermint #light-client #ics-07

无 std ibc-client-tendermint-cw

包含 ICS-07 Tendermint 客户端逻辑的实现,作为一个 CosmWasm 合约。它利用 ibc-client-cw 包将 Tendermint 轻客户端集成到 CosmWasm 合约中

3 个版本 (重大变更)

0.54.0 2024 年 8 月 13 日
0.53.0 2024 年 5 月 14 日
0.52.0 2024 年 4 月 26 日

#818 in 神奇豆子

Download history 90/week @ 2024-04-29 499/week @ 2024-05-06 903/week @ 2024-05-13 897/week @ 2024-05-20 739/week @ 2024-05-27 785/week @ 2024-06-03 544/week @ 2024-06-10 475/week @ 2024-06-17 727/week @ 2024-06-24 638/week @ 2024-07-01 573/week @ 2024-07-08 363/week @ 2024-07-15 153/week @ 2024-07-22 23/week @ 2024-07-29 5/week @ 2024-08-05 120/week @ 2024-08-12

每月 308 次下载

Apache-2.0

150KB
2.5K SLoC

ibc-client-tendermint-cw

此包展示了如何重用 ibc-rs 轻客户端作为 CosmWasm 合约,利用 ibc-client-cw 包。

ibc-client-cw 包暴露了重用 ibc-rs 轻客户端所需的类型和特质。值得注意的是,它提供了一个 ClientType 特质,它需要两个关联类型:ClientStateConsensusState。这些类型接受任何实现 ibc-core 包中的 ClientStateExecutionConsensusState 特质的类型。

例如,要重用现有的 ibc-client-tendermint

use ibc_client_cw::api::ClientType;
use ibc_client_tendermint::client_state::ClientState;
use ibc_client_tendermint::consensus_state::ConsensusState;

#[derive(Clone, Debug)]
pub struct TendermintClient;

impl<'a> ClientType<'a> for TendermintClient {
    type ClientState = ClientState;
    type ConsensusState = ConsensusState;
}

一旦实现了 ClientType 特质,就可以使用 ibc-client-cw 包来完成 CosmWasm 合约的入口点。

use cosmwasm_std::{entry_point, Binary, Deps, DepsMut, Env, MessageInfo, Response};
use ibc_client_cw::context::Context;
use ibc_client_cw::types::{ContractError, InstantiateMsg, QueryMsg, SudoMsg};

pub type TendermintContext<'a> = Context<'a, TendermintClient>;

#[entry_point]
pub fn instantiate(
    deps: DepsMut<'_>,
    env: Env,
    _info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response, ContractError> {
    let mut ctx = TendermintContext::new_mut(deps, env)?;
    let data = ctx.instantiate(msg)?;
    Ok(Response::default().set_data(data))
}

#[entry_point]
pub fn sudo(deps: DepsMut<'_>, env: Env, msg: SudoMsg) -> Result<Response, ContractError> {
    let mut ctx = TendermintContext::new_mut(deps, env)?;
    let data = ctx.sudo(msg)?;
    Ok(Response::default().set_data(data))
}

#[entry_point]
pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result<Binary, ContractError> {
    let ctx = TendermintContext::new_ref(deps, env)?;
    ctx.query(msg)
}

上述代码片段编译成了一个完整的CosmWasm合约,实现了Tendermint IBC轻客户端。

依赖项

约22MB
约448K SLoC