Обновление TVM 2024.04
Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @alexgton.
Добавлены новые инструкции по расчету дешевых комиссионных сборов
Это обновление активно в основной сети с 16 марта (см. https://t.me/tonstatus/101). Предварительный просмотр этого обновления для blueprint доступен в пакетах @ton/[email protected]
, @ton-community/[email protected]
и @ton-community/[email protected]
.
Это обновление активируется Config8 version
>= 6.
c7
c7 кортеж расширен с 14 до 16 элементов:
- 14: кортеж, содержащий некоторые параметры конфигурации в виде срезов ячеек. Если параметр отсутствует в конфигурации, значение равно null.
- 0:
StoragePrices
изConfigParam 18
. Не весь словарь, а только одна запись StoragePrices, которая соответствует текущему времени. - 1:
ConfigParam 19
(глобальный идентификатор). - 2:
ConfigParam 20
(цены на газ mc). - 3:
ConfigParam 21
(цены на газ). - 4:
ConfigParam 24
(стоимость пересылки mc). - 5:
ConfigParam 25
(стоимость пересылки). - 6:
ConfigParam 43
(ограничения по размеру).
- 0:
- 15: "причитающийся платеж" - текущий долг за плату за хранение (nanoton). Код операции Asm:
DUEPAYMENT
. - 16: "использование предварительно скомпилированного газа" - использование газа для текущего контракта, если он предварительно скомпилирован (см. ConfigParam 45), в противном случае null. Код операции Asm:
GETPRECOMPILEDGAS
.
Идея этого расширения c7 распакованными параметрами конфигурации заключается в следующем: эти данные будут извлечены из глобальной конфигурации исполнителем транзакции, поэтому они уже представлены в памяти исполнителя. Однако (до расширения) смарт-контракту необходимо получать все эти параметры по одному из словаря конфигурации, что является дорогостоящим и потенциально непредсказуемым по газу (поскольку стоимость зависит от количества параметров).
Необходима оплата по факту, чтобы контракт мог правильно оценить плату за хранение: когда сообщение отправляется в режиме по умолчанию (возвращаемом) в смарт-контракт, плата за хранение вычитается (или добавляется в поле due_payment, содержащее долг, связанный с платой за хранение), предыдущее значение сообщения добавляется к балансу. Таким образом, если контракт после обработки сообщения отправляет излишки газа обратно с режимом = 64, это означает, что если баланс контракта достигнет 0, при следующих транзакциях плата за хранение начнет накапливаться в due_payment (а не вычитаться из входящих сообщений). Таким образом, долг будет молча накапливаться до тех пор, пока аккаунт не будет заморожен. DUEPAYMENT
позволяет разработчику явно учитывать/удерживать комиссию за хранение и тем самым предотвращать любые проблемы.
Новые коды операций
Коды операций для работы с новыми значениями c7
26 газа для каждого, за исключением SENDMSG
(из-за операций с ячейками).
Синтаксис Fift | Стек | Описание |
---|---|---|
UNPACKEDCONFIGTUPLE | - c | Извлекает кортеж срезов конфигураций из c7 |
DUEPAYMENT | - i | Извлекает значение причитающегося платежа из c7 |
GLOBALID | - i | Теперь извлекает ConfigParam 19 из from c7, формируя словарь конфигурации. |
SENDMSG | Режим msg - i | Теперь извлекает ConfigParam 24/25 (цены сообщений) и ConfigParam 43 (max_msg_cells ) из c7, а не из словаря конфигурации. |
Коды операций для обработки параметров конфигурации
Введение кортежа срезов конфигураций в исполнителе транзакций TON сделало анализ параметров комиссии более экономичным. Однако, поскольку в будущем могут быть введены новые конструкторы параметров конфигурации, может потребоваться обновление смарт-контрактов для интерпретации этих новых параметров. Для решения этой проблемы были введены специальные коды операций для расчета платы. Эти коды операций считывают параметры из c7 и рассчитывают плату таким же образом, как исполнитель. С введением новых конструкторов параметров эти коды операций будут обновлены для учета изменений. Это позволяет смарт-контрактам полагаться на эти инструкции для расчета платы без необходимости интерпретировать все типы конструкторов.
26 газа для каждого.
Синтаксис Fift | Стек | Описание |
---|---|---|
GETGASFEE | gas_used is_mc - price | Рассчитывает стоимость вычислений в nanoton для транзакции, которая потребляет gas_used газа. |
GETSTORAGEFEE | cells bits seconds is_mc - price | Рассчитывает плату за хранение в nanoton для контракта на основе текущих цен на хранение. cells и bits — это размер AccountState (с дедупликацией, включая корневую ячейку). |
GETFORWARDFEE | cells bits is_mc - price | Рассчитывает стоимость пересылки в nanoton для исходящего сообщения. is_mc равно true, если источник или получатель находятся в мастерчейне, false, если оба находятся в бейсчейне. Обратите внимание, что ячейки и биты в сообщении следует подсчитывать с учетом дедупликации и правил root-is-not-counted. |
GETPRECOMPILEDGAS | - null | зарезервировано, в настоящее время возвращает null . Возвращает стоимость выполнения контракта в единицах газа, если этот контракт предварительно скомпилирован |
GETORIGINALFWDFEE | fwd_fee is_mc - orig_fwd_fee | вычисляет fwd_fee * 2^16 / first_frac . Может использоваться для получения исходного fwd_fee сообщения (в качестве замены для жестко закодированных значений, таких как это) из fwd_fee , проанализированного из входящего сообщения. is_mc имеет значение true, если отправитель или получатель находятся в мастерчейне, и false, если оба находятся в бейсчейне. |
GETGASFEESIMPLE | gas_used is_mc - price | Рассчитывает дополнительные вычислительные затраты в nanoton для транзакции, которая потребляет дополнительные gas_used . Другими словами, то же самое, что GETFORWARDFEESIMPLE , но без фиксированной цены (просто (gas_used * price) / 2^16 ). |
GETFORWARDFEESIMPLE | cells bits is_mc - price | Вычисляет дополнительную стоимость пересылки в nanoton для сообщения, содержащего дополнительные cells и bits . Другими словами, то же самое, что GETFORWARDFEE , но без фиксированной цены (просто (bits*bit_price + cells*cell_price) / 2^16 ). |
gas_used
, cells
, bits
, time_delta
— целые числа в диапазоне 0..2^63-1
.
Операции на уровне ячеек
Операции для работы с доказательствами Меркла, где ячейки могут иметь ненулевой уровень и несколько хешей. 26 газа для каждого.
Синтаксис Fift | Стек | Описание |
---|---|---|
CLEVEL | cell - level | Возвращает уровень ячейки |
CLEVELMASK | cell - level_mask | Возвращает маску уровня ячейки |
i CHASHI | cell - hash | Возвращает i -й хэш ячейки |
i CDEPTHI | cell - depth | Возвращает i -ую глубину ячейки |
CHASHIX | cell i - depth | Возвращает i -й хэш ячейки |
CDEPTHIX | cell i - depth | Возвращает i -ую глубину ячейки |
i
находится в диапазоне 0..3
.