Перейти к основному содержимому

Язык Tolk: общие сведения

Tolk — это язык нового поколения для разработки смарт-контрактов в TON. Он приходит на смену FunC, у него выразительный синтаксис, надёжная система типов, встроенный механизм сериализации — и при этом он генерирует очень оптимизированный ассемблерный код.

Эта страница описывает ключевые особенности Tolk, сравнивает его с FunC, и объясняет, как начать работу с языком — независимо от того, переходите вы с FunC или начинаете писать смарт-контракты с нуля.

Почему стоит выбрать Tolk

  1. Чистый, выразительный синтаксис, вдохновлённый TypeScript и Rust.
  2. Встроенные примитивы для работы с TON, включая автоматически сериализуемые структуры (structs), сопоставление с образцом (pattern matching) и встроенную обработку сообщений.
  3. Строгая статическая система типов с null-безопасностью, псевдонимами типов (type aliases), типами-объединениями (union types) и дженериками для более безопасного и понятного кода.
  4. Эффективность потребления газа: контракты могут стоить до 50% дешевле, чем их эквиваленты на FunC, благодаря оптимизации компилятора и ленивой функциональности.
  5. Низкоуровневый контроль доступен при необходимости, с прямым доступом к стеку и инструкциям TVM.

Начало работы с Tolk

Если вы новичок в Tolk, полезны такие действия:

  1. Исследуйте документацию TON по смарт-контрактам для базовых знаний.
  2. Настройте свой первый проект счётчика на Tolk с помощью команды npm create ton@latest.
  3. Пройдите пошаговый гайд для создания контракта счётчика.
  4. Прочитайте гайд по Tolk для общего понимания языка.
  5. Продолжайте изучать документацию. Когда столкнётесь с кодом на FunC или Tact, сравните с эквивалентом на Tolk — зачастую второй будет выглядеть чище и декларативнее.

Документация TON продолжит развиваться, чтобы поддерживать Tolk как основной язык смарт-контрактов.

Как мигрировать с FunC

Если вы писали контракты на FunC, миграция на Tolk выглядит довольно прямолинейно — и зачастую приводит к более простому коду, который проще поддерживать.

  1. Попробуйте создать простой контракт на Tolk (например, счётчик с помощью команды npm create ton@latest). Вы быстро заметите смену стековой логики на выразительные конструкции со типами структур, объединениями (unions), сопоставлением с образцом, toCell() и многим другим.
  2. Ознакомьтесь со сравнительными бенчмарками Tolk vs FunC. Это реально используемые контракты (Jetton, NFT, Wallet), перенесённые из FunC: та же логика, но изложенная более чистым и выразительным стилем.
  3. Прочитайте краткое сравнение Tolk и FunC.
  4. Попробуйте конвертер 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-jsWASM-обёртка для компилятора Tolk интегрирована в blueprint

Компилятор Tolk размещён в репозитории ton-blockchain.

Подходит ли уже Tolk для продакшна?

Все контракты в бенчмарках Tolk vs FunC проходят те же тесты, что и их FunC-аналоги — с идентичной логикой и поведением.

Компилятор новый, поэтому ещё возможны некоторые крайние случаи. Однако в целом Tolk уже служит заменой FunC, подходящей для реального использования.

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

Проблемы и контакты

Если вы столкнулись с проблемой, свяжитесь с сообществом разработчиков в TON Dev Chats или создайте issue на GitHub.

См. также

Was this article useful?