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 — обе стековые виртуальные машины для смарт-контрактов, но имеют ключевые отличия.
| Свойство | TVM | EVM |
|---|---|---|
| Базовая модель данных | Граф ячеек (Cell, до 1023 бит + 4 ссылки) | 256-битные слова + Merkle Patricia Trie |
| Размерность Integer | 257 бит | 256 бит |
| Проверка переполнения | Автоматическая | Ручная (Solidity ≥0.8) |
| Криптография | Curve25519, Weil pairings (zk-SNARKs), sha256 | secp256k1, keccak256 |
| Основной язык контрактов | FunC (статическая типизация, ADT) | Solidity |
| Хранение состояния | Распределено по ячейкам контрактов | MPT с глобальным состоянием |
Граф ячеек упрощает работу со сложными структурами (деревья, DAG), требует меньше памяти и вычислительных ресурсов, чем MPT. Автоматическая проверка переполнения снижает класс типичных уязвимостей. Поддержка Curve25519 и Weil pairings даёт криптографические возможности, недоступные в EVM «из коробки».