Язык Tolk: общие сведения
Tolk — это язык нового поколения для разработки смарт-контрактов в TON. Он приходит на смену FunC, у него выразительный синтаксис, надёжная система типов, встроенный механизм сериализации — и при этом он генерирует очень оптимизированный ассемблерный код.
Эта страница описывает ключевые особенности Tolk, сравнивает его с FunC, и объясняет, как начать работу с языком — независимо от того, переходите вы с FunC или начинаете писать смарт-контракты с нуля.
Почему стоит выбрать Tolk
- Чистый, выразительный синтаксис, вдохновлённый TypeScript и Rust.
- Встроенные примитивы для работы с TON, включая автоматически сериализуемые структуры (structs), сопоставление с образцом (pattern matching) и встроенную обработку сообщений.
- Строгая статическая система т ипов с null-безопасностью, псевдонимами типов (type aliases), типами-объединениями (union types) и дженериками для более безопасного и понятного кода.
- Эффективность потребления газа: контракты могут стоить до 50% дешевле, чем их эквиваленты на FunC, благодаря оптимизации компилятора и ленивой функциональности.
- Низкоуровневый контроль доступен при необходимости, с прямым доступом к стеку и инструкциям TVM.
Начало работы с Tolk
Если вы новичок в Tolk, полезны такие действия:
- Исследуйте документацию TON по смарт-контрактам для базовых знаний.
- Настройте свой первый проект счётчика на Tolk с помощью команды
npm create ton@latest
. - Пройдите пошаговый гайд для создания контракта счётчика.
- Прочитайте гайд по Tolk для общего понимания языка.
- Продолжай те изучать документацию. Когда столкнётесь с кодом на FunC или Tact, сравните с эквивалентом на Tolk — зачастую второй будет выглядеть чище и декларативнее.
Документация TON продолжит развиваться, чтобы поддерживать Tolk как основной язык смарт-контрактов.
Как мигрировать с FunC
Если вы писали контракты на FunC, миграция на Tolk выглядит довольно прямолинейно — и зачастую приводит к более простому коду, который проще поддерживать.
- Попробуйте создать простой контракт на Tolk (например, счётчик с помощью команды
npm create ton@latest
). Вы быстро заметите смену стековой логики на выразительные конструкции со типами структур, объединениями (unions), сопоставлением с образцом,toCell()
и многим другим. - Ознакомьтесь со сравнительными бенчмарками Tolk vs FunC. Это реально используемые контракты (Jetton, NFT, Wallet), перенесённые из FunC: та же логика, но изложенная более чистым и выразител ьным стилем.
- Прочитайте краткое сравнение Tolk и FunC.
- Попробуйте конвертер FunC в Tolk для постепенной миграции существующих кодовых баз.
Пример простого контракта на Tolk:
import "utils"
struct Storage {
counter: int32
}
fun Storage.load() {
return Storage.fromCell(contract.getData());
}
fun onInternalMessage(in: InMessage) {
// ...
}
get fun currentCounter(): int {
val storage = lazy Storage.load();
return storage.counter;
}
Аналогичная реализация на FunC
#include "utils.fc";
global int ctx_counter;
int load_data() impure {
slice cs = get_data().begin_parse();
ctx_counter = cs~load_uint(32);
}
() recv_internal(int msg_value, cell msg_full, slice msg_body) impure {
slice cs = msg_full.begin_parse();
int flags = cs.load_uint(4);
if (flags & 1) {
return ();
}
...
}
int currentCounter() method_id {
load_data(); ;; fills global variables
return ctx_counter;
}
Конвертируйте FunC в Tolk
Сравните Tolk и FunC
Инструменты для работы с Tolk
Доступен целый набор инструментов для поддержки разработки на Tolk — включая поддержку в IDE, языковые сервисы, и утилиты миграции.
Инструмент | Описание |
---|---|
Плагин JetBrains IDE | добавляет поддержку Tolk, FunC, Fift и TL-B |
Расширение VS Code | добавляет поддержку Tolk и языковые фичи |
Языковой сервер (language server) | работает с любым LSP-совместимым редактором |
Конвертер FunC в Tolk | мигрирует целые проекты с помощью одного вызова команды npx |
tolk-js | WASM-обёртка для компилятора Tolk интегрирована в blueprint |
Компилятор Tolk размещён в репозитории ton-blockchain
.
Подходит ли уже Tolk для продакшна?
Все контракты в бенчмарках Tolk vs FunC проходят те же тесты, что и их FunC-аналоги — с идентичной логикой и поведением.
Компилятор новый, поэтому ещё возможны некоторые крайние случаи. Однако в целом Tolk уже служит заменой FunC, подходящей для реального использования.
В любом случае, какой бы язык вы ни использовали, для создания надёжных смарт-контрактов их надо хорошо тестировать.
Проблемы и контакты
Если вы столкнулись с проблемой, свяжитесь с сообществом разработчиков в TON Dev Chats или создайте issue на GitHub.