How to recover an expired client with a governance proposal
See also the relevant documentation: ADR-026, IBC client recovery mechanismsWho is this information for? Although technically anyone can submit the governance proposal to recover an expired client, often it will be relayer operators (at least coordinating the submission).
Preconditions
- The chain is updated with ibc-go
>=
v1.1.0. - There exists an active client (with a known client identifier) for the same counterparty chain as the expired client.
- The governance deposit.
Steps
Step 1
Check if the client is attached to the expectedchain-id
. For example, for an expired Tendermint client representing the Akash chain the client state looks like this on querying the client state:
chain-id
. Note that although the parameters (allow_update_after_expiry
and allow_update_after_misbehaviour
) exist to signal intent, these parameters have been deprecated and will not enforce any checks on the revival of client. See ADR-026 for more context on this deprecation.
Step 2
If the chain has been updated to ibc-go>=
v1.1.0, anyone can submit the governance proposal to recover the client by executing this via CLI.
Note that the Cosmos SDK has updated how governance proposals are submitted in SDK v0.46, now requiring to pass a .json proposal file
-
From SDK v0.46.x onwards
where
proposal.json
contains:Alternatively there’s a legacy command (that is no longer recommended though): -
Until SDK v0.45.x
<expired-client-id>
identifier is the proposed client to be updated. This client must be either frozen or expired.
The <active-client-id>
represents a substitute client. It carries all the state for the client which may be updated. It must have identical client and chain parameters to the client which may be updated (except for latest height, frozen height, and chain ID). It should be continually updated during the voting period.
After this, all that remains is deciding who funds the governance deposit and ensuring the governance proposal passes. If it does, the client on trial will be updated to the latest state of the substitute.