Первый смарт-контракт: Counter на Tact

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

Counter — минимальный полезный контракт

Counter хранит число в persistent storage, увеличивает его по сообщению Add и отдаёт значение через get-метод. Это стандартный первый контракт в шаблоне tact-counter.

На момент публикации ориентир: Tact 1.6.13, проект через npm create ton@latest.


Код контракта

tact (fallback highlight)
// @tact-lang/compiler 1.6.13
// Файл: contracts/simple_counter.tact (имя в шаблоне может отличаться)

message Add {
    queryId: Int as uint64;
    amount: Int as uint32;
}

contract SimpleCounter(
    id: Int as uint32,
    counter: 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;
    }
}

С нуля:

bash
npm create ton@latest -- simple-counter --type tact-counter --contractName SimpleCounter
cd simple-counter
npm install
npx blueprint build
npm test

Ожидаешь: компиляция без ошибок, тесты шаблона зелёные.

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

  • message Add — типизированное внутреннее сообщение; компилятор задаёт opcode.
  • contract SimpleCounter(id, counter) — параметры = поля storage; задаются при деплое через fromInit.
  • receive() — обработчик пустого тела (деплой).
  • receive(msg: Add) — увеличивает counter на amount.
  • cashback(sender()) — возвращает остаток value после газа.
  • get fun — только off-chain (Sandbox, RPC); другие контракты getters не вызывают.

Частые ошибки

Шлёшь Add без value → не хватает газа, состояние не меняется. В тестах: toNano("0.05").

Ждёшь return value из receive как из Solidity call → на TON ответ — отдельное сообщение (здесь — cashback), не синхронный return.

Меняешь поля storage, но не пересобираешь → тесты бьются со старым BoC. После правок: npx blueprint build && npm test.


Что дальше

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