多维度 EIP-1559

57 水手 发布在 Web 3.0
 6149  0
来源 | ethresear.ch
作者 | Vitalik Buterin

EVM 中的许多资源都具有这样的属性,它们的爆发容量 (我们能够在一个或几个区块中处理多少容量) 和持续容量 (我们在很长一段时间内可以接受多少容量) 有非常不同的上限。这样的例子包括:

  • EVM 的使用:区块偶尔需要 2 秒来处理可能没问题,但每个区块都用这么长时间会使保持节点同步变得非常困难。

  • 区块数据:当区块到达时,客户端有足够的带宽来处理 2 MB 的区块,但没有足够的磁盘空间来存储它们。

  • 见证数据:与数据同样的问题——客户端有足够的带宽处理中等到大型的见证数据,但没有足够的磁盘空间存储它们。

  • 状态大小填充:只要见证数据可以处理,让状态在一个区块里增长基本上是没有限制的 (如果在一个区块里,状态从 45 GB 激增到 46 GB,但进一步的状态增长又回到正常状态,谁会去注意呢?) ,但我们不能在每个区块都有快速的状态增长。

我们现有的方案是把所有资源都合在一个单一的多维资源 (“gas”) 里,在处理这些差异方面做得很差。例如,平均来说,交易数据和 calldata 平均消耗一个区块里大约 3% 的 gas。因此,最坏的情况下的区块比平均情况下的区块包含多出大约 67 倍的数据。见证数据大小的情况是类似的:平均情况下的见证数据是几百 kB,但最坏情况下,即使有了 Verkle gas 改革也会有几 MB 的大小,也就是增加 10~20 倍。

把所有资源都塞进一个单一的虚拟资源 (gas) 迫使最坏的情况/平均情况比率是基于使用情况的,当基于使用情况的比率与我们知道客户端可以处理的爆发容量和持续容量上限之间的比率出现严重不一致的时候,会导致非常不理想的 gas 开销。

本文提出一个解决这个问题的替代方案:多维度 EIP-1559

假如有 n 项资源,每项都有一个爆发容量上限 bi 和一个持续容量目标 si (我们需要 bi >> si)。我们想要资源 i 在任何一个区块里数量都永远不会超过 bi,且长期对资源 i 的平均消耗会等于 si

这个解决方案很简单:我们让每项资源都有一个独立的 EIP-1559 目标方案!我们会有一个基本费用 f1...fn,其中 fi 代表一个单位资源 i 的基本费用。我们有一个硬性规定,每个区块不能消耗超过 bi 单位的资源 i。fi 会通过一个目标规则来调节 (我们将使用指数调整,因为我们现在知道它有更好的属性):  

在以太坊上,只有一项资源 (gas) 是从父块调用传送到子块的,为了让上述方案行得通,我们仍然通过 gas 来对所有东西收费。

  • 方案 1 (更简单但不那么纯粹):我们保持执行的 gas 开销是固定的,且我们保持目前的 EIP 1559;设 f1 为基本费用。所有“特殊”资源 (calldata、存储使用...) 的 gas 价格为  。区块有当前的 gas 上限和每项资源的 b1...bn 上限。优先费用的机制与现在一样。

  • 方案 2 (更难但更纯粹):gas 的基本费用固定在 1 wei (或 1 gwei,如果我们想的话)。使用每项资源 (执行也是其中一项) 的 gas 价格变成fi。没有区块 gas 上限,只会有每项资源的 b1...bn 上限。在这个模型里,“gas” 和 "ETH"成为真正的同义词。优先费用以指定百分比的形式;支付给出块者的优先费用等于基本费用乘以该百分比 (一个更高级的方法是指定 n 个优先费用的一个向量,每项资源是一个向量)。

多维度定价和背包问题异议

在过去,对多维度定价模型的主要反对意见是,它们会对区块构建者的优化问题带来困难:区块构建者将不能简单地按照从高到低的每 gas 费用来接受交易,他们必须在不同维度间做平衡,并解决一个多维度的背包问题。这会为专有且优化的矿工创造空间,使他们的表现明显优于现有的算法,从而导致中心化。

这个问题在两个关键方面远没有以前严重:

1. 矿工可提取价值 (MEV) 已经为优化的矿工创造了机会,因此现有算法是最优的这个情况已不再。提议者/构建者分离方案 (PBS) 就是解决这个问题的,把区块生产的规模经济从共识层隔离出去。

2. EIP-1559 意味着任何资源触及上限都是临界情况而不是普通情况,因此天真算法只会在少数特殊区块里表现不佳。

要想知道为什么第 2 点是对的,我们需要注意一个非常重要的事实:在多维度 EIP-1559 的设计里,每项资源的“松弛”参数 (目标最高值) 可以远远高于 2 倍。这是因为今天这个 2 倍的松弛参数创造了一个爆发容量/持续容量之间的差距,这个差距来自不可预测的使用量,而在多维度 EIP-1559 的设计里,这个松弛参数代表整个爆发容量/持续容量之间的差距。例如,我们可以将 calldata 使用量的目标定为大约 256 kB (大约比今天多 8 倍), 在此基础上有一个 8 倍的松弛参数  ,并且仍然有与现在相当的爆发容量上限。如果见证数据的 gas 开销不变,我们可以把见证数据大小的上限设置为另外的 2 MB,且见证数据大小有一个大约 6 倍的松弛参数。一个对最近 240 个区块的调查显示,甚至在 calldata 4 倍的松弛参数下,这些区块中也只有 1 个达到上限!

这显示了多维度 EIP-1559 有一个很好的副作用:它会使得需要优先费用竞拍的临界情况变得更加罕见,且突然交易量激增的情况也更快结束。

什么资源可以进行多维度定价?

我们可以从基础的开始:

  • EVM 执行
  • 交易 calldata
  • 见证数据
  • 存储容量增长

当加上分片后,分片数据也可以被添加到这个列表中。这已经在能够支持更高量级的可扩展性上带来很大改进了,同时降低使用量爆发的风险。

从长远来看,我们甚至可以使定价更加细化:

  • 区分读和写的见证数据
  • 区分分支和分块的见证数据
  • 分别对每个单独的预编译定价
  • 调用
  • 每个单独的操作码

这样做的主要价值在于,它将增加一个 DoS 保护层:如果每个操作码只能分到例如 100 毫秒的最大预期执行时间,那么,如果攻击者发现一个操作码或预编译慢了 10 倍,他们只能增加 900 毫秒的预期执行时间到区块里。这与今天的情况不同,他们可以用该操作码或预编译来填充整个区块,所以在任何单个操作码或预编译慢下来 10 倍的情况下,攻击者也能创建区块,但这样的区块不能在一个单一 slot 里被处理。