TVM (TON Virtual Machine)
Виртуальная машина TON — стековая среда исполнения смарт-контрактов. Работает с ячейками (cells) и асинхронными сообщениями как примитивами.
Синонимы: ton virtual machine, виртуальная машина ton
TVM (TON Virtual Machine) — среда выполнения смарт-контрактов в сети TON. Это стековая виртуальная машина с поддержкой произвольно вложенных структур данных — концептуально она ближе к Forth, чем к EVM.
Чем отличается от EVM
Ethereum Virtual Machine оперирует 256-битными словами и плоской памятью. TVM работает на другом уровне абстракции:
- Стек значений хранит не только числа, но и ячейки, slice-ы, builder-ы, продолжения (continuation), словари.
- Cell — основная структура данных. До 1023 бит и до 4 ссылок на другие ячейки. Любые сериализованные данные в TON — это дерево или граф ячеек.
- Сообщения как примитив. Контракты в TON не вызывают друг друга синхронно. Любое взаимодействие — это асинхронное сообщение, и TVM умеет создавать такие сообщения встроенными опкодами.
Газ и комиссии
Каждый опкод TVM имеет цену в газе. Контракт оплачивает газ из собственного баланса (отличие от EVM, где газ оплачивает отправитель). Если на счету не хватает Toncoin для оплаты вычислений и хранения, контракт может «замёрзнуть» (frozen state) и потеряет данные через какое-то время, если не пополнить баланс.
Стоимость газа в TON стабильно низкая — типичный перевод Toncoin или jetton-а укладывается в 0,005-0,02 TON.
Что внутри контракта
Состояние смарт-контракта в TVM — это тоже cell. У каждого аккаунта есть:
- Code cell — байткод TVM.
- Data cell — текущее состояние (балансы, владелец, любые поля).
- Library cell — опционально, для разделяемого кода между контрактами одного класса (типичный кейс — jetton wallet).
При входящем сообщении TVM загружает code и data, исполняет код, выдаёт обновлённый data и список исходящих сообщений. Если что-то пошло не так — контракт может откатить транзакцию через bounce-механизм (см. термин bounce).
Языки разработки
Прямо на байткоде TVM никто не пишет. Используются языки уровнем выше:
- FunC — низкоуровневый, близок к C, дает максимальный контроль и эффективность.
- Tact — высокоуровневый, со строгой типизацией и более привычным синтаксисом.
- Fift — ассемблер TVM, нужен для отладки и оптимизаций.
Все они компилируются в один и тот же байткод TVM, который потом исполняется валидаторами при обработке транзакций.