新指令介绍,用于计算廉价手续费
提示
此更新已在测试网激活,预计将于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。
- 0:
ConfigParam 18中的StoragePrices。不是整个字典,而只是与当前时间对应的一个StoragePrices条目。 - 1:
ConfigParam 19(全局id)。 - 2:
ConfigParam 20(mc gas价格)。 - 3:
ConfigParam 21(gas价格)。 - 4:
ConfigParam 24(mc 转发费用)。 - 5:
ConfigParam 25(转发费用)。 - 6:
ConfigParam 43(大小限制)。
- 0:
- 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,而不是直接从配置字典。 |
SENDMSG | msg mode - i | 现在从c7检索ConfigParam 24/25(消息价格)和ConfigParam 43(max_msg_cells),而不是直接从配置字典。 |
处理配置参数的操作码
在TON交易执行器中引入配置参数切片元组,使解析费用参数更加经济高效。然而,由于未来可能会引入新的配置参数构造器,智能合约可能需要更新以解释这些新参数。为解决此问题,引入了专门的操作码来进行费用计算。这些操作码从c7读取参数,并以与执行器相同的方式计算费用。随着新参数构造器的引入,这些操作码将更新以适应变化。这允许智能合约依靠这些指令进行费用计算,而无需解释所有类型的构造器。
每个操作码使用26 gas。
| xxxxxxxxxxxxxxxxxxxxxx Fift语法 | xxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 |
|---|---|---|
GETGASFEE | gas_used is_mc - price | 为消耗gas_used gas 的交易计算计算成本(nanotons)。 |
GETSTORAGEFEE | cells bits seconds is_mc - price | 基于当前存储价格为合约计算存储费用(nanotons)。cells与bits是AccountState的大小(包括去重,包含根cell)。 |
GETFORWARDFEE | cells bits is_mc - price | 为出站消息计算转发费用(nanotons)。is_mc如果源或目的地在主链上则为true,如果两者都在基本链上则为false。注意,应该按照去重和root-is-not-counted规则计算消息中的cell和位。 |
GETPRECOMPILEDGAS | - null | 保留,当前返回null。如果此合约是预编译的,则将返回合约执行的成本(以 gas cell计)。 |
GETORIGINALFWDFEE | fwd_fee is_mc - orig_fwd_fee | 计算fwd_fee * 2^16 / first_frac。可用于获取消息的原始fwd_fee。is_mc如果源或目的地在主链上则为true,如果两者都在基本链上则为false。 |
GETGASFEESIMPLE | gas_used is_mc - price | 为消耗额外gas_used的交易计算额外计算成本(nanotons)。换句话说,与GETGASFEE相同,但没有固定价格(仅(gas_used * price)/ 2^16)。 |
GETFORWARDFEESIMPLE | cells bits is_mc - price | 为包含额外cells和bits的消息计算额外转发成本(nanotons)。换句话说,与GETFORWARDFEE相同,但没有固定价格(仅(bits*bit_price + cells*cell_price)/ 2^16)。 |
gas_used、cells、bits、time_delta是范围0..2^63-1内的整数。
cell层级操作
用于处理Merkle证明的操作,其中cell可以具有非零层级和多个哈希。
每个操作码使用26 gas。
| xxxxxxxxxxxxxxxxxxxxxx Fift语法 | xxxxxxxxx 堆栈 | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 描述 |
|---|---|---|
CLEVEL | cell - level | 返回cell的级别 |
CLEVELMASK | cell - level_mask | 返回cell的级别掩码 |
i CHASHI | cell - hash | 返回cell的ith哈希 |
i CDEPTHI | cell - depth | 返回cell的ith深度 |
CHASHIX | cell i - depth | 返回cell的ith哈希 |
CDEPTHIX | cell i - depth | 返回cell的ith深度 |
i的范围是0..3。