К основному содержанию
T TON Adoption
← Словарь
NODE/03 · Term

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 в транзакции, а не через смену адреса.

См. также