Developers
November 12

TOLK — язык зрелой экосистемы TON: глубокое погружение в технологии и оптимизации


Александр Кирсанов, разработчик языка смарт-контрактов TOLK, на TON CIS Dev 1-Day Bootcamp в Санкт-Петербурге, который состоялся 31 августа, в своей презентации объяснил, почему TOLK не просто "синтаксический сахар", а эволюционная необходимость для The Open Network. Он раскрыл, как язык устраняет низкоуровневые сложности FunC, радикально повышает читаемость кода и, самое удивительное, обеспечивает экономию газа до 30-50% благодаря умным компиляторным оптимизациям.

Смотрите запись выступления Александра Кирсанова на YouTube или VK


1. От FunC к TOLK: мотивация эволюции

FunC был языком первопроходцев, идеально подходящим для небольших контрактов и дающим полный контроль над TVM (TON Virtual Machine). Однако с ростом экосистемы TON, появлением крупных команд и сложной финансовой инфраструктуры, низкоуровневый подход FunC стал тормозить разработку:

  • Низкая читаемость: Код был перегружен ручной работой с байтами, ячейками и срезами, что делало его похожим на "исходники Терминатора", а не на бизнес-логику.
  • Сложность дебага и аудита: Отсутствие строгой типизации заставляло разработчиков вручную отслеживать TL-схемы на бумаге, что неизбежно вело к ошибкам.
  • Низкая скорость TTM (Time to Market): Быстро прототипировать новые паттерны было невозможно, так как даже простая отправка сообщения требовала ручного кодирования.

Фото с TON CIS Dev 1-Day Bootcamp в Санкт-Петерубрге. 31 августа 2025 г.
"FunC был языком, дающим полный контроль, чтобы можно было выразить что угодно. TOLK — это язык, который позволяет выражать те паттерны, которые мы знаем, в разы проще, надежнее и эффективнее."

TOLK — это не совершенно новый язык, а эволюция, которая переносит устоявшиеся паттерны TON-разработки на уровень языка. О том, как именно начать этот переход с FunC и какие инструменты для миграции существуют, мы подробно рассказывали в статье «Tolk: новый уровень разработки смарт-контрактов TON».


2. Современные конструкции: читаемость и надежность

TOLK решает проблему FunC через внедрение современных языковых концепций, которые знакомы разработчикам, работающим с TypeScript, Rust или Kotlin.

Структуры и методы (structs)

В отличие от глобального пространства имен FunC, TOLK поддерживает структуры.

  • Structs: Позволяют объявлять сложные типы данных (например, состояние контракта Storage).
  • Нулевой оверхед: Структуры — это просто именованные наборы данных на стеке. Структура из одного поля — это один элемент на стеке, без дополнительной нагрузки.
  • Extension-методы: Методы можно объявлять над структурами, что позволяет писать короткие, понятные функции и абстрагировать логику.

Строгая типизация и union-типы

Система типов TOLK полностью заменяет ручной TL-B, позволяя разработчику сосредоточиться на декларации данных.

  • Union Types: Используются для описания входящих сообщений
    (InternalMessage | OutgoingMessage | BounceMessage), что позволяет компилятору генерировать паттерн-матчинг.
  • Nullables и Generics: Встроены на уровне языка, позволяя компилятору четко отслеживать мутабельность и наличие данных.

✉️ Автоматическая сериализация (auto-serialization)

Самый болезненный процесс в FunC — ручное кодирование и декодирование сообщений и состояния — уходит в прошлое.


3. Компилятор TOLK: экономия газа до 50%

TOLK компилируется напрямую в TVM-ассемблер, как и FunC, но делает это значительно умнее. Именно оптимизации компилятора обеспечивают 30-50% экономии газа на стандартных контрактах.

1. Агрессивный инлайнинг (Inlining)

В FunC любое разделение кода (вынос функции) приводило к оверхеду и расходу газа. Разработчики были вынуждены писать огромные, нечитаемые функции, чтобы избежать этого.

  • Компилятор TOLK умеет инлайнить короткие функции и геттеры без влияния на результирующий TVM-код.
  • Результат: Разработчик может писать чистый, абстрагированный код, а компилятор позаботится о том, чтобы конечный код был максимально коротким и эффективным.

2. Склеивание константных вызовов

TOLK автоматически объединяет последовательные низкоуровневые операции, выражающиеся в константы.

Пример: Вместо последовательных вызовов для записи 6 константных бит, компилятор TOLK склеит их в один большой константный вызов, что значительно сокращает ассемблерный код и газ. Это работает даже при наличии условий или сложений, если в итоге результат — константа.

3. Ленивая загрузка (lazy loading) с помощью lazy

Это, пожалуй, самая мощная оптимизация. Ключевое слово lazy позволяет компилятору загружать только необходимые поля из состояния контракта (Storage) или сообщения.

  • Как это работает: Если вы пишете геттер, который возвращает только поле public_key из Storage, компилятор, благодаря lazy, загрузит только необходимый блок данных (например, 256 бит), пропустив ненужные поля.
  • Lazy write: Компилятор умеет оптимизировать запись данных. Если вы загрузили структуру, изменили только одно поле, а затем сохранили структуру обратно, компилятор сгенерирует код, который обновит только это поле, оставляя остальные части ячейки нетронутыми. Это исключает необходимость полной пересборки и перезаписи ячейки, что экономит значительное количество газа.

Будущее TOLK и инфраструктура

TOLK является краеугольным камнем зрелой экосистемы. В планах разработчиков — дальнейшее развитие языка и инструментария:

  • Доработки языка: Появление полноценных Map (типизированных словарей).
  • Инфраструктура: Создание инструментов для отладки, форматирования, визуализации, кастомного ассемблера и генераторов клиентов, чтобы закрыть весь цикл разработки смарт-контрактов.

Если FunC был языком первопроходцев, то TOLK — это язык зрелой экосистемы, который будет расти вместе с TON.

Хотите узнать, как начать миграцию с FunC и как выглядят идиоматические контракты на TOLK?

Читать подробную выжимку и анализ доклада о процессе перехода и инструментах миграции


Полезные материалы для разработчиков

Знакомство с языком Tolk

Документация "Tolk vs FunC"

Примеры контрактов (token, NFT, Wallet на TOLK)

Примеры реальных контрактов тут

Конвертер FunC-to-TOLK (инструмент для миграции)

Сравнительный анализ FunC vs. TOLK (данные по расходу газа)

Документация: система типов и union (для понимания сериализации TL-схем)

Исходники компилятора

Telegram-канал языка: @tolk_lang