Tolk: новый уровень разработки смарт-контрактов TON
Разработчик языка TOLK Александр Кирсанов, в рамках мероприятия TON CIS Dev 1-Day Bootcamp в Санкт-Петербурге, выступил с лайв-кодингом посвященным языку смарт-контрактов TOLK и его преимуществам перед FunC, особенно в контексте разработки контрактов для блокчейна The Open Network.
Мы подготовили выжимку с его выступления, где подчеркнули самое главное: как безболезненно и с максимальной эффективностью мигрировать с 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 позволяет разработчикам сосредоточиться на логике контракта, а не на низкоуровневой работе со стеком и ручной сериализацией. Компилятор берет на себя все оптимизации, предоставляя более безопасный, читаемый и эффективный код.
Полезные материалы для разработчиков
Примеры контрактов (token, NFT, Wallet на TOLK)
Примеры реальных контрактов тут
Конвертер FunC-to-TOLK (инструмент для миграции)
Сравнительный анализ FunC vs. TOLK (данные по расходу газа)
Документация: система типов и union (для понимания сериализации TL-схем)
Telegram-канал языка: @tolk_lang