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

Обновление TVM 2024.04

warning

Эта страница переведена сообществом на русский язык, но нуждается в улучшениях. Если вы хотите принять участие в переводе свяжитесь с @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 (ограничения по размеру).
  • 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

Стек

Описание
GETGASFEEgas_used is_mc - priceРассчитывает стоимость вычислений в nanoton для транзакции, которая потребляет gas_used газа.
GETSTORAGEFEEcells bits seconds is_mc - priceРассчитывает плату за хранение в nanoton для контракта на основе текущих цен на хранение. cells и bits — это размер AccountState (с дедупликацией, включая корневую ячейку).
GETFORWARDFEEcells bits is_mc - priceРассчитывает стоимость пересылки в nanoton для исходящего сообщения. is_mc равно true, если источник или получатель находятся в мастерчейне, false, если оба находятся в бейсчейне. Обратите внимание, что ячейки и биты в сообщении следует подсчитывать с учетом дедупликации и правил root-is-not-counted.
GETPRECOMPILEDGAS- nullзарезервировано, в настоящее время возвращает null. Возвращает стоимость выполнения контракта в единицах газа, если этот контракт предварительно скомпилирован
GETORIGINALFWDFEEfwd_fee is_mc - orig_fwd_feeвычисляет fwd_fee * 2^16 / first_frac. Может использоваться для получения исходного fwd_fee сообщения (в качестве замены для жестко закодированных значений, таких как это) из fwd_fee, проанализированного из входящего сообщения. is_mc имеет значение true, если отправитель или получатель находятся в мастерчейне, и false, если оба находятся в бейсчейне.
GETGASFEESIMPLEgas_used is_mc - priceРассчитывает дополнительные вычислительные затраты в nanoton для транзакции, которая потребляет дополнительные gas_used. Другими словами, то же самое, что GETFORWARDFEESIMPLE, но без фиксированной цены (просто (gas_used * price) / 2^16).
GETFORWARDFEESIMPLEcells 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

Стек

Описание
CLEVELcell - levelВозвращает уровень ячейки
CLEVELMASKcell - level_maskВозвращает маску уровня ячейки
i CHASHIcell - hashВозвращает i-й хэш ячейки
i CDEPTHIcell - depthВозвращает i-ую глубину ячейки
CHASHIXcell i - depthВозвращает i-й хэш ячейки
CDEPTHIXcell i - depthВозвращает i-ую глубину ячейки

i находится в диапазоне 0..3.