Что сеть сохранила после заморозки
- Frozen account сохраняет hash последнего code/data state, но не полный state, из которого его можно угадать.
- Для recovery нужен StateInit последнего успешного состояния с совпадающим hash и средства, достаточные для погашения storage debt и исполнения.
- Эта процедура не относится к uninit account, первому deploy или разбору bounce; каждый из них имеет другой переход состояния.
| Артефакт | Откуда получить | Что он доказывает |
|---|---|---|
| Address + workchain | Block-pinned account state | Какой account восстанавливается |
| Frozen state hash | Текущий account state | Commitment к последнему сохранённому code/data state |
| Exact StateInit BOC | Сборка и архив последнего успешного deployment/state | Code, data и library, которые можно хешировать |
| storage_fees_due + balance | Account state до recovery | Нужный порядок финансирования без фиксированной суммы |
| Последняя active transaction | Архивный trace/state | Граница между подтверждённым и предполагаемым state |
- Артефакт
- Address + workchain
- Откуда получить
- Block-pinned account state
- Что он доказывает
- Какой account восстанавливается
- Артефакт
- Frozen state hash
- Откуда получить
- Текущий account state
- Что он доказывает
- Commitment к последнему сохранённому code/data state
- Артефакт
- Exact StateInit BOC
- Откуда получить
- Сборка и архив последнего успешного deployment/state
- Что он доказывает
- Code, data и library, которые можно хешировать
- Артефакт
- storage_fees_due + balance
- Откуда получить
- Account state до recovery
- Что он доказывает
- Нужный порядок финансирования без фиксированной суммы
- Артефакт
- Последняя active transaction
- Откуда получить
- Архивный trace/state
- Что он доказывает
- Граница между подтверждённым и предполагаемым state
Frozen хранит проверку прошлого, а не само прошлое
По текущей TON Documentation ранее active account с изменявшимся state переходит в frozen, когда непогашенный storage debt превышает 0.1 GRAM. В frozen остаётся state hash последнего account state, а code и persistent data уже не доступны для исполнения. Порог и переход относятся к текущим протокольным правилам на дату проверки; их надо перечитать при изменении конфигурации или документации.
Адрес TON вычисляется из StateInit, но одной формы адреса недостаточно. Для unfreeze нужен valid last state: StateInit последней успешной транзакции до заморозки, чей hash совпадает с сохранённым frozen state. Форматы адресов TON помогают не перепутать workchain и account ID, но bounceable-представление не восстанавливает code/data и не доказывает совпадение state.
StateInit надо воспроизвести байт-в-байт
StateInit включает code, data, optional library и другие сериализованные поля. Совпадение исходников или версии компилятора не гарантирует тот же cell tree: constructor data, public keys, salts, library references и layout могли отличаться. Надёжный путь — извлечь последний подтверждённый BOC из собственного deployment archive или воспроизводимой сборки и локально сравнить вычисленный hash с frozen state до любой отправки.
| Наблюдение | Вывод | Действие |
|---|---|---|
| Exact BOC найден, hash совпадает | Есть кандидат на documented recovery | Рассчитать debt/value и симулировать message |
| Code похож, data неизвестны | StateInit не воспроизведён | Не отправлять; искать архив последнего state |
| Hash не совпадает | Это другой state | Остановиться: новый deploy не разморозит этот account |
| Account уже nonexist | Frozen recovery boundary потерян | Не применять эту инструкцию; нужен отдельный аудит lifecycle |
| Explorer показывает только статус без pinned block | Evidence недостаточно | Сверить archival endpoint и ledger time |
- Наблюдение
- Exact BOC найден, hash совпадает
- Вывод
- Есть кандидат на documented recovery
- Действие
- Рассчитать debt/value и симулировать message
- Наблюдение
- Code похож, data неизвестны
- Вывод
- StateInit не воспроизведён
- Действие
- Не отправлять; искать архив последнего state
- Наблюдение
- Hash не совпадает
- Вывод
- Это другой state
- Действие
- Остановиться: новый deploy не разморозит этот account
- Наблюдение
- Account уже nonexist
- Вывод
- Frozen recovery boundary потерян
- Действие
- Не применять эту инструкцию; нужен отдельный аудит lifecycle
- Наблюдение
- Explorer показывает только статус без pinned block
- Вывод
- Evidence недостаточно
- Действие
- Сверить archival endpoint и ledger time
Value должен погасить storage debt, но универсальной суммы нет
Storage fee зависит от bits, cells, прошедшего времени и config parameter 18; к сообщению добавляются другие фазы и комиссии. Для рассматриваемого здесь documented non-bounceable internal path frozen account возвращается в active, когда передан valid last StateInit и storage_fees_due после Storage phase становится нулём. Считайте текущий debt непосредственно перед отправкой и добавляйте проверяемый запас по симуляции, а не копируйте старую сумму из чужого кейса.
Контролируемая попытка восстановления
- 1Закрепите исходное состояние
Сохраните block/LT, frozen status, state hash, balance, storage_fees_due и последнюю active transaction.
- 2Воспроизведите StateInit
Сериализуйте exact cells, вычислите hash и получите независимое совпадение до создания message.
- 3Рассчитайте средства
Прочитайте актуальный debt и конфигурацию fee; оцените storage, compute и forwarding costs без обещания остатка.
- 4Соберите scoped message
Используйте только проверенный non-bounceable internal recovery path и exact StateInit; не добавляйте несвязанную бизнес-операцию.
- 5Симулируйте и подпишите
Проверьте destination, attached value, init cell, body и отправителя на декодированном payload.
- 6Подтвердите state transition
После включения прочитайте orig_status/end_status, account code/data hash, debt, balance и весь trace.
Active — ещё не доказательство целевого действия
Recovery считается подтверждённым, когда transaction показывает orig_status frozen и end_status active, восстановленные code/data соответствуют ожидаемому state, а storage debt закрыт. Затем отдельно проверяют compute/action и исходящие сообщения: фазы транзакции TON могут показать ошибку body даже после корректного state transition. Не повторяйте message, пока не установлен точный результат первой попытки.
Stop-сигналы
- сервис просит seed, private key или исходники, но не показывает вычисленный StateInit hash;
- предлагается любой похожий wallet code без persistent data последнего state;
- сумма для debt названа фиксированной без свежего account/config чтения;
- frozen путают с uninit, первым deploy или nonexist account;
- в одно message добавляют перевод активов либо вызов неизвестного метода;
- результат объявляют по исходящей подписи без transaction phases и post-state.
Если exact StateInit не воспроизводится, безопасного on-chain обхода hash-проверки нет: сохраните доказательства и остановите переводы на адрес. Для стандартного wallet дополнительно зафиксируйте его версию и seqno и valid_until только как данные отправителя следующего message, а не как способ восстановить state. Архивные чтения сверяйте через независимый RPC-узел; расхождение endpoint — причина отложить подпись, а не выбрать удобный ответ.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- TON Docs — Account status TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
- TON Docs — Deploy message and StateInit TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
- TON Docs — Transaction fees TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
- TON Blockchain — block.tlb account state schema TON Blockchain · Проверено 23 августа 2026 г. в 15:39 GMT+5
