Filecoin专栏 | 详解Filecoin 手续费模型--超额燃烧

TODD

    前言:Filecoin 主网上线前,作者曾写文章分析过 Filecoin 手续费模型,讨论过关于 Filecoin 改 用 EIP-1559 设计后的手续费计算模型和优缺点。在讨论计算模型时,默认为理性的交易发送者不会设置超过 Gas 燃烧阙值,但在现实情况中,官方给定的设置却出现了 Gas 超额燃烧 的不理性的结果。
    本文作为《Filecoin 手续费模型 -EIP1559》(https://zhuanlan.zhihu.com/p/234700165)的姊妹篇,进一步分析了 Filecoin 的手续费模型中的超额燃烧,并介绍一种降低超额燃烧费的方法。
    
    

作者 |?litianc
    

来源 |??Blockcasting&BitTribeLab?
    Filecoin 的手续费回顾
    在之前的文章中,我们介绍了 Filecoin 采用 EIP-1559 的方案,用于解决恶意设置 GasLimit 的问题。我们从宏观层面分析了交易手续费的计算模型和主要影响因素。?
    当时,由于理解有限,文中将 GasLimit 直接套用在 Gas 实际燃烧(gasToBurn)的概念上, 但是这样的描述是不准确的。理论上,这样计算出的结果已接近实际 FIL 消耗,但在特定情 况下会有最多 10%的偏差,这一偏差就是我们中所说的超额燃烧费。?
    那么,为什么会有超额燃烧,在何种情况下会产生超额燃烧呢?
    超额燃烧的由来
    我们知道,Gas 是由交易发送者支付的 Filecoin 链上资源消耗对应的燃料数量,类比汽车行驶一段距离需要消耗相应的汽油 xx 升。
    与以太坊相似的,Filecoin 的 Gas 也有 GasLimit 和 GasUsed 的概念。
    

  • GasLimit:表示该笔交易最多消耗燃料数量,由交易发送方设置。
  • GasUsed:表示交易上链所消耗的燃料数量,在交易上链之后计算出来。

    与以太坊不同的是,Filecoin 区块中包含的所有消息的 GasLimit 之和不得超过 BlockGasLimit;而以太坊是统计所有消息的 GasUsed 之和。
    一个有趣的知识点:由于 Filecoin 的区块链采用 DAG 结构,一个 Tipset 中可以有多个区块,同一高度下的区块顺序由下一个 Tipset 的区块统计。因此,交易产生的 GasUsed 只有在下一个 Tipset 的区块上链后才能被准确计算出来。
    正是由于设计的差异,决定了 Filecoin 需要对 Gas 进行更复杂的设计,于是就有了 Gas 超额燃烧的概念。Gas 超额燃烧的设计出现在 EIP-1559 上线之前,它与 EIP-1559 并不冲突,可以把它看作是比 EIP-1559 更基础的 Gas 模型规则。
    超额燃烧的计算
    Gas 超额燃烧(GasOverestimationBurn):当 GasLimit 和 GasUsed 之间的差异较大时,需要燃烧的额外 Gas 量。
    根据 GasLimit 与 GasUsed 的数值,我们将 Gas 分为三种情况:
    (为了方便建模,假设评估系数 k = GasLimit / GasUsed)
    
  1. GasLimit 较接近 GasUsed(1 <= k < 1.1)时,认为 GasLimit 设置合理:
        GasOverestimationBurn = 0
  2. GasLimit 明显大于 GasUsed(k >= 2.1)时,认为 GasLimit 设置不合理:
        GasOverestimationBurn = GasLimit - GasUsed
  3. 当 GasLimit 处于上述两者之间( 1.1 <= k < 2.1)时,认为这是一个过渡范围,采用抛物线进行拟合:

    GasOverestimationBurn = (GasLimit - 1.1* GasUsed) * (GasLimit - GasUsed) /GasUsed?
    GasOverestimationBurn = (k - 1.1) * (k - 1) * GasUsed
    接下来,采用控制变量法,假设 GasUsed=30000,横轴为 k,纵轴为 GasOverestimationBurn,得出 Gas 超额燃烧曲线,如下图:
    
    从 Gas 超额燃烧曲线,我们能够看出当 GasLimit 设置越高,超额燃烧也就越高;GasLimit 越接近 GasUsed,超额燃烧也就越少,在合理的 GasLimit 条件下,超额燃烧为 0。?
    正常情况下,Filecoin 客户端只需要在设置 GasLimit 时,比预估的 Gas 设置稍高一点(蓝色区间),就能实现“零”超额燃烧。但是现实却是,官方代码中给定的默认系数 k=1.25, 因此现阶段链上的大多数的交易都产生了超额燃烧费用。这究竟是一个 Feature,还是一个 Bug 呢?让我们继续往下分析。
    Feature 还是 Bug
    通过官方社群交流平台的记录和 github 上的问题追踪,我们最终确定这是由一个 Bug 引 发的官方修改。在主网上线3 个月后,社区成员提交的一个[问题报告](https://github.com/filecoin-project/lotus/issues/5066)。
    报告内容是 ProveCommitSector 交易类型(以下简称 Prove 交易)的 Gas 评估在特定条件下会有 40%左 右的评估偏差,从而导致 Gas 溢出、交易出错。为了避免 Prove 交易的 Gas 溢出问题,官方经过反复调整,最终还是把默认系数设置为 1.25(即预留 25%的向下波动空间)。
    在 v1.4.2 的版本中,经过我们对自建节点三种交易类型的数据分析,得出以下结论:
    
  • ?Prove 交易的评估偏差波动较大,最低与最高相差 40%;
  • PreCommitSector(以下简称 Precommit)交易的有一定偏差,但偏差波动较小;
  • SubmitWindowedPoSt(以下简称WindowedPoSt)交易能准确评估。
超额燃烧优化
    上述三种交易是当前 Filecoin 网络矿工消耗手续费最多的交易类型。如果能够减少这三类交易的超额燃烧,甚至做到“零”超额燃烧,对矿工来说可以节省不小的开销。?
    我们对超额燃烧进行优化的基本思路是根据不同的交易类型分别实现。目前能够直接实现 “零”超额燃烧的交易有 PreCommit 交易和 WindowedPoSt 交易;对于 Prove 交易,需等到 共识部分的代码完善后才能实现最理想的优化。(Ps:3.4 的 v1.5.0 升级有部分改动,Prove 交易数据需进一步实测)?
    因此,对于不同阶段的矿工,可操作的优化方法和优化空间也有所不同。?
    对于算力已经稳定,只需要发送 WindowedPoSt 交易的矿工,优化的操作比较简单:可以直接调整 mpool 中的评估系数 GasLimitOverestimation,直至“零”超额燃烧。
    对于正在增加算力的矿工,则需要权衡 Gas 超额燃烧的收益与 Gas 溢出的风险,结合节点新增算力的速度和交易的历史数据,计算出最适合自身节点的评估系数。?
    如果有代码修改能力的矿工,可以尝试在 mpool 的源代码中修改不同的交易类型的评估系 数,从而实现当前手续费的最优化。
    总结
    超额燃烧费是Filecoin区块链搭建之初的基础设计,它的实现不受后来的EIP-1559的影响。这部分费用本身是带有一定惩罚属性的,法不责众,理论上 Filecoin 的所有的交易都应当很容易避免超额燃烧。目前官方正在通过底层数据结构修改来进行完善,以减少 Prove 交易 的 Gas 评估偏差。
    我们相信普遍的超额燃烧情况只是一个短期的状态,通过技术升级最终将解决这一问题。那时,生态应用开发者和用户不必知晓底层复杂的概念逻辑,可以把注意力更多地投入到业务设计和产品体验中。