StateInit
Сериализованное начальное состояние смарт-контракта в TON: код (cell) + data (cell) + опциональные поля. Хеш StateInit'а — основа TON-адреса контракта в данном workchain'е.
Синонимы: state init, state_init, init-state, статеинит
StateInit — структура данных в TON, описывающая «начальное состояние» смарт-контракта на момент деплоя. Формальное TL-B-описание:
StateInit = { split_depth?, special?, code:Cell?, data:Cell?, library:HashmapE 256 SimpleLib }
В практике 99% контрактов используют только два поля: code (cell с TVM-байткодом) и data (cell с начальным значением хранилища).
Зачем нужен
- Адрес контракта = workchain : SHA256(StateInit). То есть адрес у TON-контракта детерминирован: зная code + data до деплоя, вы знаете адрес. Никаких «сначала деплой, потом узнаём адрес», как в Ethereum (до CREATE2).
- Деплой = первая транзакция к адресу, в теле которой пришёл StateInit. Контракт «вспыхивает» из небытия, когда первое сообщение принесёт ему body + StateInit.
- Кошельки v3/v4/v5 — это всё конкретные шаблоны StateInit: один и тот же
code(под версию), разныеdata(публичный ключ владельца, seqno).
Практическое следствие
Если вы знаете публичный ключ владельца и версию кошелька, вы математически знаете адрес его кошелька без обращения к сети. Это базовая операция в @ton/ton SDK:
const wallet = WalletContractV4.create({ publicKey, workchain: 0 });
console.log(wallet.address.toString()); // адрес ещё не задеплоенного кошелька
Для forensics и аудита
StateInit — главная точка фиксации идентичности контракта. Подмена кода = смена адреса. Невозможно «незаметно подменить байткод» по существующему адресу — это другой контракт по определению. Upgradeable-контракты на TON работают через SETCODE-инструкцию, и факт обновления виден on-chain в транзакции, а не через смену адреса.