mukan-ibc/docs/versioned_docs/version-v8.5.x/02-apps/02-interchain-accounts/09-active-channels.md
Mukan Erkin Törük 6852832fe8
Some checks failed
CodeQL / Analyze (push) Waiting to run
Docker Build & Push Simapp (main) / docker-build (push) Waiting to run
golangci-lint / lint (push) Waiting to run
Tests / Code Coverage / build (amd64) (push) Waiting to run
Tests / Code Coverage / build (arm64) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[additional-args:-tags="test_e2e" name:e2e path:./e2e]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:08-wasm path:./modules/light-clients/08-wasm]) (push) Waiting to run
Tests / Code Coverage / unit-tests (map[name:ibc-go path:.]) (push) Waiting to run
Deploy to GitHub Pages / Deploy to GitHub Pages (push) Has been cancelled
Buf-Push / push (push) Has been cancelled
initial: sovereign Mukan Network fork
2026-05-11 03:18:28 +03:00

3.2 KiB

title sidebar_label sidebar_position slug
Active Channels Active Channels 9 /apps/interchain-accounts/active-channels

Understanding Active Channels

The Interchain Accounts module uses either ORDERED or UNORDERED channels.

When using ORDERED channels, the order of transactions when sending packets from a controller to a host chain is maintained.

When using UNORDERED channels, there is no guarantee that the order of transactions when sending packets from the controller to the host chain is maintained. Since ibc-go v8.3.0, the default ordering for new ICA channels is UNORDERED, if no ordering is specified in MsgRegisterInterchainAccount (previously the default ordering was ORDERED).

A limitation when using ORDERED channels is that when a packet times out the channel will be closed.

In the case of a channel closing, a controller chain needs to be able to regain access to the interchain account registered on this channel. Active Channels enable this functionality.

When an Interchain Account is registered using MsgRegisterInterchainAccount, a new channel is created on a particular port. During the OnChanOpenAck and OnChanOpenConfirm steps (on controller & host chain respectively) the Active Channel for this interchain account is stored in state.

It is possible to create a new channel using the same controller chain portID if the previously set Active Channel is now in a CLOSED state. This channel creation can be initialized programmatically by sending a new MsgChannelOpenInit message like so:

msg := channeltypes.NewMsgChannelOpenInit(portID, string(versionBytes), channeltypes.ORDERED, []string{connectionID}, icatypes.HostPortID, authtypes.NewModuleAddress(icatypes.ModuleName).String())
handler := keeper.msgRouter.Handler(msg)
res, err := handler(ctx, msg)
if err != nil {
  return err
}

Alternatively, any relayer operator may initiate a new channel handshake for this interchain account once the previously set Active Channel is in a CLOSED state. This is done by initiating the channel handshake on the controller chain using the same portID associated with the interchain account in question.

It is important to note that once a channel has been opened for a given interchain account, new channels can not be opened for this account until the currently set Active Channel is set to CLOSED.

Future improvements

Future versions of the ICS-27 protocol and the Interchain Accounts module will likely use a new channel type that provides ordering of packets without the channel closing in the event of a packet timing out, thus removing the need for Active Channels entirely. The following is a list of issues which will provide the infrastructure to make this possible: