Первый контракт на Tact: структура файла
Разберёшь структуру Tact-контракта: параметры состояния, receive, get-методы — и соберёшь рабочий Counter.
Структура Tact-контракта
Tact-файл описывает один контракт: постоянное состояние, обработчики входящих сообщений и get-методы для чтения снаружи. Состояние задаётся параметрами контракта при деплое — отдельный init() для простых случаев не нужен.
Пишем Counter
Как это работает
message Add— типизированное тело внутреннего сообщения; Tact сериализует opcode и поля в cell.contract Counter(...)— параметры контракта = поля storage; нельзя смешивать с явнымinit().Int as uint32— тип в Tact широкий (Int),as uint32задаёт компактную сериализацию в storage/сообщении.receive()— ловит сообщения с пустым телом (деплой, empty bounce-safe ping).receive(msg: Add)— бинарный receiver по типу сообщения.cashback(sender())— возвращает остатокvalueотправителю после оплаты газа.get fun— только off-chain (RPC/run_get_method); другие контракты get-методы не вызывают.
Частые ошибки
Параметры контракта + init() вместе → ошибка компиляции. Выбери один способ инициализации.
Ждёшь, что get fun вызовет другой контракт → on-chain читают только через сообщения и своё локальное состояние.
Забыл as uintN на часто меняющихся полях → раздутый storage и лишний газ на каждую запись.
Что дальше
- Первый контракт на FunC: структура файла — тот же Counter на низком уровне
- Обработчики сообщений (receive) в Tact — текстовые, бинарные и fallback receivers
- Get-методы: чтение состояния контракта — как дергать getters из TypeScript
Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация