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

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

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

Tolk — это новый язык для написания смарт-контрактов в TON. Представьте себе Tolk как «следующее поколение FunC». Компилятор Tolk — это буквально ответвление компилятора FunC, представляющее знакомый синтаксис, похожий на TypeScript, но оставляющее все низкоуровневые оптимизации нетронутыми.

import "storage.tolk"

fun loadData() {
ctxCounter = getContractData().beginParse().loadUint(32);
}

fun onInternalMessage(msgValue: int, msgFull: cell, msgBody: slice) {
var cs = msgFull.beginParse();
var flags = cs.loadMessageFlags();
if (isMessageBounced(flags)) {
return;
}
...
}

get currentCounter(): int {
loadData(); // fills global variables
return ctxCounter;
}
См. ту же логику, реализованную с помощью FunC
#include "storage.fc";

() 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

FunC потрясающий. Он действительно низкоуровневый и побуждает программиста думать о внутренностях компилятора. Он дает полный контроль над ассемблером TVM, позволяя программисту сделать свой контракт максимально эффективным. Если вы привыкнете к нему, он вам понравится.

Но есть проблема. FunC — это "функциональный C", и он для ниндзя. Если вы увлекаетесь Lisp и Haskell, вы будете счастливы. Но если вы разработчик JavaScript / Go / Kotlin, его синтаксис для вас необычен, что приводит к случайным ошибкам. Борьба с синтаксисом может снизить вашу мотивацию к изучению TON.

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

Вот что такое Tolk.

Переход с FunC на Tolk

Если вы знаете FunC и хотите попробовать новый синтаксис, вот ваш путь:

  1. Прочитайте Сравнение Tolk и FunC: коротко.
  2. С помощью blueprint создайте новый контракт Tolk (например, счетчик) и поэкспериментируйте. Помните, что почти все функции stdlib переименованы в подробные понятные имена. Вот сопоставление.
  3. Попробуйте конвертер для ваших существующих контрактов или один из контрактов FunC. Помните, что контракты, написанные на Tolk с нуля, определенно будут выглядеть лучше, чем автоматически преобразованные. Например, использование логических операторов вместо побитовых значительно повышает читабельность кода.

Как попробовать Tolk, если вы не знаете FunC

В настоящее время эта документация предполагает, что вы знаете FunC

В документации описываются различия "Tolk и FunC". Позже она будет адаптирована для новичков. Более того, FunC в конечном итоге станет устаревшим, и все фрагменты кода во всей документации будут переписаны на Tolk.

Если вы новичок в TON, ваш путь таков:

  1. Покопайтесь в этой документации, чтобы получить базовые знания о разработке в TON. Независимо от того, какой язык вы будете использовать, вам нужно знать о ячейках, срезах, асинхронной природе TON в конце концов.
  2. Сталкиваясь с фрагментами FunC, вы все равно можете использовать FunC или попытаться выразить то же самое в Tolk. Если синтаксис FunC для вас необычен, не волнуйтесь: цель Tolk — как раз исправить эту проблему.
  3. Как только вы поймете, что происходит, попробуйте использовать Tolk с blueprint.

Инструменты вокруг языка Tolk

Исходные данные компилятора Tolk являются частью [репозитория] ton-blockchain (https://github.com/ton-blockchain/ton). Помимо компилятора, у нас есть:

  1. tolk-js — оболочка WASM для компилятора Tolk.
  2. Плагин JetBrains IDE поддерживает Tolk, помимо FunC, Fift, TL/B и Tact.
  3. Расширение VS Code, включающее поддержку языка Tolk.
  4. Конвертер из FunC в Tolk — конвертирует файл .fc в файл .tolk с помощью одной команды npx.
  5. Язык Tolk доступен в blueprint.

Готов ли Tolk к работе?

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

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

Дорожная карта

Первая выпущенная версия Tolk — v0.6, подчеркивающая отсутствие FunC v0.5.

Вот некоторые (но не все и никак не упорядоченные) моменты, которые необходимо изучить:

  • улучшения системы типов: допустимость значений Null, целые числа фиксированного размера, типы объединений, словари
  • структуры и обобщения
  • автоматическая упаковка структур в/из ячеек, возможно, интегрированная с обработчиками сообщений
  • методы для структур, обобщенные для охвата встроенных типов
  • более простая отправка сообщений
  • лучший опыт для общих вариантов использования (жетонов, nft и т. д.)
  • оптимизация газа и стека, встраивание AST
  • расширение и поддержка stdlib
  • своего рода ABI (как проводники "видят" байт-код)
  • управление газом и сборами в целом

Следующей стратегической целью для Tolk v1.0 являются структуры с автоматической сериализацией в ячейки. Это устранит необходимость ручных манипуляций с конструкторами и срезами, что позволит декларативно описывать данные и сообщения. С этим тесно связан ABI (интерфейс) контрактов. Хорошо спроектированные структуры на самом деле составляют большую часть ABI.

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

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