Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-4396: 时间感知的基础费用计算

在基础费用计算中考虑块时间,以按时间而不是按块为目标实现稳定的吞吐量。

Authors Ansgar Dietrichs (@adietrichs)
Created 2021-10-28
Discussion Link https://ethereum-magicians.org/t/eip-4396-time-aware-base-fee-calculation/7363

摘要

此 EIP 提议在基础费用计算中考虑块之间的时间,以按时间而不是按块为目标实现稳定的吞吐量。旨在最大限度地减少对计算的更改,它仅引入与块时间成比例的可变块 gas 目标。原则上,EIP 可以应用于工作量证明或权益证明链,但工作量证明案例的安全性影响仍未探索。

动机

当前的基础费用计算选择一个块的 gas 使用量作为信号,以确定对块空间的需求是太低(表明应该降低基础费用)还是太高(表明应该提高基础费用)。虽然很简单,但这种信号选择也有缺点:它没有考虑到块时间。假设需求相对恒定,在 20 秒后构建块的提议者将拥有 gas 是在 10 秒后构建块的提议者的两倍的交易。因此,对两者使用相同的 gas 目标是次优的。实际上,这种有缺陷的信号有几个不良后果:

工作量证明下的基础费用波动

在工作量证明 (PoW) 下,块时间是随机的,因此存在很大的块时间可变性。这种可变性会导致基础费用波动,即使在完全稳定的需求下,基础费用也可以预期在均衡值附近波动。

错过插槽

在权益证明 (PoS) 下,块时间理想情况下是统一的(始终为 12 秒),但错过插槽会导致单个块的块时间增加(24 秒、36 秒等)。此类错过插槽将导致下一个块过度填充,并且使用当前的更新规则,发出虚假的需求峰值,从而导致小的无根据的基础费用峰值。

更重要的是,这些错过插槽直接将执行链的整体吞吐量减少了一个块的 gas 目标。虽然可以预期下一个块将包括错过插槽的“延迟”交易,但由此产生的基础费用峰值会导致一些未满的块。最终,错过插槽的块空间对链来说就丢失了。

这尤其成问题,因为对块提议者的拒绝服务 (DoS) 攻击可能导致他们错过插槽,并损害整体链性能。

共识问题期间的吞吐量下降

更严重的单个错过插槽版本可能是由共识问题引起的,这些问题阻止了很大一部分块提议者继续创建块。这可能是由于块提议者分叉(并在他们自己的分叉上创建块)、由于其他原因无法跟上当前的链头,或者仅仅是无法创建有效的块。

在所有这些情况下,平均块时间都会显着增加,导致链吞吐量下降相同的比例。虽然这种效应在 PoW 下已经存在,但难度调整的自我修复机制相对较快地启动并恢复正常的块时间。另一方面,在 PoS 下,自动自我修复机制可能非常缓慢:可能需要几个月才能恢复正常,最多错过三分之一的插槽,或者如果错过超过三分之一的插槽,则需要几周。

由于所有这些原因,最好以时间而不是块为目标实现稳定的吞吐量,方法是在基础费用计算期间考虑块时间。

为了最大限度地提高此 EIP 包含在合并分叉中的机会,调整保持在最低限度,更详细的更改将在基本原理部分讨论。

规范

使用 EIP-1559 的伪代码语言,更新后的基础费用计算变为:

...

BASE_FEE_MAX_CHANGE_DENOMINATOR = 8
BLOCK_TIME_TARGET = 12
MAX_GAS_TARGET_PERCENT = 95

class World(ABC):
    def validate_block(self, block: Block) -> None:
        parent_gas_limit = self.parent(block).gas_limit
        parent_block_time = self.parent(block).timestamp - self.parent(self.parent(block)).timestamp
        parent_base_gas_target = parent_gas_limit // ELASTICITY_MULTIPLIER
        parent_adjusted_gas_target = min(parent_base_gas_target * parent_block_time // BLOCK_TIME_TARGET, parent_gas_limit * MAX_GAS_TARGET_PERCENT // 100)
        parent_base_fee_per_gas = self.parent(block).base_fee_per_gas
        parent_gas_used = self.parent(block).gas_used

        ...

        if parent_gas_used == parent_adjusted_gas_target:
            expected_base_fee_per_gas = parent_base_fee_per_gas
        elif parent_gas_used > parent_adjusted_gas_target:
            gas_used_delta = parent_gas_used - parent_adjusted_gas_target
            base_fee_per_gas_delta = max(parent_base_fee_per_gas * gas_used_delta // parent_base_gas_target // BASE_FEE_MAX_CHANGE_DENOMINATOR, 1)
            expected_base_fee_per_gas = parent_base_fee_per_gas + base_fee_per_gas_delta
        else:
            gas_used_delta = parent_adjusted_gas_target - parent_gas_used
            base_fee_per_gas_delta = parent_base_fee_per_gas * gas_used_delta // parent_base_gas_target // BASE_FEE_MAX_CHANGE_DENOMINATOR
            expected_base_fee_per_gas = parent_base_fee_per_gas - base_fee_per_gas_delta
        
        ...

    ...

原理

机制

拟议的新基础费用计算仅通过按块时间缩放来调整块 gas 目标,上限为总块 gas 限制的最大百分比:

当前的基础费用计算

拟议的基础费用计算

因此,这种新的计算以每次时间而不是每次块为目标实现稳定的吞吐量。

局限性

在 PoS 下,块时间增加总是以完整块的倍数出现(例如,单个错过插槽 = 24 秒而不是 12 秒的块时间)。即使对于单个错过插槽,考虑到这一点也需要将块 gas 目标加倍。但是,由于块弹性当前设置为 2,因此该目标将等于块 gas 限制。使新目标等于块 gas 限制不太理想,因此根据 MAX_GAS_TARGET_PERCENT 参数略微降低。此参数存在的原因有两个:

  • 确保信号保持有意义:永远无法达到等于或大于 gas 限制的目标,因此在错过插槽后,基础费用将始终降低。
  • 确保基础费用仍能对真正的需求增加做出反应:在许多离线块提议者(因此许多错过插槽)期间,真正的需求增加仍然需要一种最终导致基础费用增加的方法,以避免回落到第一次价格优先费拍卖。

但是,这意味着即使是单个错过插槽也无法完全补偿。更糟糕的是,任何第二个或更多连续错过的插槽都无法得到任何补偿,因为 gas 目标已达到最大值。随着离线验证者的份额增加,这种影响变得更加明显:

可以观察到,虽然此 EIP 确实提高了离线验证者情况下网络吞吐量的稳健性,但这样做并不完美。此外,MAX_GAS_TARGET_PERCENT 参数会产生一种权衡,较高的值会导致较高的网络稳健性,但在频繁错过插槽期间,基础费用调整机制会受到更多损害。

可能的扩展

这些限制直接源于最小化变更的设计目标,以最大限度地提高包含在合并中的机会。存在扩展 EIP 设计以更有效地处理离线验证者的自然方法,但代价是进行稍微更广泛的更改:

持久多插槽缓冲区

为了能够补偿多个连续错过的插槽,可以引入一个 gas 缓冲区,该缓冲区允许将超出块弹性的 gas 结转到未来的块。为了避免长期缓冲区累积而延迟一旦块提议者恢复上线后的正常运行,将添加缓冲区的上限。即使对于相对较小的缓冲区上限,吞吐量稳健性也得到显着提高:

在弹性仍然为 2 的情况下,无法避免超过 50% 的离线块提议者的最终崩溃。

这种方法的主要实现复杂性来自将缓冲区作为新的持久字段引入。为了保留仅基于标头计算基础费用的能力,必须将其添加到块标头中。

增加块弹性

除了引入缓冲区之外,增加块弹性是另一种提高吞吐量稳健性的工具。以下图表显示了不同弹性级别的影响,无论是否存在持久缓冲区:

同样,可以观察到明显的积极影响。

这里的主要额外复杂性将来自多个连续超额块增加的峰值负载(网络、计算和磁盘访问)。但请注意,与 PoW 相比,PoS 及其 12 秒的最小块时间显着降低了最坏情况下的峰值压力。

向后兼容性

EIP 对向后兼容性的影响最小,只需要更新现有的基础费用计算工具。

测试用例

待定

参考实现

待定

安全考虑

时间戳操作

在 PoW 下,矿工可以控制其块的时间戳字段。虽然对有效时间戳有一些强制限制,但关于潜在时间戳操作的影响是非显而易见的,并且对于此 EIP 仍未探索。

在 PoS 下,每个插槽都有一个固定的分配时间戳,从而使块提议者无法进行任何时间戳操作。

抑制基础费用增加

正如在原理中所讨论的,在许多离线块提议者期间,MAX_GAS_TARGET_PERCENT 的高值会导致真正的需求增加的剩余信号空间很小,而这应该导致基础费用增加。反过来,这降低了块提议者抑制这些基础费用增加的成本,而是迫使回落到第一次价格优先费拍卖。

虽然基础 EIP-1559 案例的基础费用抑制的激励不兼容的论点仍然适用于此处,但随着这种个体非理性行为的成本降低,覆盖心理因素的风险变得更加显着。

即使在这种情况下,系统降级也将是平缓的,因为它只会暂时暂停基础费用燃烧。一旦丢失的块提议者恢复上线,系统将恢复到其普通的 EIP-1559 均衡。

版权

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

Citation

Please cite this document as:

Ansgar Dietrichs (@adietrichs), "EIP-4396: 时间感知的基础费用计算 [DRAFT]," Ethereum Improvement Proposals, no. 4396, October 2021. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4396.