Lazy loaded image
Lazy loaded imageFIL 手续费计算逻辑及优化
字数 1853阅读时长 5 分钟
2024-12-4
2025-3-16
type
Post
status
Published
date
Dec 4, 2024
slug
fil-gas-fee
summary
FIL 链上手续费计算逻辑梳理 + 优化
tags
Wallet
区块链
filecoin
category
程序人生
icon
password

简介

https://spec.filecoin.io/systems/filecoin_vm/gas_fee/
与许多区块链的传统情况一样,Gas 是衡量链上消息操作执行时需要消耗多少存储和/或计算资源的单位。从高层次来看,它的工作原理如下:消息发送者指定他们愿意支付的最高金额,以便执行他们的消息并将其包含在区块中。这既包括 Gas 单位总数 ( GasLimit ),通常预计会高于实际GasUsed也包括每单位 Gas 的价格(或费用)( GasFeeCap )。
传统上, GasUsed * GasFeeCap会作为奖励分配给出块矿工。此乘积的结果被视为消息包含的优先费用,即消息按降序排列, GasUsed * GasFeeCap最高的消息将获得优先处理,因为它们会为矿工带来更多利润。
然而,据观察,这种策略(支付GasUsed * GasFee )对于区块生产矿工来说存在问题,原因如下。首先,区块生产矿工可能会免费包含一条非常昂贵的消息(就所需的链资源而言),在这种情况下,链本身需要承担成本。其次,消息发送者可以对低成本消息(同样,就链资源而言)设定任意高的价格,从而导致 DoS 漏洞。
为了克服这种情况,Filecoin 区块链定义了一个BaseFee ,每条消息都会被销毁。理由是,鉴于 Gas 是链上资源消耗的衡量标准,因此销毁它比奖励给矿工更有意义。这样,就避免了矿工操纵费用。BaseFee 是动态的,会根据网络拥塞自动调整。这一事实使网络能够抵御垃圾邮件攻击BaseFee鉴于网络负载在垃圾邮件攻击期间增加,由于BaseFee不断增加,攻击者不可能长时间维护完整的垃圾邮件块。
最后, GasPremium是发送者附加的优先费用,用于激励矿工挑选最有利可图的消息。换句话说,如果消息发送者希望自己的消息更快地被收录,他们可以设置更高的GasPremium

备注

  • GasFeeCap应始终高于网络的BaseFee
  • 如果BaseFee + GasPremium > GasFeeCap ,那么矿工可能无法获得整个GasLimit * GasPremium作为奖励。
  • 消息的花费被严格限制在不超过GasFeeCap * GasLimit范围内。从这个金额中,首先支付(烧掉)网络BaseFee 。之后,最多可获得GasLimit * GasPremium奖励给矿工。
  • GasFeeCap值较低可能会导致消息滞留在消息池中,因为从利润角度来看,它对任何矿工来说都没有足够的吸引力来选择它并将其包含在区块中。当这种情况发生时,有一个程序可以更新GasFeeCap ,以便消息对矿工更具吸引力。发送者可以将新消息推送到消息池(默认情况下,它将传播到其他矿工的消息池),其中:i)旧消息和新消息的标识符相同(例如,相同的Nonce )并且 ii) GasPremium已更新并至少增加到之前值的 25%。

GAS计算

FIL转账由3部分组成,基础燃烧、超额燃烧、矿工小费。在当前的网络情况下,比例如下图所示。
notion image
手续费计算逻辑如下:
燃烧:(baseFee * gasUsed)+
矿工小费:(GasPremium*GasLimit)+
溢出燃烧:(ComputeGasOverestimationBurn() * baseFee)

BaseFee

https://github.com/filecoin-project/lotus/blob/master/chain/store/basefee.go
notion image
大概计算步骤如下:
  • 最小的baseFee
abi.NewTokenAmount(100)
  • 区块Gas Limit
    • 区块中所有交易的Gas Limit的总和
  • 区块Gas Limit的“超出”部分
    • 每个区块存在Gas Limit的目标大小 - BlockGasTarget。超过BlockGasTarget的部分,视为超出部分。注意超出部分,可正可负。
  • 更新的baseFee
下一个区块的baseFee,在当前区块的baseFee的基础上增加超出部分的12.5%(BaseFeeMaxChangeDenom)。相关计算逻辑如下:
简单的说,当前区块中的Gas Limit消耗超出了BlockGasTarget,则base Fee增加超出部分的12.5%。在这样的逻辑下,你会发现在交易多的情况下,base Fee会增加迅速增加和降低。
💡
baseFee 代码底层维护,不需要计算
最新24小时的base Fee可以在飞狐浏览器查看 https://filfox.info/zh/stats/gas
notion image

GasLimit

一个交易消耗的Gas Limit几乎是固定的。
💡
如果 to 地址有资产,gasLimit 较低(1,226,263);如果 to 地址新建,gasLimit 较高(5,745,509)
可以通过接口获取

GasPremium

GasPremium是消息发送者愿意支付的每单位 gas 价格(以 attoFIL/gas 为BaseFee ),用于“给”将此消息包含在区块中的矿工“小费”。一条消息通常会为矿工赚取GasLimit * GasPremium attoFIL,其中实际上是 GasPremium = GasFeeCap - BaseFee 。请注意, GasPremium应用于GasLimit ,而不是GasUsed ,以便让矿工的消息选择更加直接。
可以通过接口获取

GasFeeCap

GasFeeCap是消息发送者愿意为每单位 gas 支付的最高价格(以 attoFIL/gas 单位为单位)。GasFeeCap 与GasLimit一起设置了发送者为一条消息支付的最高 FIL 金额:保证发送者一条消息的费用绝不会超过GasLimit * GasFeeCap GasFeeCap
可以通过接口获取

溢出燃烧费

https://github.com/filecoin-project/lotus/blob/926d924d3e782b05f130c7ebcbede58f0532544f/chain/vm/burn.go
notion image
💡
只要 GasLimit 不超过 GasUsed太多(10%)即可

JSON-RPC

GasEstimateFeeCap

GasEstimateGasLimit

GasEstimateGasPremium

GasEstimateMessageGas (直接用这个就行)

https://docs.filecoin.io/reference/json-rpc/gas#gasestimatemessagegas
响应结果:

实例

用例一

https://filscan.io/message/bafy2bzaced52ngvtq25rgtnpzcpz4h5fn7kunikvzlwo5dc3xlsnt35fj22yu/
notion image
以上述交易为例:
  • 手续费 = 节点手续费 + 销毁手续费
    • 1,095.7542 nanoFIL = 1,044.9581 nanoFIL + 50.796 nanoFIL ✅
  • 节点手续费 = 节点小费费率 * Gas 用量上限
    • 1,044.9581 nanoFIL = 145,565 attoFIL * 7,178,636 ✅
  • 销毁手续费 = 基础手续费 * Gas实际用量Gas 用量上限
    • 50.796 nanoFIL = 7,076 attoFIL * 7,178,636 ✅
注:销毁手续费 本应该是 基础手续费 * Gas实际用量,但是用户设置的 Gas 用量上限远远大于 Gas 实际用量,触发了惩罚机制,所以销毁手续费变成了 基础手续费 * Gas 用量上限

用例二

https://filscan.io/message/bafy2bzaced5dfx5ob5xuongzzc7mx357nqn2ggdfn4mfcqtqfvosyz76qi35a/
notion image
  • 销毁手续费 = 基础手续费 * Gas实际用量
    • 110.7431 nanoFIL = 19,266 attoFIL * 5,748,109 ✅

用例三

https://filscan.io/message/bafy2bzaceau5662qox62zyr6kykkhh5lizyywrpp6fejfox3twd4l5oxclxyq/
notion image

请求参数:自测交易

GasLimit:7178636
GasPremium:99208
GasFeeCap:100357
请求参数和交易详情是匹配的,验证如下
  • 手续费 = 节点手续费 + 销毁手续费(销毁手续费 + 溢出手续费)
    • 712.786 nanoFIL = 712.1781 nanoFIL + 0.6079 nanoFIL
  • 节点手续费 = 节点小费费率 * Gas 用量上限
    • 712.1781 nanoFIL = 99,208 attoFIL * 7,178,636 ✅
  • 销毁手续费 = 基础手续费 * Gas 用量上限
    • 0.5860 nanoFIL = 102 attoFIL * 5,745,509 ✅
  • 溢出手续费
    • over:(7,178,636-11*5,745,509/10) = 858576.1
      gasToBurn:7,178,636 - 5,745,509 = 1433127
      gasToBurn:1433127 * 858576.1 = 1230448590464.7
      gasToBurn:1230448590464.7 / 5,745,509 = 214158.326.....
      overBurnFee: 214158.326 * 102 = 0.021844116 nanoFIL ✅

参考文档:

 
 
上一篇
win11 24H2 重装系统记录
下一篇
Ubuntu 部署 Nginx Proxy Manager

评论
Loading...