Обновление TVM 2023.07
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Это обновление запущено в основной сети с декабря 2023 года.
c7
c7 — это регистр, в котором хранится локальная контекстная информация, необходимая для выполнения контракта (например, время, lt, конфигурации сети и т. д.).
c7 кортеж расширен с 10 до 14 элементов:
- 10:
cell
с кодом самого смарт-контракта. - 11:
[integer, maybe_dict]
: значение ТON входящего сообщения, дополнительные валюты. - 12:
integer
, сборы, собранные на этапе хранения. - 13:
tuple
с информацией о предыдущих блоках.
10 В настоящее время код смарт-контракта представлен на уровне TVM только как исполняемое продолжение и не может быть преобразован в ячейку. Этот код часто используется для авторизации соседнего контракта того же типа, например jetton-wallet авторизует jetton-wallet. На данный момент нам нужно явно хранить ячейку кода в хранилище, что делает хранилище и init_wrapper более громоздкими, чем они могли бы быть. Использование 10 для кода совместимо с обновлением Everscale tvm.
11 В настоящее время значение входящего сообщения представлено в стеке после инициализации TVM, поэтому при необходимости во время выполнения
нужно либо сохранить его в глобальной переменной, либо передать через локальные переменные
(на уровне funC это выглядит как дополнительный аргумент msg_value
во всех функциях).
Поместив его в элемент 11, мы повторим поведение баланса контракта: он представлен как в стеке, так и в c7.
12 В настоящее время единственный способ рассчитать плату за хранение — это сохранить баланс в предыдущей транзакции, как-то рассчитать потребление газа в предыдущей транзакции, а затем сравнить с текущим балансом за вычетом значения сообщения. Между тем, часто требуется учитывать плату за хранение.
13 В настоящее время нет способа извлечь данные о предыдущих блоках. Одной из ключевых особенностей TON является то, что каждый структура представляет собой дружественный к доказательству Меркла пакет (дерево) ячеек, более того, TVM также дружественна к ячейкам и доказательсву Меркла. Таким образом, если мы включим информацию о блоках в контекст TVM, станет возможным реализовать множество не требующих доверия сценариев: контракт A может проверять транзакции по контракту B (без сотрудничества с B), можно восстановить разорванные цепочки сообщений (когда recovery-contract получает и проверяет доказательства того, что некоторая транзакция произошла, но была отменена), также требуется знание хэшей блоков мастерчейна для выполнения некоторых функций проверки onchain.
Идентификаторы блоков представлены в следующем формате:
[ wc:Integer shard:Integer seqno:Integer root_hash:Integer file_hash:Integer ] = BlockId;
[ last_mc_blocks:[BlockId0, BlockId1, ..., BlockId15]
prev_key_block:BlockId ] : PrevBlocksInfo
Включены идентификаторы последних 16 блоков мастерчейна (или меньше, если seqno мастерчейна меньше 16), а также последний ключевой блок. Включение данных о шардблоках может вызвать некоторые проблемы с доступностью данных (из-за событий слияния/разделения), это не обязательно треб уется (так как любое событие/данные могут быть подтверждены с помощью блоков мастерчейна), поэтому мы решили не включать их.
Новые коды операций
Основное правило при выборе стоимости газа для новых кодов операций заключается в том, что она не должна быть меньше обычной (рассчитанной по длине кода операции) и должна занимать не более 20 нс на единицу газа.
Коды операций для работы с новыми значениями c7
26 газа для каждого, за исключением PREVMCBLOCKS
и PREVKEYBLOCK
(34 газа).
Синтаксис Fift | Стек | Описание |
---|---|---|
MYCODE | - c | Извлекает код смарт-контракта из c7 |
INCOMINGVALUE | - t | Извлекает значение входящего сообщен ия из c7 |
STORAGEFEES | - i | Извлекает значение платы за фазу хранения из c7 |
PREVBLOCKSINFOTUPLE | - t | Извлекает PrevBlocksInfo: [last_mc_blocks, prev_key_block] из c7 |
PREVMCBLOCKS | - t | Извлекает только last_mc_blocks |
PREVKEYBLOCK | - t | Извлекает только prev_key_block |
GLOBALID | - i | Извлекает global_id из 19 конфигурации сети |
Газ
Синтаксис Fift | Стек | Описание |
---|---|---|
GASCONSUMED | - g_c | Возвращает газ, потребленный виртуальной машиной на данный момент (включая эту инструкцию). 26 газа |