Обзор TVM
Все смарт-контракты TON выполняются на собственной виртуальной машине TON (TVM). TVM построена по принципу стека, что делает ее эффективной и простой в реализации.
Этот документ дает представление о том, как TVM выполняет транзакции с высоты птичьего полета.
- TVM Source - TVM C++ implementation :::
Курс TON: TVM
Прежде чем приступить к изучению курса, убедитесь, что Вы хорошо понимаете основы технологии блокчейн. Если у Вас есть пробелы в знаниях, мы рекомендуем пройти курс Основы блокчейна с TON (RU версия, CHN версия). :::
Курс TON Blockchain Course - это полное руководство по разработке TON Blockchain.
Модуль 2 полностью охватывает TVM, транзакции, масштабируемость и бизнес-кейсы.
Курс по блокчейну Check TON
CHN
RU
Транзакции и фазы
Когда на счете в одной из цепочек TON происходит какое-то событие, оно вызывает транзакцию. Наиболее распространенным событием является "прибытие какого-либо сообщения", но в общем случае это могут быть tick-tock
, merge
, plit
и другие события.
Каждая транзакция состоит из 5 этапов:
- Фаза хранения - на этой фазе рассчитывается плата за хранение, накопленная контрактом за занятие некоторого пространства в состоянии цепочки. Подробнее читайте в разделе [Плата за хранение] (/develop/smart-contracts/fees#storage-fee).
- Фаза кредитования - на этой фазе рассчитывается баланс контракта в отношении (возможного) значения входящего сообщения и собранной платы за хранение.
- Фаза вычисления - на этой фазе TVM выполняет контракт (см. ниже), и результатом выполнения контракта является агрегирование
exit_code
,actions
(сериализованный список действий),gas_details
,new_storage
и некоторых других. - Фаза действий - если фаза вычислений прошла успешно, на этой фазе обрабатываются
действия
, полученные на фазе вычислений. В частности, действия могут включать отправку сообщений, обновление кода смарт-контракта, обновление библиотек и т.д. Обратите внимание, что некоторые действия могут быть неудачными во время обработки (например, если мы попытаемся отправить сообщение с большим количеством TON, чем есть у контракта), в этом случае вся транзакция может быть отменена или это действие может быть пропущено (это зависит от режима действий, другими словами, контракт может отправить сообщение типаsend-or-revert или
try-send-if-no-ignore`). - Фаза отскока - если фаза вычисления завершилась неудачно (вернула
exit_code >= 2
), в этой фазе формируется отскок сообщения для транзакций, инициированных входящим сообщением.
Вычислите фазу
В этой фазе происходит выполнение TVM.
Состояние TVM
В любой момент времени состояние TVM полностью определяется 6 свойствами:
- Стек (см. ниже)
- Управляющие регистры - (см. ниже), проще говоря, это до 16 переменных, которые можно напрямую устанавливать и считывать во время выполнения.
- Текущее продолжение - объект, описывающий выполняемую в данный момент последовательность инструкций
- Текущая кодовая страница - простыми словами, это означает версию TVM, которая запущена в данный момент
- Лимиты газа - набор из 4 целых значений; текущий лимит газаgl, максимальный лимит газа gm, остаток газаgr и кредит газа gc
- Библиотечный контекст - хэшмап библиотек, которые могут быть вызваны TVM
TVM - это стековая машина
TVM - это стековая машина с последним входом и первым выходом. Всего существует 7 типов переменных, которые могут храниться в стеке - три неклеточных типа:
- Integer - подписанные 257-битные целые числа
- Кортеж - упорядоченная коллекция, включающая до 255 элементов с произвольными типами значений, возможно, различных.
- Null
И четыре разных вкуса клеток:
- Ячейка - базовая (возможно, вложенная) непрозрачная структура, используемая блокчейном TON для хранения всех данных
- Slice - специальный объект, который позволяет Вам читать из ячейки
- Конструктор - специальный объект, который позволяет Вам создавать новые ячейки
- Продолжение - специальный объект, который позволяет Вам использовать ячейку в качестве источника инструкций TVM
Регистры управления
c0
- Содержит следующее продолжение или продолжение возврата (аналогично адресу возврата подпрограммы в обычных конструкциях). Это значение должно быть продолжением.c1
- Содержит альтернативное (возвратное) продолжение; это значение должно быть продолжением.c2
- Содержит обработчик исключений. Это значение представляет собой Продолжение, вызываемое всякий раз, когда срабатывает исключение.c3
- Поддерживающий регистр, содержит текущий словарь, по сути, хэшмап, содержащий код всех функций, используемых в программе. Это значение должно быть продолжением.c4
- Содержит корень постоянных данных, или просто разделdata
контракта. Это значение представляет собой ячейку.c5
- Содержит выходные действия. Это значение представляет собой ячейку.c7
- Содержит корень временных данных. Это кортеж.
Инициализация TVM
TVM инициализируется, когда транзакция переходит в фазу Вычисления, и затем выполняет команды (опкоды) из Текущего продолжения до тех пор, пока не останется команд для выполнения (и продолжения для возвратных переходов).
Подробное описание процесса инициализации можно найти здесь: Инициализация TVM
Инструкции TVM
Список инструкций TVM можно найти здесь: Инструкции TVM.
Результат выполнения TVM
Помимо кода выхода (exit_code) и данных о потребленном газе, TVM косвенно выводит следующие данные:
- c4 регистр - ячейка, которая будет сохранена как новые
данные
смарт-контракта (если выполнение не будет отменено на этой или последующих фазах) - c5 register - (список действий на выходе) ячейка с последним действием в списке и ссылка на ячейку с предыдущим действием (рекурсивно)
Все остальные значения регистров будут игнорироваться.
Обратите внимание, что поскольку существует ограничение на максимальную глубину ячеек <1024
, и особенно ограничение на глубину c4 и c5 <=512
, будет существовать ограничение на количество выходных действий в одной tx <=255
. Если контракту нужно отправить больше, он может послать сообщение с запросом continue_sending
самому себе и отправить все необходимые сообщения в последующих транзакциях.
См. также
- Инструкции TVM
- TON TVM Концепции TVM (может содержать устаревшую информацию)