Первый контракт на Tact: структура файла

Разберёшь структуру Tact-контракта: параметры состояния, receive, get-методы — и соберёшь рабочий Counter.

Структура Tact-контракта

Tact-файл описывает один контракт: постоянное состояние, обработчики входящих сообщений и get-методы для чтения снаружи. Состояние задаётся параметрами контракта при деплое — отдельный init() для простых случаев не нужен.


Пишем Counter

tact (fallback highlight)
// @tact-lang/compiler 1.6.13
// Файл: contracts/counter.tact

message Add {
    // opcode назначается компилятором автоматически
    amount: Int as uint32;
}

contract Counter(
    // Persistent state — значения приходят в init-данных при деплое
    counter: Int as uint32,
    id: Int as uint32,
) {
    // Пустое тело — типичный обработчик деплоя / «пинга»
    receive() {
        cashback(sender());
    }

    receive(msg: Add) {
        self.counter += msg.amount;
        cashback(sender());
    }

    get fun counter(): Int {
        return self.counter;
    }

    get fun id(): Int {
        return self.id;
    }
}

Как это работает

  • 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 и лишний газ на каждую запись.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация