跳到主要内容

新指令介绍,用于计算廉价手续费

提示

此更新已在测试网激活,预计将于4月在主网激活。此更新的预览版本可在@ton-community/sandbox@0.16.0-tvmbeta.3@ton-community/func-js@0.6.3-tvmbeta.3@ton-community/func-js-bin@0.4.5-tvmbeta.3包中找到。

此更新通过Config8 version >= 6进行激活。

c7

c7 元组从14扩展到16个元素:

  • 14:包含一些配置参数(作为cell切片)的元组。如果配置中缺少参数,则该值为null。
    • 0ConfigParam 18中的StoragePrices。不是整个字典,而只是与当前时间对应的一个StoragePrices条目。
    • 1ConfigParam 19(全局id)。
    • 2ConfigParam 20(mc gas价格)。
    • 3ConfigParam 21(gas价格)。
    • 4ConfigParam 24(mc 转发费用)。
    • 5ConfigParam 25(转发费用)。
    • 6ConfigParam 43(大小限制)。
  • 15:"到期支付" - 当前储存费用的债务(nanotons)。汇编操作码:DUEPAYMENT

扩展c7以包含未打包配置参数的背后思想如下:这些数据将由交易执行器从全局配置中检索,因此它已经呈现在执行器的内存中。然而(扩展之前)智能合约需要一个接一个地从配置字典中获取所有这些参数,这既昂贵且可能因 gas(由于成本取决于参数数量)而不可预测。

需要到期支付,以便合约能够正确评估存储费用。

新操作码

用于处理新c7值的操作码

每个操作码使用26 gas,SENDMSG除外(因为涉及cell操作)。

xxxxxxxxxxxxxxxxxxxxxx
Fift语法
xxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
UNPACKEDCONFIGTUPLE- c从c7检索配置切片的元组
DUEPAYMENT- i从c7检索到期支付的值
GLOBALID- i现在从c7检索ConfigParam 19,而不是直接从配置字典。
SENDMSGmsg mode - i现在从c7检索ConfigParam 24/25(消息价格)和ConfigParam 43max_msg_cells),而不是直接从配置字典。

处理配置参数的操作码

在TON交易执行器中引入配置参数切片元组,使解析费用参数更加经济高效。然而,由于未来可能会引入新的配置参数构造器,智能合约可能需要更新以解释这些新参数。为解决此问题,引入了专门的操作码来进行费用计算。这些操作码从c7读取参数,并以与执行器相同的方式计算费用。随着新参数构造器的引入,这些操作码将更新以适应变化。这允许智能合约依靠这些指令进行费用计算,而无需解释所有类型的构造器。

每个操作码使用26 gas。

xxxxxxxxxxxxxxxxxxxxxx
Fift语法
xxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
GETGASFEEgas_used is_mc - price为消耗gas_used gas 的交易计算计算成本(nanotons)。
GETSTORAGEFEEcells bits seconds is_mc - price基于当前存储价格为合约计算存储费用(nanotons)。cellsbitsAccountState的大小(包括去重,包含根cell)。
GETFORWARDFEEcells bits is_mc - price为出站消息计算转发费用(nanotons)。is_mc如果源或目的地在主链上则为true,如果两者都在基本链上则为false。注意,应该按照去重和root-is-not-counted规则计算消息中的cell和位。
GETPRECOMPILEDGAS- null保留,当前返回null。如果此合约是预编译的,则将返回合约执行的成本(以 gas cell计)。
GETORIGINALFWDFEEfwd_fee is_mc - orig_fwd_fee计算fwd_fee * 2^16 / first_frac。可用于获取消息的原始fwd_feeis_mc如果源或目的地在主链上则为true,如果两者都在基本链上则为false。
GETGASFEESIMPLEgas_used is_mc - price为消耗额外gas_used的交易计算额外计算成本(nanotons)。换句话说,与GETGASFEE相同,但没有固定价格(仅(gas_used * price)/ 2^16)。
GETFORWARDFEESIMPLEcells bits is_mc - price为包含额外cellsbits的消息计算额外转发成本(nanotons)。换句话说,与GETFORWARDFEE相同,但没有固定价格(仅(bits*bit_price + cells*cell_price)/ 2^16)。

gas_usedcellsbitstime_delta是范围0..2^63-1内的整数。

cell层级操作

用于处理Merkle证明的操作,其中cell可以具有非零层级和多个哈希。

每个操作码使用26 gas。

xxxxxxxxxxxxxxxxxxxxxx
Fift语法
xxxxxxxxx
堆栈
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
描述
CLEVELcell - level返回cell的级别
CLEVELMASKcell - level_mask返回cell的级别掩码
i CHASHIcell - hash返回cell的ith哈希
i CDEPTHIcell - depth返回cell的ith深度
CHASHIXcell i - depth返回cell的ith哈希
CDEPTHIXcell i - depth返回cell的ith深度

i的范围是0..3