Developers
October 24

Tolk: новый уровень разработки смарт-контрактов TON

Разработчик языка TOLK Александр Кирсанов, в рамках мероприятия TON CIS Dev 1-Day Bootcamp в Санкт-Петербурге, выступил с лайв-кодингом посвященным языку смарт-контрактов TOLK и его преимуществам перед FunC, особенно в контексте разработки контрактов для блокчейна The Open Network.

Фотография с TON CIS Dev 1-Day Bootcamp. Перейти к фотоотчету.

Мы подготовили выжимку с его выступления, где подчеркнули самое главное: как безболезненно и с максимальной эффективностью мигрировать с FunC на TOLK, какие современные языковые средства позволяют исключить ручную работу и почему новый язык обеспечивает лучшую читаемость кода и значительную экономию газа даже по сравнению с оптимизированными FunC-контрактами.


Переход с FunC на TOLK: просто и итеративно

Ключевой задачей для разработчиков TON, уже имеющих проекты на FunC, является безболезненный переход на TOLK.

Автоматический конвертер

Процесс миграции начинается с конвертера, который выполняет следующие шаги:

  • Он берет все файлы FunC и переносит их в файлы TOLK одной командой.
  • На выходе получается код, который не сразу является валидным.
  • Это происходит из-за различий в системах типов (например, в FunC нет bool и системы типов в целом).
  • Однако конвертер позволяет быстро получить основу, которую можно превратить в валидный код.

Итеративное улучшение и оптимизация

После конвертации начинается процесс итеративного улучшения. Разработчик постепенно устраняет ошибки и переходит на идиоматический стиль TOLK:

  • Работа с типами: Необходимо исправлять ошибки, связанные со строгой типизацией TOLK. Например, явно указывать типы, где раньше использовались универсальные срезы (slices) (например, для адресов).
  • Импорты: В FunC используется единое пространство имен, а в TOLK требуются явные импорты.
  • Обработка null: TOLK вводит понятие Nullable типов, которых нет в FunC.
  • Создание Storage: Низкоуровневые ручные операции Load Data и Save Data из FunC заменяются объявлением структур данных (Storage) с типизированными свойствами.
  • Обработка Сообщений: Сложный, низкоуровневый FunC-код для работы с сообщениями и ячейками заменяется на более чистый и понятный код с использованием структур, Create Messages и новых механизмов, таких как Sender.

Главный вывод о переходе: Разработчик берет конвертированный, работающий код, а затем итеративно (сохраняя работоспособность на каждом этапе) переписывает его на идиоматический TOLK, приходя в итоге к коду, состоящему из структур, сообщений и сопоставления с шаблоном (match).


Преимущества TOLK: типизация и читаемость

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

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

В отличие от FunC, TOLK поддерживает:

  • Union-типы и сопоставление с шаблоном (match).
  • Это позволяет явно описывать и обрабатывать различные варианты сообщений или данных (например, для взаимодействия с такими сервисами, как DeDust).
  • Nullable-типы, которые предотвращают ошибки при обращении к полям необязательных переменных, требуя явной проверки на NULL.
  • Все типы и типизация встроены в язык и работают на TVM.

Автоматическая cериализация

Одной из самых сложных и подверженных ошибкам частей в FunC является ручное кодирование и декодирование данных по TL-схемам.

  • TOLK позволяет переносить TL-схемы в язык с помощью типизации.
  • Сложные схемы, такие как динамические строки или рекурсивные структуры ячеек (snake), могут быть выражены через типы и дженерики. Это заменяет множество строк низкоуровневого FunC-кода на чистые и понятные определения типов.

Эффективность и оптимизация (gas)

Несмотря на повышение уровня абстракции, TOLK не только не уступает, но и значительно превосходит FunC в эффективности.

  • Компилятор TOLK выполняет более интеллектуальную оптимизацию, чем компилятор FunC.
  • Сравнение показало экономию газа до 10-11% (в одном из примеров) и до половины газа в целом, по словам Александра.
  • Это подтверждает, что даже без изменений кода компилятор TOLK гораздо умнее.

Единообразие кода

Основная цель TOLK — обеспечить однотипность кода вне зависимости от задачи.

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

TOLK позволяет разработчикам сосредоточиться на логике контракта, а не на низкоуровневой работе со стеком и ручной сериализацией. Компилятор берет на себя все оптимизации, предоставляя более безопасный, читаемый и эффективный код.


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

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

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

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

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

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

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

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

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

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