| Поле | Зачем фиксировать | Частая ошибка |
|---|---|---|
| Source/destination chain IDs | Выбрать правильные state и clients | Смотреть одноимённую сеть из другого environment |
| Source port + source channel + sequence | Однозначно найти commitment | Искать только по tx hash получателя |
| Timeout height/timestamp | Определить допустимую timeout branch | Сравнивать source height вместо destination |
| Denom trace и amount | Понять escrow/burn и возвращаемый asset | Ждать token symbol без учёта channel path |
- Поле
- Source/destination chain IDs
- Зачем фиксировать
- Выбрать правильные state и clients
- Частая ошибка
- Смотреть одноимённую сеть из другого environment
- Поле
- Source port + source channel + sequence
- Зачем фиксировать
- Однозначно найти commitment
- Частая ошибка
- Искать только по tx hash получателя
- Поле
- Timeout height/timestamp
- Зачем фиксировать
- Определить допустимую timeout branch
- Частая ошибка
- Сравнивать source height вместо destination
- Поле
- Denom trace и amount
- Зачем фиксировать
- Понять escrow/burn и возвращаемый asset
- Частая ошибка
- Ждать token symbol без учёта channel path
Один packet оставляет следы на обеих chain
На source chain MsgTransfer проверяет отправителя, receiver, token, source port/channel и deadline, затем приложение выполняет send logic вместе с sendPacket. Core IBC сохраняет commitment, включающий данные packet и timeout. Relayer переносит доказательство на destination; destination обрабатывает receive и пишет acknowledgement. Другой relay доставляет ack обратно, после чего source удаляет commitment и вызывает application callback.
Такой маршрут похож на кроссчейн-мост только на уровне пользовательской задачи. Безопасность IBC опирается на clients, connections, channels и proofs конкретных chain, а ICS-20 задаёт token application. Перед переводом сверяйте channel counterparty и denom trace, а не только знакомый ticker.
Receive, acknowledgement и timeout взаимно ограничивают друг друга
Реконструкция состояния без повторной отправки
- 1Разобрать source tx
Сохраните MsgTransfer event, port/channel, sequence, packet data, amount/denom, sender/receiver и оба timeout fields.
- 2Проверить commitment
Убедитесь, что он существовал после send. Его отсутствие позже может означать обработанный ack/timeout, но не раскрывает ветку без событий.
- 3Искать recv на destination
Сопоставьте те же packet fields и success/error acknowledgement. Баланс интерфейса не заменяет receive transaction.
- 4Искать обратную обработку
На source найдите acknowledgement или timeout callback и точный transaction hash relayer.
- 5Сверить token result
Проверьте фактический balance/event receiver при success либо refund receiver/amount при error или timeout.
| Наблюдение | Статус | Recovery |
|---|---|---|
| Recv success, ack ещё не на source | Asset мог быть зачислен, lifecycle не закрыт на source | Не timeout; дождаться/проверить reverse relay |
| Recv error, error ack обработан | Destination отклонила application result | Подтвердить ICS-20 refund на source |
| Deadline прошёл, recv не доказан, timeout tx отсутствует | Packet ожидает доказанного timeout | Проверить client/relayer и подготовить timeout relay |
| Timeout callback обработан | Packet больше не должен приниматься destination | Сверить refund receiver, denom и raw amount |
| Commitment исчез, ветка неизвестна | Данных одного query недостаточно | Найти ack/timeout events и исторический block |
- Наблюдение
- Recv success, ack ещё не на source
- Статус
- Asset мог быть зачислен, lifecycle не закрыт на source
- Recovery
- Не timeout; дождаться/проверить reverse relay
- Наблюдение
- Recv error, error ack обработан
- Статус
- Destination отклонила application result
- Recovery
- Подтвердить ICS-20 refund на source
- Наблюдение
- Deadline прошёл, recv не доказан, timeout tx отсутствует
- Статус
- Packet ожидает доказанного timeout
- Recovery
- Проверить client/relayer и подготовить timeout relay
- Наблюдение
- Timeout callback обработан
- Статус
- Packet больше не должен приниматься destination
- Recovery
- Сверить refund receiver, denom и raw amount
- Наблюдение
- Commitment исчез, ветка неизвестна
- Статус
- Данных одного query недостаточно
- Recovery
- Найти ack/timeout events и исторический block
Refund возвращает protocol amount, а не все расходы пользователя
ICS-20 на исходном направлении escrow-ит local asset и выпускает voucher на принимающей стороне; при обратном направлении сжигает voucher и unescrow-ит исходный denom. Failure acknowledgement и timeout вызывают refundTokens: escrowed asset возвращается либо voucher mint-ится обратно отправителю. Network fees, relayer fees, middleware fees или изменение отображаемого denom этой формулой не обещаны.
Проверяйте raw amount и полный denom path. Сумма в интерфейсе может отличаться из-за decimals отображения, а тот же base denom после другого channel имеет другой trace. Для результата сохраните transaction hashes обеих chain, packet identity и balance delta; материал «подтверждение перевода» помогает оформить доказательство, но не заменяет IBC state.
Проверяемый итог — source/destination chain IDs, port/channel/sequence, send/recv/ack или timeout tx hashes, timeout height/timestamp, client height, denom trace, raw amount и финальный receiver balance. Если block ещё может быть реорганизован, отметьте уровень finality и повторите query после достаточных подтверждений.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- IBC spec — channel and packet semantics Cosmos Docs / IBC · Проверено 22 августа 2026 г. в 10:38 GMT+5
- ICS-20 fungible token transfer spec Cosmos Docs / IBC · Проверено 22 августа 2026 г. в 10:38 GMT+5
- ibc-go v10.1.x — transfer messages Cosmos SDK / IBC-Go · Проверено 22 августа 2026 г. в 10:38 GMT+5
- ibc-go v10.1.x — transfer events Cosmos SDK / IBC-Go · Проверено 22 августа 2026 г. в 10:38 GMT+5
