Обработчики сообщений (receive) в Tact

Настроишь текстовые, бинарные и fallback receive-обработчики и поймёшь, какой receiver сработает первым.

Receive в Tact

Контракт на TON не «вызывают как функцию» — ему отправляют сообщение. receive регистрирует обработчик входящего internal сообщения по форме тела: пустое, строка, типизированный message или сырой Slice.


Несколько receivers в одном контракте

tact (fallback highlight)
// @tact-lang/compiler 1.6.13

message SetValue {
    value: Int as uint32;
}

contract ReceiverDemo(
    value: Int as uint32,
) {
    // 1. Пустое тело (деплой, empty ping)
    receive() {
        cashback(sender());
    }

    // 2. Текстовый комментарий (op = 0, затем строка)
    receive("increment") {
        self.value += 1;
        cashback(sender());
    }

    // 3. Бинарное тело с авто-opcode от Tact
    receive(msg: SetValue) {
        self.value = msg.value;
        cashback(sender());
    }

    // 4. Fallback — всё, что не совпало выше
    receive(raw: Slice) {
        // неизвестный op / произвольные данные
        throw(404);
    }

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

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

  • Порядок матчинга: пустой → строковые → типизированные messageSlice fallback.
  • receive("increment") удобен для ручных тестов из кошелька (comment), но для прод-API лучше бинарные message.
  • receive(msg: SetValue) — компилятор проверяет типы и сам пишет сериализацию.
  • receive(raw: Slice) — последний рубеж; без него неизвестное тело часто даёт exit code об отсутствии receiver.
  • External-сообщения (recv_external) в Tact оформляются отдельно через external, не через обычный receive.

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

Два receiver на один и тот же вид тела → ошибка компиляции или недостижимый код; оставь один точный матч.

Ждёшь строковый "increment" из TS, а шлёшь бинарный cell → сработает не тот handler (или fallback).

Тяжёлая логика в receive() без проверки context().value → контракт может уйти в минус по storage/gas при спаме пустыми сообщениями.


Что дальше

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