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

Спецификация RUNVM

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.

В настоящее время у кода в TVM нет возможности вызывать внешний ненадежный код "в изолированной среде". Другими словами, внешний код всегда может необратимо обновить код, данные контракта или установить действия (например, отправить все деньги).

Инструкция RUNVM позволяет создать независимый экземпляр VM, запустить нужный код и получить необходимые данные (стек, регистры, потребление газа и т. д.) без риска загрязнения состояния вызывающей стороны. Запуск произвольного кода безопасным способом может быть полезен для плагинов в стиле v4, расчета субконтракта в стиле init Tact и т. д.

xxxxxxxxxxxxx
Синтаксис Fift
xxxxxxxxxxxxxxxxxxxxxxx
Стек
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Описание
flags RUNVMx_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 и код выхода.
Другие аргументы и возвращаемые значения включаются флагами, см. ниже.
RUNVMXx_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 бесплатны)

См. также