Tact vs FunC

Сравнение Tact и FunC для разработчика на TON: что выбрать для контракта и когда нужен низкоуровневый контроль.

Tact vs FunC — коротко

Для нового контракта в 2026 бери Tact: типизация, синтаксис ближе к TypeScript/Rust, меньше шансов ошибиться в сериализации сообщений. FunC нужен, когда оптимизируешь газ/байткод, читаешь легаси-код (стандартные jetton/NFT) или пишешь примитивы уровня TVM.


Таблица сравнения

ПараметрTactFunC
УровеньВысокоуровневый, компилируется в FunCНизкоуровневый, ближе к TVM
ТипыСтатическая типизация, структуры, traitsСтек и ячейки, типы слабее выражены
Сообщенияreceive(), typed receiversРучной parse/pack через slices/builders
Кривая обученияНиже, если знаешь TS/RustВыше: стек, continuation, gas
Контроль над байткодомОграниченныйПолный
Экосистема 2026Основной путь в Blueprint / TON DocsЛегаси-стандарты, тонкая оптимизация

Когда выбрать Tact

  • Новый jetton, NFT, vault, escrow, marketplace
  • Команда пишет на TypeScript и хочет один стиль «контракт ↔ клиент»
  • Нужны тесты в @ton/sandbox без ручной возни с сериализацией
  • Прототип → продакшен без переписывания на FunC «на всякий случай»

Когда выбрать FunC

  • Правишь или форкаешь стандартный контракт, уже написанный на FunC
  • Критичен каждый gas unit (highload, DEX core, batch-рассылки)
  • Нужен паттерн, который Tact ещё плохо выражает (редкие TVM-инструкции, кастомный layout ячеек)
  • Разбираешь байткод / audit низкоуровневой логики

Пример кода

Один и тот же счётчик — разница в объёме «клея» вокруг сообщения:

tact (fallback highlight)
// Tact 1.6+
contract Counter {
    value: Int as uint32;

    init() {
        self.value = 0;
    }

    receive("increment") {
        self.value = self.value + 1;
    }

    get fun value(): Int {
        return self.value;
    }
}
func (fallback highlight)
;; FunC — тот же счётчик, ручной разбор op
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
  if (in_msg_body.slice_empty?()) { return (); }
  int op = in_msg_body~load_uint(32);
  if (op == 1) { ;; increment
    int value = get_data().begin_parse().~load_uint(32);
    set_data(begin_cell().store_uint(value + 1, 32).end_cell());
  }
}

В типовом продукте выигрывает Tact: меньше кода, меньше ошибок в op-кодах и layout. FunC оставляй для мест, где без стека и ручной упаковки не обойтись.

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