Спецификация RUNVM
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
В настоящее время у кода в TVM нет возможности вызывать внешний ненадежный код "в изолированной среде". Другими словами, внешний код всегда может необратимо обновить код, данные контракта или установить действия (например, отправить все деньги).
Инструкция RUNVM
позволяет создать независимый экземпляр VM, запустить нужный код и получить необходимые данные (стек, регистры, потребление газа и т. д.) без риска загрязнения состояния вызывающей ст ороны. Запуск произвольного кода безопасным способом может быть полезен для плагинов в стиле v4, расчета субконтракта в стиле init
Tact и т. д.
xxxxxxxxxxxxx Синтаксис Fift | xxxxxxxxxxxxxxxxxxxxxxx Стек | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Описание |
---|---|---|
flags RUNVM | x_1 ... x_n n code [r] [c4] [c7] [g_l] [g_m] - x'_1 ... x'_m exitcode [data'] [c4'] [c5] [g_c] | Запускает дочернюю VM с кодом code и стеком x_1...x_n . Возвращает результирующий стек x'_1...x'_m и код выхода.Другие аргументы и возвращаемые значения включаются флагами, см. ниже. |
RUNVMX | x_1 ... x_n n code [r] [c4] [c7] [g_l] [g_m] flags - x'_1 ... x'_m exitcode [data'] [c4'] [c5] [g_c] | То же самое, но выводит флаги из стека. |
Флаги похожи на runvmx
в fift:
+1
: установить c3 в код+2
: ввести неявный 0 перед запуском кода+4
: взятьc4
из стека (постоянные данные), вернуть его окончательное значение+8
: взять лимит газа "g_l" из стека, вернуть потребленный газ "g_c"+16
: взятьc7
из стека (контекст смарт-контракта)+32
: вернуть конечное значениеc5
(действия)+64
: выводит жесткий лимит газа (включен ACCEPT)g_m
из стека+128
: "изолированное потребление газа". Дочерняя VM будет иметь отдельный набор посещенных ячеек и отдельный счетчик chksgn.+256
: выводит целое числоr
, возвращает ровноr
значений сверху:- Если вызов RUNVM успешен и r установлено, он возвращает r элементов. Если r не установлено - возвращает все;
- Если RUNVM успешен, но в стеке недостаточно элементов (глубина стека меньше r), это рассматривается как исключение в дочерней VM с exit_code=-3 и exit_arg=0 (поэтому 0 возвращается как единственный элемент стека);
- Если RUNVM завершается с исключением - возвращается только один элемент - exit arg (не путать с exit_code);
- В случае OOG exit_code = -14 и exit_arg - это количество газа.
Стоимость газа:
- 66 газа
- 1 газ за каждый элемент стека, переданный дочерней виртуальной машине (первые 32 бесплатны)
- 1 газ за каждый элемент стек а, возвращенный дочерней виртуальной машиной (первые 32 бесплатны)