Открыть сервис

Язык FunC

FunC — это предметно-ориентированный язык программирования, предназначенный для разработки смарт-контрактов на платформе блокчейна TON (The Open Network). Язык обеспечивает низкоуровневый контроль над исполнением кода, ориентирован на эффективное использование ресурсов виртуальной машины TVM (TON Virtual Machine) и предоставляет разработчикам прямой доступ к управлению памятью, стеком и газами.

История

Язык FunC был создан командой разработчиков блокчейна TON, возглавляемой Николаем Дуровым, в рамках проекта Telegram Open Network. Первые версии языка появились в 2019 году, когда был опубликован исходный код TON. Основной целью разработки было создание инструмента, позволяющего писать смарт-контракты, которые могли бы обрабатывать тысячи транзакций в секунду, используя асинхронную модель передачи сообщений, характерную для архитектуры TON.

В отличие от Solidity (языка для Ethereum), FunC изначально проектировался как язык с минимальным синтаксисом, близким к ассемблеру TVM. Это позволило разработчикам точно контролировать стоимость выполнения контрактов (газ) и избегать накладных расходов, связанных с абстракциями высокого уровня. Первая стабильная версия FunC была выпущена вместе с запуском основной сети TON в 2021 году. С тех пор язык активно используется для создания децентрализованных приложений (dApps), включая кошельки, NFT-маркетплейсы, DEX (децентрализованные биржи) и стейблкоины.

Архитектура и принципы работы

Виртуальная машина TVM

FunC компилируется в байт-код TON Virtual Machine (TVM). TVM является стековой машиной, что означает, что все операции выполняются с данными, расположенными на стеке. В отличие от регистровых архитектур (например, EVM), TVM использует стек для хранения промежуточных результатов, что упрощает компиляцию и оптимизацию кода. Основные особенности TVM, влияющие на синтаксис FunC:

  • Стековая модель: Все вычисления производятся путём манипуляции стеком (push, pop, swap, dup).
  • Асинхронность: Контракты общаются через сообщения, а не через синхронные вызовы.
  • Срезы (Slice) и ячейки (Cell): Основные типы данных для работы с хранилищем и сообщениями. Ячейки — это неизменяемые структуры, содержащие до 1023 бит данных и до 4 ссылок на другие ячейки. Срезы — это представление ячейки, которое позволяет читать данные из неё последовательно.
  • Газы (Gas): Каждая операция в TVM имеет фиксированную стоимость в газе, которая оплачивается отправителем транзакции.

Синтаксис и структура кода

FunC использует C-подобный синтаксис, но с рядом отличий, обусловленных стековой архитектурой. Ключевые элементы:

  • Функции: Определяются с помощью ключевого слова fun. Функции могут быть как чистыми (pure), так и изменяющими состояние.
  • Стек-манипуляции: Для работы со стеком используются специальные операторы, например over (копирует второй элемент стека на вершину), rot (вращает три верхних элемента), nip (удаляет второй элемент стека).
  • Условные операторы: if, ifnot, ifelse — работают с вершиной стека.
  • Циклы: while, repeat, until — также управляются стеком.
  • Типы данных: Основные типы — int (целые числа произвольной точности), cell (ячейка), slice (срез), builder (строитель для создания ячеек), tuple (кортеж), cont (продолжение — ссылка на код).
  • Директивы компилятора: Используются для управления памятью и оптимизации, например #pragma version и #pragma allow-post-modification.

Пример простейшей функции на FunC:

``fun fun add(a: int, b: int) -> int { return a + b; } ``

В компилированном виде эта функция будет преобразована в последовательность стековых инструкций: PUSHINT a, PUSHINT b, ADD, RET.

Применение

Смарт-контракты

FunC является основным языком для написания смарт-контрактов в экосистеме TON. Типичные сценарии использования:

  • Кошельки: Реализация логики хранения и передачи токенов (например, стандарт Jettons — аналог ERC-20). Контракты кошельков обрабатывают входящие и исходящие сообщения, управляют балансами и проверяют подписи.
  • Децентрализованные биржи (DEX): Создание пулов ликвидности, маршрутизация обменов и управление ордерами. FunC позволяет реализовать сложную логику с минимальными затратами газа.
  • NFT (Non-Fungible Tokens): Разработка коллекций, управление правами собственности и метаданными. Стандарт TON NFT (TEP-62) реализован на FunC.
  • Стейблкоины и токены: Эмиссия, сжигание, переводы и заморозка активов.
  • Оракулы и мосты: Взаимодействие с внешними блокчейнами и источниками данных.

Инструментарий разработчика

Для работы с FunC используется набор инструментов:

  • Fift: Ассемблер и отладчик для TVM, позволяющий тестировать байт-код.
  • FunC Compiler: Компилятор, преобразующий код FunC в байт-код TVM.
  • TON Blockchain SDK: Библиотеки для взаимодействия с блокчейном (например, на Python, JavaScript, Go).
  • TON CLI: Утилита командной строки для развёртывания и вызова контрактов.
  • IDE и плагины: Поддержка FunC в Visual Studio Code, vim и других редакторах.

Критика и ограничения

Сложность освоения

FunC считается одним из самых сложных языков для смарт-контрактов из-за своей низкоуровневости. Разработчикам, привыкшим к высокоуровневым языкам (Solidity, Rust), приходится изучать стековую модель и ручное управление памятью. Это увеличивает порог входа и требует глубокого понимания архитектуры TVM.

Ограниченные абстракции

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

Безопасность

Из-за низкоуровневого управления памятью и стеком, контракты на FunC подвержены специфическим уязвимостям, таким как переполнение стека, неправильное использование срезов и ошибки в вычислении газов. Для их предотвращения требуется тщательное тестирование и аудит кода.

Экосистема

По состоянию на 2024 год, экосистема FunC менее развита по сравнению с Solidity или Rust (для блокчейнов). Количество библиотек, фреймворков и образовательных материалов ограничено, хотя сообщество активно растёт. Существуют альтернативные языки для TON, такие как Tact (высокоуровневый язык), но FunC остаётся основным для критически важных контрактов.

Интересные факты

  • Производительность: FunC позволяет создавать контракты, способные обрабатывать до 10 000 транзакций в секунду на одном шарде (сегменте сети) TON, что значительно превосходит Ethereum.
  • Асинхронность: В отличие от Ethereum, где транзакции выполняются последовательно, TON использует асинхронную модель, где контракты могут отправлять сообщения друг другу и обрабатывать их в произвольном порядке.
  • Стандарты TEP: Для FunC разработаны стандарты TON Enhancement Proposals (TEP), которые определяют интерфейсы для токенов, NFT, кошельков и других компонентов. Это позволяет создавать совместимые контракты.
  • Использование в реальных проектах: На FunC написаны контракты таких проектов, как Tonkeeper (кошелёк), Getgems (NFT-маркетплейс), STON.fi (DEX) и многих других.

Источники

  • Документация TON: «FunC Language Specification» (The Open Network).
  • «TON Virtual Machine Specification» (The Open Network).
  • Статья «FunC: A Low-Level Language for TON Smart Contracts» (TON Community Blog).
  • «Tact vs FunC: A Comparison of Smart Contract Languages for TON» (TON Foundation).

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →