Что сеть сохранила после заморозки

  • Frozen account сохраняет hash последнего code/data state, но не полный state, из которого его можно угадать.
  • Для recovery нужен StateInit последнего успешного состояния с совпадающим hash и средства, достаточные для погашения storage debt и исполнения.
  • Эта процедура не относится к uninit account, первому deploy или разбору bounce; каждый из них имеет другой переход состояния.
Минимальный recovery packet
АртефактОткуда получитьЧто он доказывает
Address + workchainBlock-pinned account stateКакой account восстанавливается
Frozen state hashТекущий account stateCommitment к последнему сохранённому code/data state
Exact StateInit BOCСборка и архив последнего успешного deployment/stateCode, data и library, которые можно хешировать
storage_fees_due + balanceAccount state до recoveryНужный порядок финансирования без фиксированной суммы
Последняя active transactionАрхивный trace/stateГраница между подтверждённым и предполагаемым state
Минимальный recovery packet
Артефакт
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 до любой отправки.

Решение по найденному StateInit
НаблюдениеВыводДействие
Exact BOC найден, hash совпадаетЕсть кандидат на documented recoveryРассчитать debt/value и симулировать message
Code похож, data неизвестныStateInit не воспроизведёнНе отправлять; искать архив последнего state
Hash не совпадаетЭто другой stateОстановиться: новый deploy не разморозит этот account
Account уже nonexistFrozen recovery boundary потерянНе применять эту инструкцию; нужен отдельный аудит lifecycle
Explorer показывает только статус без pinned blockEvidence недостаточноСверить archival endpoint и ledger time
Решение по найденному StateInit
Наблюдение
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. 1
    Закрепите исходное состояние

    Сохраните block/LT, frozen status, state hash, balance, storage_fees_due и последнюю active transaction.

  2. 2
    Воспроизведите StateInit

    Сериализуйте exact cells, вычислите hash и получите независимое совпадение до создания message.

  3. 3
    Рассчитайте средства

    Прочитайте актуальный debt и конфигурацию fee; оцените storage, compute и forwarding costs без обещания остатка.

  4. 4
    Соберите scoped message

    Используйте только проверенный non-bounceable internal recovery path и exact StateInit; не добавляйте несвязанную бизнес-операцию.

  5. 5
    Симулируйте и подпишите

    Проверьте destination, attached value, init cell, body и отправителя на декодированном payload.

  6. 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 — причина отложить подпись, а не выбрать удобный ответ.

Источники

Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.

  1. TON Docs — Account status TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
  2. TON Docs — Deploy message and StateInit TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
  3. TON Docs — Transaction fees TON Docs · Проверено 23 августа 2026 г. в 15:39 GMT+5
  4. TON Blockchain — block.tlb account state schema TON Blockchain · Проверено 23 августа 2026 г. в 15:39 GMT+5
Материал носит информационный характер и не является индивидуальной рекомендацией. Криптоактивы связаны с риском волатильности, технических сбоев, хищения и полной потери средств.