Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-3416: 中位数 Gas 溢价

Authors HexZorro (@hexzorro), Mojtaba Tefagh (@mtefagh)
Created 2021-03-18
Discussion Link https://ethereum-magicians.org/t/eip-3416-median-gas-premium/5755

简单总结

一种交易定价机制,具有固定的每区块网络费用和具有累加更新的中位数包含费用。

摘要

协议中存在一个每 gas 的基础费用,该费用在每个区块中最多可以上下浮动 1/8。每 gas 的基础费用由协议调整,以针对每个区块的平均 gas 使用量,而不是每个区块的绝对 gas 使用量。当区块超过 gas 限制目标时,基础费用会增加,而当区块低于 gas 限制目标时,基础费用会降低。交易发送者通过提供仅一个值来指定他们的费用:

  • 费用上限,表示交易发送者愿意支付以使其交易被包含在内的最大总额(基础费用 + gas 溢价),类似于发送者指定的当前最大 gas 价格,但在本协议变更提案中,最终支付的 gas 价格在大多数情况下将低于交易发送者提出的价格。

然后有一个 gas 溢价,直接计算为 (费用上限 - 基础费用) 的 50%。此 gas 溢价会被添加到基础费用上,以计算将在加权中位数计算中使用的 gas 价格。gas 溢价由指定的费用上限直接确定,可以设置为相当低的值,仅用于补偿矿工的叔块率风险以及基础费用,或者设置为高值以在突然的活动爆发期间竞争。使用矿工想要包含在区块中的所有交易,计算出加权中位数 gas 溢价,在计算中不考虑顶端 5% 的 gas 价格异常值,以增强针对矿工操纵的稳健性。

动机

我们的目标是实现以下目标:

  • Gas 价格峰值在数学上得以平滑处理。EIP1559 似乎并没有真正解决 gas 溢价的波动性和用户体验。
  • 保持 gas 价格偏好,即愿意支付额外费用的交易发送者将获得优先包含在区块中的奖励,因为矿工希望最大化他们的利润并首先包含具有更高费用上限的交易以最大化中位数。
  • 发送者支付的最终 gas 价格在大多数情况下小于发送者指定的最大 gas 价格。
  • Gas 定价对发送者或矿工的操纵更具鲁棒性。

以太坊目前使用简单的拍卖机制为交易费用定价,用户发送带有出价(“gasprice”)的交易,矿工选择出价最高的交易,并且包含的交易支付他们指定的出价。这导致了几个主要的效率低下来源:

  • 当前 gas 价格的极端波动正在损害用户体验:如果你观察在线 gas 价格指标,当前建议的 gas 价格趋势可能会每分钟发生重大变化,使得网络中的用户体验非常尴尬。此外,gas 波动性使得挖矿业务更加不可预测和昂贵,因为矿工需要花钱对冲风险。
  • 交易费用水平的波动与交易的社会成本不匹配:在成熟的公共区块链上包含交易的出价,这些区块链有足够的使用量以至于区块已满,往往非常不稳定。在以太坊上,最低出价范围为 1 nanoeth(10^9 nanoeth = 1 ETH),但有时会超过 100 nanoeth,并且已经达到 200 nanoeth 以上。这显然会产生许多低效率,因为认为网络因接受更多交易到区块中所产生的成本,在 gas 价格为 200 nanoeth 时实际上比 gas 价格为 1 nanoeth 时高出 200 倍是荒谬的;在这两种情况下,它都是 800 万 gas 和 802 万 gas 之间的差异。
  • 用户不必要的延迟:由于每个区块的 gas 硬性限制以及交易量的自然波动,交易通常需要等待几个区块才能被包含,但这是社会生产力低下的;没有人能从不存在“松弛”机制中获得显着收益,该机制允许一个区块更大,下一个区块更小,以满足区块之间需求的差异。
  • 第一价格拍卖的低效率:目前的方法,交易发送者发布具有最大费用出价的交易,矿工选择支付最高的交易,并且每个人都支付他们出价的费用。这在机制设计文献中是众所周知的非常低效的,因此需要复杂的费用估算算法。但是即使这些算法通常最终也不能很好地工作,导致频繁的费用超额支付。我们需要一种更稳定的费用指标,该指标在协议内部计算。

本 EIP 中的提案是从基本费用金额开始,该金额由协议根据网络拥塞程度进行上下调整。当网络超过每个区块的 gas 使用量目标时,基本费用会略有增加,而当容量低于目标时,基本费用会略有减少。由于这些基本费用变化受到限制,因此基本费用从一个区块到另一个区块的最大差异是可预测的。这使得钱包能够以高度可靠的方式自动为用户设置 gas 费用。预计即使在网络活动高峰期,大多数用户也不必手动调整 gas 费用。对于大多数用户,基本费用将由他们的钱包估算,并且与他们想要灌输到交易中的紧急程度和优先级相关的小额 gas 溢价。

规范

定义

这是一个没有长时间迁移的经典分叉。

  • FORK_BLOCK_NUMBER: 待定。EIP-3416 交易有效的区块号。
  • GAS_TARGET_MAX_CHANGE: 1 // 1024
  • BLOCK_GAS_USED: 区块中包含的交易消耗的总 gas。
  • PARENT_GAS_USED: 父区块的 BLOCK_GAS_USED 相同。
  • CURRENT_BLOCK: 当前正在处理的区块(正在验证或正在生成)。
  • BASE_FEE: 区块头的第 16 项。表示交易使用的每个 gas 单位燃烧的 attoeth 数量。
  • PARENT_BASE_FEE: 父区块的 BASE_FEE 相同。
  • BASE_FEE_MAX_CHANGE: 1 // 8
  • INITIAL_BASE_FEE : FORK_BLOCK_NUMBER - 1 中的中位数 gas 价格。

流程

  • block.number == FORK_BLOCK_NUMBER 时,我们设置 BASE_FEE = INITIAL_BASE_FEE
  • FORK_BLOCK_NUMBER + 1 开始,BASE_FEE 设置如下
    • GAS_DELTA = (PARENT_GAS_USED - PARENT_GAS_TARGET) // PARENT_GAS_TARGET(可能为负数)。
    • 设置 BASE_FEE = PARENT_BASE_FEE + GSA_DELTA * BASE_FEE_MAX_CHANGE
  • FORK_BLOCK_NUMBER 以来的交易编码方式与当前交易相同 rlp([nonce, gasPrice, gasLimit, to, value, data, v, r, s]) 其中 v,r,srlp([nonce, gasPrice, gasLimit, to, value, data]) 的签名,并且 gasPrice 是发送者根据本提案指定的 FEE_CAP
  • 为了生成自 FORK_BLOCK_NUMBER 以来的交易,新的 FEE_CAP 字段(在交易中保持 gasPrice 的旧名称)设置如下(并且 GAS_PREMIUM 的计算方式如下):
    • FEE_CAP: tx.gasPrice,用作交易发送者愿意支付的绝对最大值。
    • GAS_PREMIUM = (FEE_CAP - BASE_FEE) / 2 用作发送者首选的矿工中位数溢价,超出基础费用。
    • 如果 FEE_CAP < BASE_FEE,则该交易被视为无效,无法包含在当前区块中,但可能会包含在未来的区块中。
  • 在交易执行期间,对于 EIP3416 交易,我们计算 tx.origin 的成本和 block.coinbase 的收益如下:
    • 设置 GASPRICE = BASE_FEE + median((tx_i.gasPrice - BASE_FEE) / 2) 在包含在同一区块中的所有交易 tx_i 中,按消耗的 gas 加权,并且不包括计算中顶端 5% 的异常 gas 价格。通过不包含顶端 5% 异常值的加权中位数,我们的意思是根据相应的交易按 BASE_FEE + tx.gasPrice / 2 对花费的每个 gas 单位进行排序,然后选择的值将是分隔较低 95% 的值分为两部分。
    • GASUSED 为交易执行/状态转换期间使用的 gas。
    • tx.origin 最初支付 GASPRICE * tx.gasLimit,并获得 GASPRICE * (tx.gasLimit - GASUSED) 的退款。

矿工仍然可以使用 greedy 策略,通过首先添加按较大 FEE_CAP 排序的交易,将新交易包含在提议的区块中。这与当前区块的填充方式类似,并且是 FEE_CAPGAS_PREMIUM 彼此之间为正线性函数的结果。

理由

溢价为 (费用上限 - 基础费用) 的 50% 背后的理由是,在任何给定的时间点,平均网络发送者都有一个平均费用上限,并且我们假设在基础费用和费用上限之间,发送者没有特定的偏好,只要交易包含在某个区块中即可。然后,发送者对这种均匀范围内的中位数溢价感到满意。另一种理由是,用户也知道完整区块的这种新版本的定价协议使用中位数,那么假设在那里进行均匀采样,对他来说在他自己的首选范围内应用中位数是公平的。使用以太坊 gas 数据的模拟 (此处) 确实表明中位数是最稳健的指标之一。

移除未在中位数中考虑的 5% 顶端异常值,或类似数字,是为了提供额外的稳健性以防止矿工操纵,因为目前网络利用率在过去 6 个月中一直在 97% 左右,矿工可以在空闲的 3% 中包含他们自己的交易,以试图操纵和提高中位数价格(即使这种操纵效应在最终价格上会非常小)。

BASE_FEE 更新公式的理由是,我们使用加法版本 (PARENT_BASE_FEE + GAS_DELTA * BASE_FEE_MAX_CHANGE),以避免发送者发送此费用为零的攻击。在先前版本中提出的乘法公式中,对此攻击进行了模拟和观察 (PARENT_BASE_FEE + PARENT_BASE_FEE * GAS_DELTA * BASE_FEE_MAX_CHANGE)。请参阅有关攻击和模拟的文章 此处

加法 BASE_FEE 更新公式的另一个理由是,它保证(请参阅 文章)对于一批非紧急交易的最佳执行策略(按顺序调度广播以支付更少的费用)是将交易分散在不同的区块中,这反过来有助于避免网络拥塞并降低波动性。对于乘法公式,情况恰恰相反,也就是说,正如 此处 所述,激励了峰值(一次性转储您的所有交易)。

BASE_FEE_MAX_CHANGE1 // 8 的理由是,BASE_FEE 旨在非常适应区块利用率的变化。

向后兼容性

向后兼容性非常简单,因为没有向交易添加新字段。矿工/验证者方面每个区块的 gas 定价仍然可以快速计算,但稍微复杂一些。更改仅影响矿工/验证者。钱包不受此提案的影响。

测试用例

待定。

安全注意事项

  • 发送者无法操纵最低费用,因为最低 BASE_FEE 由矿工控制,每个新提议的区块都有小幅增加或减少。
  • BASE_FEE 之上,发送者操纵和降低他们支付的最终 gas 价格的能力非常有限,因为他们必须将加权中位数移至接近 BASE_FEE,并且我们知道这是一个非常稳健的统计数据。
  • 矿工操纵和提高发送者支付的最终 gas 价格高于 BASE_FEE 的能力非常有限,因为为了影响最终 gas 价格,他们必须在区块的顶端 5% 之外填充虚假交易。平均而言,目前只有区块的顶端 3% 是空的,因此要填充 5% 的区块,他们需要开始删除有利可图的交易才能达到 5%。只有超过区块 gas 的顶端 5%,他们才能开始稍微移动中位数,并且中位数仍然是一个非常稳健的统计数据,不易被操纵。

版权

通过 CC0 放弃版权及相关权利。

Citation

Please cite this document as:

HexZorro (@hexzorro), Mojtaba Tefagh (@mtefagh), "EIP-3416: 中位数 Gas 溢价 [DRAFT]," Ethereum Improvement Proposals, no. 3416, March 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-3416.