Перейти к основному содержимому

Обзор TVM

Все смарт-контракты TON выполняются на собственной виртуальной машине TON (TVM). TVM построена по принципу стека, что делает ее эффективной и простой в реализации.

Этот документ дает представление о том, как TVM выполняет транзакции с высоты птичьего полета.

подсказка

Курс TON: TVM

Прежде чем приступить к изучению курса, убедитесь, что Вы хорошо понимаете основы технологии блокчейн. Если у Вас есть пробелы в знаниях, мы рекомендуем пройти курс Основы блокчейна с TON (RU версия, CHN версия). :::

Курс TON Blockchain Course - это полное руководство по разработке TON Blockchain.

Модуль 2 полностью охватывает TVM, транзакции, масштабируемость и бизнес-кейсы.

Курс по блокчейну Check TON

CHN

RU

Транзакции и фазы

Когда на счете в одной из цепочек TON происходит какое-то событие, оно вызывает транзакцию. Наиболее распространенным событием является "прибытие какого-либо сообщения", но в общем случае это могут быть tick-tock, merge, plit и другие события.

Каждая транзакция состоит из 5 этапов:

  1. Фаза хранения - на этой фазе рассчитывается плата за хранение, накопленная контрактом за занятие некоторого пространства в состоянии цепочки. Подробнее читайте в разделе [Плата за хранение] (/develop/smart-contracts/fees#storage-fee).
  2. Фаза кредитования - на этой фазе рассчитывается баланс контракта в отношении (возможного) значения входящего сообщения и собранной платы за хранение.
  3. Фаза вычисления - на этой фазе TVM выполняет контракт (см. ниже), и результатом выполнения контракта является агрегирование exit_code, actions (сериализованный список действий), gas_details, new_storage и некоторых других.
  4. Фаза действий - если фаза вычислений прошла успешно, на этой фазе обрабатываются действия, полученные на фазе вычислений. В частности, действия могут включать отправку сообщений, обновление кода смарт-контракта, обновление библиотек и т.д. Обратите внимание, что некоторые действия могут быть неудачными во время обработки (например, если мы попытаемся отправить сообщение с большим количеством TON, чем есть у контракта), в этом случае вся транзакция может быть отменена или это действие может быть пропущено (это зависит от режима действий, другими словами, контракт может отправить сообщение типа send-or-revert или try-send-if-no-ignore`).
  5. Фаза отскока - если фаза вычисления завершилась неудачно (вернула 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 самому себе и отправить все необходимые сообщения в последующих транзакциях.

См. также