#ibc #handler #cosmos #blockchain #entry-point

no-std ibc-core-handler

Maintained by ibc-rs, exposes IBC handler entry points for an integrated IBC core modules. These entry points are responsible for processing incoming IBC messages, performing validation, and execution logic by invoking the appropriate module handler

9 releases (5 breaking)

0.53.0 May 14, 2024
0.52.0 Apr 26, 2024
0.51.0 Mar 26, 2024
0.50.0 Jan 24, 2024
0.48.1 Nov 27, 2023

#1995 in Magic Beans

Download history 1570/week @ 2024-02-26 3403/week @ 2024-03-04 1969/week @ 2024-03-11 2797/week @ 2024-03-18 1940/week @ 2024-03-25 900/week @ 2024-04-01 1162/week @ 2024-04-08 710/week @ 2024-04-15 1725/week @ 2024-04-22 1258/week @ 2024-04-29 1187/week @ 2024-05-06 1361/week @ 2024-05-13 1256/week @ 2024-05-20 1161/week @ 2024-05-27 2297/week @ 2024-06-03 917/week @ 2024-06-10

5,660 downloads per month
Used in 14 crates (via ibc-core)


4.5K SLoC

IBC Core

This is the top-level library that re-exports the Inter-Blockchain Communication (IBC) core modules as a meta-crate. It serves to simplify the process of importing and integrating various IBC core modules into your blockchain.

IBC is a distributed protocol that enables communication between distinct sovereign blockchains and IBC core is the part of the protocol that handles the transport, authentication, and ordering (TAO) of data packets.

The structure within the ibc-core crate is designed to provide flexibility for external users. You can choose to utilize the entire ibc-core crate, or selectively import specific libraries. From there, you also have the flexibility of bringing in an entire sub-module (e.g. the ibc-core-client crate), or only a module's associated data structures (e.g. ibc-core-client-types).

This versatility empowers hosts, including chain integrators, relayers, or any IBC tooling projects, to build their solution on top of the layers that best suit their particular requirements.


Currently, the ibc-core crate contains the implementation of the following IBC core specifications:

ICS-02: Client Semantics

ICS-03: Connection Semantics

ICS-04: Channel and Packet Semantics

ICS-24: Host Requirements

ICS-25: Handler Interface

ICS-26: Routing Module

Divergence from the Interchain Standards (ICS)

This crate diverges from the ICS specification in a number of ways. See below for more details.

Module system: no support for untrusted modules

ICS-24 (Host Requirements) gives the following requirement about the module system that the host state machine must support:

The host state machine must support a module system, whereby self-contained, potentially mutually distrusted packages of code can safely execute on the same ledger [...].

This crate currently does not support mutually distrusted packages. That is, modules on the host state machine are assumed to be fully trusted. In practice, this means that every module has either been written by the host state machine developers, or fully vetted by them.

Port system: No object capability system

ICS-05 (Port Allocation) requires the host system to support either object-capability reference or source authentication for modules.

In the former object-capability case, the IBC handler must have the ability to generate object-capabilities, unique, opaque references which can be passed to a module and will not be duplicable by other modules. [...] In the latter source authentication case, the IBC handler must have the ability to securely read the source identifier of the calling module, a unique string for each module in the host state machine, which cannot be altered by the module or faked by another module.

This crate currently requires neither of the host system. Since modules are assumed to be trusted, there is no need for this object capability system that protects resources for potentially malicious modules.

For more background on this, see this issue.

Port system: transferring and releasing a port

ICS-05 (Port Allocation) requires the IBC handler to permit transferring ownership of a port and releasing a port.

We currently support neither.

Asynchronous acknowledgements

The standard gives the ability for modules to acknowledge packets asynchronously. This allows modules to receive the packet, but only applying the changes at a later time (after which they would write the acknowledgement).

We currently force applications to process the packets as part of onRecvPacket(). If you need asynchronous acknowledgements for your application, please open an issue.

Note that this still makes us 100% compatible with ibc-go.


IBC is specified in English in the cosmos/ibc repo. Any protocol changes or clarifications should be contributed there.

If you're interested in contributing, please take a look at the CONTRIBUTING guidelines. We welcome and appreciate community contributions!


~316K SLoC