IBC

An Overview of the Inter-Blockchain Communication Protocol
This is a summary view of IBC v2 [Eureka]. For more comprehensive details, guides and more please visit the official Eureka documentation.

Core Data Structures

The Packet is the primary container for cross-chain communication in IBC v2. Each packet may wrap one or more application-specific Payload objects.
// Main container sent between chains
interface Packet {
  sourceClientId: bytes;    // Client ID for destination chain (stored on source)
  destClientId: bytes;      // Client ID for source chain (stored on destination)
  sequence: uint64;         // Monotonically increasing nonce per client-pair
  timeout: uint64;          // UNIX timestamp (seconds) for packet expiry
  data: Payload[];          // Application payload(s)
}

// Application-specific data
interface Payload {
  sourcePort: bytes;  // Sending application identifier
  destPort: bytes;    // Receiving application identifier
  version: string;    // Application version
  encoding: string;   // MIME-type for decoding
  value: bytes;       // Opaque app data
}
Timeout is measured against the destination chain’s clock, not the source. This ensures safety even under clock drift.

Key On-Chain Components

Application Interface (ICS-26)

An IBC-enabled application must implement these callbacks to manage the packet lifecycle:
  • OnRecvPacket(...) – Executed on the destination chain to process incoming data. Must return an Acknowledgement, which may contain success data or an error.
  • OnAcknowledgePacket(...) – Executed on the source chain once an acknowledgement is verified. Provides acknowledgement data so the sending application can finalize or revert actions.
  • OnTimeoutPacket(...) – Executed on the source chain if a timeout occurs, enabling rollback or refunds.

Packet Lifecycle