Иници ализация TVM
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
To maximize your comprehension of this page, familiarizing yourself with the TL-B language is highly recommended.
TVM вызывается во время фазы вычислений обычных и/или других транзакций.
Начальное состояние
Новый экземпляр TVM инициализируется до выполнения смарт-контракта следующим образом:
-
Оригинальный cc (текущая продолжительность) инициализируется с помощью ячейки среза, созданного из раздела
code
смарт-контракта. В случае замороженного или неинициализированного состояния аккаунта, код должен быть указан в полеinit
входящего сообщения. -
cp (текущая кодовая страница TVM) устанавливается на значение по умолчанию, которое равно 0. Если смарт-контракт хочет использовать другую кодовую страницу TVM x, то он должен переключиться на нее, используя
SETCODEPAGE
x в качестве первой инструкции своего кода. -
Значения газа (лимиты газа) инициализируются в соответствии с результатами фазы кредитования.
-
Вычисление библиотек (контекст библиотеки) описано ниже.
-
Процесс инициализации стека зависит от события, которое вызвало транзакцию, и его содержимое описано ниже.
-
Контрольный регистр c0 (возвращаемая продолжительность) инициализируется экстраординарной продолжительностью
ec_quit
с параметром 0. При выполнении это продолжительность ведет к завершению TVM с кодом выхода 0. -
Контрольный регистр c1 (альтернативная возвращаемая продолжительность) инициализируется экстраординарной продолжительностью
ec_quit
с параметром 1. При вызове она приводит к завершению TVM с кодом выхода 1. Обратите внимание, что оба кода выхода 0 и 1 считаются успешным завершением TVM. -
Контрольный регистр c2 (обработчик исключений) инициализируется экстраординарной продолжительностью
ec_quit_exc
. При вызове она извлекает верхнее целое число из стека (равное номеру исключения) и завершает TVM с кодом выхода, равным этому целому числу. Таким образом, по умолчанию все исключения приводят к завершению выполнения смарт-контракта с кодом выхода, равным номеру исключения. -
Контрольный регистр c3 (словарь кода) инициализируется ячейкой с кодом смарт-контракта, например cc (текущая продолжительность), описанным выше.
-
Контр ольный регистр c4 (корень постоянных данных) инициализируется постоянными данными смарт-контракта, хранящимися в его разделе
data
. В случае замороженного или неинициализированного состояния аккаунта, данные должны быть предоставлены в полеinit
входящего сообщения. Обратите внимание, что постоянные данные смарт-контракта не обязательно должны быть загружены полностью, чтобы это произошло. Вместо этого загружается корень, и TVM может загружать другие ячейки по их ссылкам из корня только при доступе к ним, тем самым предоставляя форму виртуальной памяти. -
Контрольный регистр c5 (корень действий) инициализируется пустой ячейкой. Примитивы "выходных действий" TVM, такие как
SENDMSG
, накапливают выходные действия (например, исходящие сообщения) в этом регистре, которые должны быть выполнены после успешного завершения смарт-контракта. Схема TL-B для ее сериализации описана ниже -
Контрольный регистр c7 (корень временных данных) инициализируется как кортеж, а его структура описана ниже
Контекст библиотеки
Контекст библиотеки_ (среда библиотеки) смарт-контракта — это хэш-карта, отображающая 256-битные хэши ячеек (представлений) в соответствующие ячейки. Когда во время выполнения смарт-контракта осуществляется доступ к ссылке на внешнюю ячейку, в библиотечной среде выполняется поиск ячейки, на которую ссылаются, и ссылка на внешнюю ячейку прозрачно заменяется найденной ячейкой.
Среда библиотеки для вызова смарт-контракта вычисляется следующим образом:
- Глобальная среда библиотеки для текущего воркчейна берется из текущего состояния мастерчейна.
- Затем она дополняется локальной средой библиотеки смарт-контракта, хранящейся в поле
library
состояния смарт-контракта. Учитываются только 256-битные ключи, равные хэшам соответствующих значений ячеек. Если ключ присутствует как в глобальной, так и в локальной среде библиотеки, локальная среда имеет приоритет при слиянии. - Наконец, она дополняется полем
library
поляinit
входящего сообщения (если таковое имеется). Обратите внимание, что если аккаунт заморожен или не инициализирован, полеlibrary
сообщения будет использоваться вместо локальной среды библиотеки из предыдущего шага. Библиотека сообщений имеет более низкий приоритет, чем локальная и глобальная библиотечные среды.
Наиболее распространенный способ создания общих библиотек для TVM — это публикация ссылки на корневую ячейку библиотеки в мастерчейне.
Стек
Инициализация стека TVM происходит после формирования начального состояния TVM и зависит от события, вызвавшего транзакцию:
- внутреннее сообщение
- внешнее сообщение
- тик-так
- подготовка к разделению
- установка слияния
Последний элемент, помещенный в стек, всегда является селектором функции, который является целым числом, идентифицирующим событие, вызвавшее транзакцию.
Внутреннее сообщение
В случае внутреннего сообщения стек инициализируется путем помещения аргументов в функцию main()
смарт-контракта следующим образом:
- Баланс b смарт-контракта (после зачисления значения входящего сообщения) передается как целое количество nanoton.
- Баланс bm входящего сообщения m передается как целое количество nanoton.
- Входящее сообщение m передается как ячейка, которая содержит сериализованное значение типа Message X, где X - тип тела сообщения.
- Тело mb входящего сообщения, равное значению поля body m и переданное как срез ячейки.
- Селектор функции s, обычно равный 0.
После этого выполняется код смарт-контракта, равный его начальному значению c3. Он выбирает правильную функцию в соответствии с s, которая, как ожидается, обработает оставшиеся аргументы функции и затем завершается.