为了帮助读者更好地理解Gas费机制,以下是信息及其交互产生的Gas的相关概念。这些字段可以由消息发送者设置,但目前在lotus中是自动化的。当然,大家也可以开发更多的工具。
GasLimit – 是一种对Gas量的限制,这意味着消息的执行可以由消息发送方使用、预估和指定。区块中包含的所有消息的GasLimit之和不得超过BlockGasLimit。这是以GasUnit为单位的。
GasUsage – 是一条消息的执行实际消耗的Gas量。当前协议不知道消息在执行之前将确切消耗多少Gas。这是以GasUnit为单位的。
GasFeeCap – 发送方愿意为在区块中包含一条消息而为每个GasUnit支付的最大虚拟货币量。发送消息时,消息发送者的最低余额必须等于GasFeeCap乘以GasLimit的最低余额,即使这些余额不会全部消耗掉。以attoFIL / GasUnit为单位。
GasPremium – 按每单位GasLimit价格向区块生产矿工支付的优先费。这是由GasFeeCap和BaseFee有更高的优先级。这受GasFeeCap的限制,BaseFee具有更高的优先级。这以attoFIL / GasUnit为单位的,并且可以低至1 attoFIL / GasUnit。
BaseFee – 一种网络范围的变量,可以根据前一个tipset中所有消息的GasLimit之和进行动态调整。当总GasLimit超过某个区块(网络拥塞信号)的GasLimit目标时,它将增加,低于GasLimit目标时降低。以attoFIL / GasUnit为单位。
消息发送方只需为每个消息指定一个GasFeeCap和GasLimit。随着链上资源的消耗,GasUsage乘以BaseFee将被消耗。从GasFeeCap中减去BaseFee将产生GasPremium。GasPremium乘以GasLimit将作为优先费用进入生产矿工的区块。GasLimit和GasUsage之间的部分差异将作为高估损失而被消耗掉。其余的将返回给消息发送方。
目前,默认实现是矿工根据GasFeeCap/GasLimit选择消息,以在给定区块的GasLimit的情况下最大化其预期回报。当网络拥塞且BaseFee很高时,矿工可以选择对区块进行分组,从而降低GasLimit总量,以降低BaseFee,但可能以牺牲GasPremium为代价。