Owned input — это полный object ref, а не один адрес
В Sui устойчивым именем объекта служит ObjectID, но конкретный input подписывается как снимок ID + version + digest. Digest связывает ссылку с содержимым этой версии. Для address-owned object также важен текущий owner: правильный ID не даёт sender права использовать объект, который уже передан другому адресу или вложен в другой object.
| Поле | В подписанных байтах | В текущем object state | Вывод при расхождении |
|---|---|---|---|
| Object ID | Идентификатор gas/owned input | Тот же объект | Другой ID — вообще другой input |
| Version | Версия на момент сборки | Последняя доступная версия | Старая версия, вероятно, уже consumed |
| Digest | Commitment к содержимому версии | Digest текущей версии | Даже при том же ID байты state уже другие |
| Owner | Sender ожидал право использования | Address/Object/Shared/Immutable owner | Нужно заново доказать authority и тип input |
- Поле
- Object ID
- В подписанных байтах
- Идентификатор gas/owned input
- В текущем object state
- Тот же объект
- Вывод при расхождении
- Другой ID — вообще другой input
- Поле
- Version
- В подписанных байтах
- Версия на момент сборки
- В текущем object state
- Последняя доступная версия
- Вывод при расхождении
- Старая версия, вероятно, уже consumed
- Поле
- Digest
- В подписанных байтах
- Commitment к содержимому версии
- В текущем object state
- Digest текущей версии
- Вывод при расхождении
- Даже при том же ID байты state уже другие
- Поле
- Owner
- В подписанных байтах
- Sender ожидал право использования
- В текущем object state
- Address/Object/Shared/Immutable owner
- Вывод при расхождении
- Нужно заново доказать authority и тип input
Gas coin подчиняется той же модели owned object. Он не является вечным балансом по адресу: транзакция использует конкретный Coin<SUI> ref, списывает gas и в effects указывает актуальный gas object. Поэтому старый wallet cache после любой исполненной транзакции может содержать уже недействительные version и digest. Общую проверку статуса не заменяет сообщение кошелька.
Effects отвечают, был ли input уже использован
Диагностика одного подписанного intent
- 1Зафиксировать сеть и signed bytes
Сохраните chain, sender, transaction digest, payload, gas budget и каждый input ref. Не собирайте третью версию операции во время проверки.
- 2Найти transaction effects
Запросите digest через два актуальных fullnode/explorer источника. Сохраните checkpoint или иной финальный контекст, status, gas object и списки object changes.
- 3Если effects есть — проверить бизнес-state
Даже failure status расходует gas и выдаёт новую ссылку gas object. При success отдельно подтвердите получателя, созданные/изменённые objects и события.
- 4Если effects нет — прочитать каждый object ID
На одном свежем state snapshot сравните version, digest, owner и previous transaction. Первый расходящийся owned ref объясняет stale input точнее общего текста ошибки.
- 5Классифицировать lock
Если два разных digest были подписаны с одним owned ref, ищите certificate/effects каждого. Не пытайтесь победить lock новыми конкурентными подписями.
- 6Только затем пересобрать
Получите свежие refs, выберите доступный gas coin, повторно проверьте payload и подпишите новый intent один раз.
| Наблюдение | Что оно означает | Следующее действие |
|---|---|---|
| Текущая version выше signed version | Эта версия object уже сменилась | Найти previous transaction и её effects |
| Version та же, digest другой | Signed ref не аутентифицирует текущие данные | Остановиться и перепроверить источник/байты |
| Owner уже другой | Sender больше не владеет этим input в прежнем виде | Не подписывать; установить новый owner path |
| Два intent используют один owned ref | Возможен конкурентный lock/equivocation | Искать certificate; ждать финала или epoch recovery |
| Shared input содержит старое число | Это может быть initial_shared_version | Не заменять его current version механически |
- Наблюдение
- Текущая version выше signed version
- Что оно означает
- Эта версия object уже сменилась
- Следующее действие
- Найти previous transaction и её effects
- Наблюдение
- Version та же, digest другой
- Что оно означает
- Signed ref не аутентифицирует текущие данные
- Следующее действие
- Остановиться и перепроверить источник/байты
- Наблюдение
- Owner уже другой
- Что оно означает
- Sender больше не владеет этим input в прежнем виде
- Следующее действие
- Не подписывать; установить новый owner path
- Наблюдение
- Два intent используют один owned ref
- Что оно означает
- Возможен конкурентный lock/equivocation
- Следующее действие
- Искать certificate; ждать финала или epoch recovery
- Наблюдение
- Shared input содержит старое число
- Что оно означает
- Это может быть initial_shared_version
- Следующее действие
- Не заменять его current version механически
Recovery заканчивается новым object inventory, а не исчезнувшей ошибкой
Итоговый журнал должен связать old transaction digest с effects или доказанным отсутствием effects, перечислить старые и текущие refs, previous transaction каждого изменившегося object, owner и выбранный новый gas coin. После новой отправки снова проверьте effects и целевой state. Похожая внешне очередь sequence number в Aptos и blockhash в Solana имеет другие правила: переносить их recovery-команды в Sui нельзя.
Стоп-сигналы
- сервис просит seed или private key, чтобы «разблокировать» object;
- wallet предлагает бесконечно повторять старые signed bytes без проверки digest;
- источники показывают разные owner/version, но один из них объявляют правильным без checkpoint/state context;
- Move failure принимают за отсутствие effects и повторяют перевод;
- shared initial version заменяют последней версией owned-object способом.
Если старый intent не находится, а current ref уже другой, не угадывайте результат по балансу одного gas coin. Проверьте все затронутые object changes и контекст перевода. Базовая памятка о подтверждении перевода помогает отделить сетевой факт от уведомления приложения.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Sui source — transaction inputs and ObjectArg Mysten Labs · Проверено 24 августа 2026 г. в 11:17 GMT+5
- Sui source — ObjectRef base types Mysten Labs · Проверено 24 августа 2026 г. в 11:17 GMT+5
- Sui source — transaction effects Mysten Labs · Проверено 24 августа 2026 г. в 11:17 GMT+5
- Sui Lutris paper — owned locks, effects and reconfiguration Mysten Labs · Проверено 24 августа 2026 г. в 09:25 GMT+5
