TONboard

TON Virtual Machine (TVM)

5 мин чтенияобновлено 2026-05-29✏️ Предложить правку🕑 История
Содержание (12)

TON Virtual Machine (TVM, иногда TON VM) — виртуальная машина, выполняющая смарт-контракты в блокчейне TON. Это исполнительный слой сети: каждый смарт-контракт хранится и работает как программа для TVM. Машина обрабатывает входящие сообщения, изменяет постоянное состояние контракта и формирует исходящие сообщения для других контрактов.

Архитектура TVM подчинена трём требованиям: полная детерминированность выполнения (один и тот же ввод даёт один и тот же результат на любом узле), высокая плотность кода (минимум места в блокчейне) и обратная совместимость при расширении набора инструкций.

История#

TVM была разработана командой Telegram в 2018 году вместе с первой версией протокола TON. Развитие шло поэтапно:

  • 2018 — первая версия TVM, выпущенная с тестовой сетью TON. Основное внимание — функциональность смарт-контрактов и интеграция с протоколом.
  • Март 2020 — публикация подробной технической документации с описанием типов данных, оптимизаций и контракта инструкций.
  • 2020 (запуск mainnet) — TVM поддерживает полноценный набор операций и обеспечивает детерминированное выполнение в production-сети.

После передачи проекта сообществу разработка TVM продолжается через TEP-процесс — обновления вводятся через предложения улучшений и активируются через консенсус валидаторов.

Основы#

TVM использует битовые строки как фундаментальное представление данных. Они представляются в двух нотациях:

  • Шестнадцатеричное обозначение — строки длиной, кратной четырём битам, делятся на группы по 4 бита, каждая записывается одной шестнадцатеричной цифрой (0–F). Если длина не кратна четырём, добавляется специальный тег завершения для пометки модификации.
  • Сериализация в октеты — строка делится на группы по 8 бит и записывается как последовательность байтов; при необходимости добавляется выравнивание до 8.

Стековая модель#

TVM — стековая виртуальная машина. Это значит, что данные хранятся в структуре «стек» (last-in-first-out), а не в именованных переменных или регистрах. Большинство операций (арифметика, сравнения, передача параметров) забирают аргументы со стека и кладут результат туда же. Стековая модель проще регистрового подхода и даёт более плотную кодировку инструкций — важно для уменьшения on-chain хранения.

Типы значений

Стек TVM работает с фиксированным набором примитивных типов:

  • Integer — 257-битное знаковое целое (выбор разрядности позволяет вместить 256-битные хэши плюс знак без потерь).
  • Cell — объект, содержащий до 1023 бит данных и до 4 ссылок на другие ячейки. Основа памяти TVM.
  • Tuple — упорядоченная коллекция значений разных типов.
  • Slice — «срез» ячейки: указатель на оставшуюся часть данных и ссылок при чтении.
  • Builder — буфер для последовательной сборки новой Cell.
  • Continuation — представление точки продолжения выполнения; см. ниже.
  • Null — отсутствие значения; маркер для неинициализированных полей.

Категории инструкций

Инструкции TVM группируются по назначению:

  • стековые и кортежные — перестановки стека, операции с tuple;
  • константные — вставка предопределённых значений на стек;
  • арифметические — стандартные арифметические операции с автоматической проверкой переполнения;
  • операции с ячейками — чтение Slice, запись Builder, обращения по ссылкам;
  • управление потоком — условные ветвления, циклы, вызовы продолжений;
  • прикладные примитивы — специализированные операции TON: работа с адресами, подписями, актуатор сообщений.

Ячейки и их типы#

Ячейка (Cell) — атомарная единица хранения в TVM и в самом блокчейне TON. Каждая Cell содержит до 1023 бит данных и до 4 ссылок на другие Cell. Граф ячеек, образующийся через ссылки, — ориентированный ациклический граф (DAG): циклы недопустимы. Любые данные блокчейна (смарт-контракты, состояния, сообщения, блоки) хранятся как такой граф.

Типы ячеек

  • Обычные (тип-1) — стандартный носитель данных и ссылок.
  • Экзотические (exotic cells) — типы 2–255 с особенностями десериализации и хэширования. Используются для обрезанных ветвей (truncated branches), ссылок на библиотеки и доказательств Merkle.

Экзотические ячейки позволяют, например, передавать частичный snapshot блокчейна с криптографическими доказательствами — основа лёгких клиентов TON.

Продолжения (Continuations)#

Continuation — центральная конструкция TVM для управления потоком. По существу это «отложенное вычисление»: маркер, содержащий код для выполнения, текущий стек и сохранённое состояние контрольных регистров. Continuation можно положить на стек, передать как параметр, активировать — и продолжить выполнение с зафиксированной точки.

На continuation построены вызовы подпрограмм, условные операции, циклы и обработка исключений. Аналог в более привычных языках — first-class functions; в TVM continuation мощнее и охватывает также неполное продолжение программы.

Типы продолжений

  • Обычные — содержат код, стек, список сохранённых регистров и кодовую страницу (см. ниже).
  • Простые — только код и кодовая страница, без сохранённых данных стека.
  • Текущее (cc, current continuation) — отражает исполняемый сейчас код; ключевая часть состояния машины.

Управление переключается между продолжениями инструкциями JMP (передача управления) и RET (возврат). Исключения — специальные продолжения, активируемые при ошибке: они получают параметры ошибки и определяют дальнейшее поведение. Условные и итерационные конструкции (IF, WHILE, REPEAT) реализованы поверх continuations.

Кодовые страницы#

Каждое обычное continuation несёт 16-битное поле кодовой страницы (cp), которое определяет, как декодировать его инструкции. Это механизм обратной совместимости: одновременно в сети могут существовать контракты, скомпилированные под разные версии набора инструкций TVM.

Инструкции кодируются двоичным префиксным кодом — это даёт однозначное декодирование и плотное представление. Если префикс не соответствует допустимой инструкции текущей кодовой страницы, генерируется исключение недопустимого опкода.

Между кодовыми страницами возможно автоматическое переключение в зависимости от выполненной операции — это позволяет специализировать страницы под частые операции (манипуляции со стеком, обработка данных) и сократить объём кода.

TVM vs Ethereum Virtual Machine#

TVM и EVM — обе стековые виртуальные машины для смарт-контрактов, но имеют ключевые отличия.

СвойствоTVMEVM
Базовая модель данныхГраф ячеек (Cell, до 1023 бит + 4 ссылки)256-битные слова + Merkle Patricia Trie
Размерность Integer257 бит256 бит
Проверка переполненияАвтоматическаяРучная (Solidity ≥0.8)
КриптографияCurve25519, Weil pairings (zk-SNARKs), sha256secp256k1, keccak256
Основной язык контрактовFunC (статическая типизация, ADT)Solidity
Хранение состоянияРаспределено по ячейкам контрактовMPT с глобальным состоянием

Граф ячеек упрощает работу со сложными структурами (деревья, DAG), требует меньше памяти и вычислительных ресурсов, чем MPT. Автоматическая проверка переполнения снижает класс типичных уязвимостей. Поддержка Curve25519 и Weil pairings даёт криптографические возможности, недоступные в EVM «из коробки».

Похожие статьи#

ℹ️ Информация проверена: 2025

Требует обновления (2)
  • VERIFY 2025даты этапов разработки TVM (2018 первая версия, март 2020 документация, 2020 mainnet) — нужны точные даты публикаций.
  • GAPпримеры FunC-кода не приведены — пользы для разработчика статья дала бы больше с минимальным «hello world» снипетом.

Подготовлено

TONboard

Поддержите проект чаевыми в TON.

Комментарии

Комментарий стоит небольшую он-чейн комиссию — она отсекает спам.
  • Пока нет комментариев — будьте первым.