Documentation Index
Fetch the complete documentation index at: https://docs.cosmos.network/llms.txt
Use this file to discover all available pages before exploring further.
How IBC works
This page explains how IBC works at a conceptual level, from the problem it solves to the components that make cross-chain communication possible.IBC Overview
In the IBC overview, you learned that IBC solves the chain isolation problem by letting blockchains exchange messages with cryptographic verification instead of solely relying on a centralized bridge or oracle. IBC is flexible in how that verification works: each chain runs a light client to verify the other chain’s state, and different light client types support different verification approaches. For example, a consensus light client tracks block headers and validates them against the counterparty’s consensus rules. An attestation light client relies on a set of attestors to attest to the counterparty’s state. In each case, both chains perform their own verification independently rather than solely depending on a shared bridge operator. Every cross-chain IBC message is wrapped in a packet. A packet contains routing information (which chains are involved, when it expires) and one or more payloads, where each payload is the actual application data: a token transfer, a contract call, or an arbitrary message. IBC itself is agnostic to the payload; it moves packets reliably and lets applications decide what to do with them. Packets are ferried between chains by a relayer, which is an off-chain process whose only job is to ensure that packets are flowing. Relayers carry no special trust: each chain independently verifies everything the relayer submits using its own local copy of the other chain’s state (the light client). Below is a high-level diagram of an IBC cross-chain token transfer:
Packets
A packet is the unit of communication in IBC. Every cross-chain action (a token transfer, a contract call, an arbitrary message) is wrapped in a packet and sent through the protocol. A packet contains two things: routing information and one or more payloads. The routing information tells the protocol which chains are involved, which sequence number this packet is, and when it expires. This is what IBC Core (the on-chain IBC logic) uses to track the packet, verify proofs against it, and prevent replay. The payloads carry the actual message data, which ports are involved, and the raw bytes of the message itself. IBC Core treats those bytes as opaque and passes them through untouched. A single packet can carry multiple payloads, which execute atomically (all succeed or all fail). Every packet has a timeout. If it is not delivered before the deadline, the sender can prove it was never received and the application rolls back. Packets are never silently lost, and every packet either completes or times out.Light Clients
Unlike a traditional bridge, IBC does not depend on a single trusted operator. Instead, each chain maintains a light client: an on-chain program that verifies the counterparty chain’s state. Light clients come in different forms depending on the chains and information involved. A consensus light client tracks the counterparty’s block headers and validates them against its consensus rules, using validator signatures or ZK proofs. Because each block header commits to a cryptographic root of the chain’s state, any specific fact about that state can be proven with a Merkle proof. When a packet arrives on Chain B, Chain B’s consensus light client of Chain A verifies that the packet was actually committed on Chain A, without replaying Chain A’s transactions or trusting anyone to report it honestly. For a detailed overview of the Tendermint consensus light client, see the Tendermint Light Client page. An attestation light client does not track block headers directly. Instead, it relies on a configured set of registered attestors to attest to the state of the counterparty chain using ECDSA signatures. This makes IBC usable in contexts where full consensus verification is not practical. In this model, attestors query the state of the source chain at a specific block height, locate the relevant packet commitment, and produce a signed hash of that commitment. These signatures are collected and bundled before being relayed to the destination chain. The attestation light client then verifies that the bundle contains enough valid signatures from registered attestors to meet the quorum threshold, and that all signatures attest to the same commitment. If quorum is met, the packet is accepted. Attestation clients can be used to connect to different chains (like Cosmos and EVM chains). For a detailed overview of attestation light clients, see the Attestation Light Client page. To connect two chains, Chain A creates a light client of Chain B, and Chain B creates a light client of Chain A. Each chain then registers the other’s light client ID as its counterparty. Once both sides are registered, the two chains can exchange packets.Relayers
A relayer is an off-chain process that watches for events on one chain and submits the corresponding transactions on the other. With a Tendermint (consensus) light client, when a packet is committed on Chain A:- The relayer fetches a Merkle proof of that commitment from Chain A.
- It submits the packet data and proof to Chain B.
- Chain B verifies the proof against its light client of Chain A.
- The packet is processed and an acknowledgement is written on Chain B.
- The relayer relays the acknowledgement back to Chain A the same way.
- If the packet is not delivered before its timeout, the relayer proves non-receipt to Chain A instead and the send is rolled back.