以太坊虚拟机(EVM) 中的许多资源都具有以下属性:它们对突增容量(即我们可以为一个或几个区块能够处理的容量多少)和持续容量(即我们可以长时间拥有的容量多少)有非常不同的限制。举一些例子:

EVM使用量:区块处理时间偶尔在 2 秒可能没问题,但是每个区块都花费这么长时间则会使保持节点同步变得非常困难。

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

见证数据:与数据相同的问题 – 客户端有足够的带宽来处理中大型见证,但没有足够的磁盘空间来存储它们

填充的状态大小:基本上没有限制让状态在单个区块中增加多少(如果状态在一个块中从 45 GB 激增到 46 GB,但之后的状态增长恢复正常,谁会注意到?)只要见证人可以处理它,但我们不能在每个区块中都出现快速的状态增长

我们当前使用的方案是将所有资源组合成一个单一的多维资源(“gas”),在处理这些差异方面做得很差。 例如,平均而言,交易数据加上调用数据会消耗区块中约 3% 的gas。 因此,最坏情况区块包含的数据比平均情况多约 67 倍(包括来自 EIP 1559 的 2 倍松弛(slack))数据。 见证(witness)的大小是相似的:平均情况下的见证只有几百 kB,但最坏的情况下,即使进行了 Verkle gas 改革,见证的大小也有几兆字节,增加了 10-20 倍。

将所有资源硬塞到单个虚拟资源(gas)中会迫使最坏情况/平均情况比率变成基于使用情况,当基于使用情况的比率以及我们知道客户端可以处理的突发限制和持续限制的比率非常不一致时,会导致非常不理想的 gas 成本。

本文为这个问题提出了一个替代解决方案:多维 EIP 1559。

假设有 n 个资源,每个资源都有一个突增限制 bi 和一个持续目标 Si(我们需要 bi>>si)。 我们希望任何单个区块中的资源 i 的数量永远不会超过 bi,并且资源 i 的长期平均消耗等于 Si。

解决方案很简单:我们为每个资源维护一个单独的 EIP 1559 目标(targeting)方案! 我们维护一个基本费用(basefees)向量 f1…fn,其中 fi 是一个单位资源 i 的基本费用(basefee)。 我们设计一个硬性规则,即每个块消耗的资源 i 不能超过 bi 单位。 fi 由一个targeting规则调整(我们将使用指数调整,因为我们现在知道它具有更好的属性):

Vitalik提出多维EIP1559方案,优化gas模型并增加DoS保护插图

为了在以太坊环境中完成这项工作,其中只有一种资源(gas)从父调用传递到子调用,我们仍然以 gas 收取所有费用。

选项 1(更简单但不那么纯粹):我们保持执行 gas 成本固定,保持当前的 EIP 1559; 让 f1 成为基本费用(basefee)。 所有“特殊”资源(调用数据、存储使用……)的 gas 价格变为 fi/f1。 区块既有当前的 gas 限制,也有每个资源的限制 b1…bn。 优先费用的运作方式与今天相同。

选项 2(更难但更纯粹):gas basefee 固定为 1 wei(或者,如果我们想要,可以为1 gwei)。 使用每种资源(其中执行一次)的 gas 价格变为 fi。 没有区块gas限制; 每个资源只有 b1…bn 的限制。 在这个模型中,“gas”和“ETH”成为真正的同义词。 优先费用通过指定百分比来运作; 支付给区块生产者的优先费用等于basefee乘以该百分比(一种更高级的方法是指定 n 个优先费用的向量,每个资源一个)。

多维定价与背包问题(knapsack problem)异议

历史上对多维定价模型的主要反对观点是,它们对区块构建者强加了一个困难的优化问题:区块构建者不能简单地按照每gas费用从高到低接受交易,他们必须不同维度之间平衡,并解决多维背包问题。这将为性能明显优于库存(stock)算法的专有优化矿工创造空间,从而导致中心化。

这个问题在两个关键方面已经比以前弱得多:

矿工可提取价值 (MEV) 已经为经过优化的矿工创造了机会,因此stock算法的“船已经出港”以有意义的方式被优化。提议者/建造者分离 (PBS) 解决了这个问题,将区块生产的规模经济从共识层隔离开来。

EIP 1559 意味着任何达到限制的资源都属于边缘情况而不是平均情况,因此朴素的算法只会在少数异常区块中表现不佳。

要了解为什么 (2) 是这种情况,我们需要注意一个非常重要的事实:在多维 EIP 1559 中,每个资源的“松弛(Slack)”参数(maximumtarget)可能远高于 2x。 这是因为今天的 2x Slack参数创建了一个突增/持续差距,该差距叠加在来自不可预测使用的爆发/持续差距之上,而在多维 EIP 1559 中,松弛参数代表整个突发/持续差距。 例如,我们可以将 calldata 使用量瞄准为 ~256 kB(比今天多 8 倍),在此之上有一个 8 倍的Slack参数(bisi),并且仍然具有与今天相当的突增限制。 如果见证 gas 成本不变,我们可以将见证大小绑定为又一约 2 MB,并且见证大小的Slack参数为约 6 倍。 对 240 个最新区块的调查表明,即使在 4 倍的 calldata Slack参数下,这些区块中只有 1 个会达到限制!

这显示了多维 EIP 1559 的一个很好的效果:它会使优先费用拍卖的边缘情况更加罕见,并且更快地清除突增交易。

哪些资源可以多维定价?

我们可以从基础开始:

EVM 执行

发送calldata

见证数据

存储大小增长

有了分片之后,也可以将分片数据添加到此列表中。 这已经给我们带来了很多好处,能够支持更多的可扩展性,同时降低突增使用带来的风险。

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

通过读取与写入拆分见证

按分支与块分割见证

单独定价每个单独的预编译

调用

每个单独的操作码

这样做的主要价值在于它会增加另一层 DoS 保护:如果每个操作码仅被分配,例如100 毫秒的最大预期执行时间,那么如果攻击者发现一个操作码或预编译的速度降低了 10 倍,他们只能将 900 毫秒的预期执行时间添加到块中。 这与今天形成鲜明对比的是,他们可以使用该操作码或预编译填充整个区块,因此任何单个操作码或预编译减速10 倍都可能使攻击者创建无法在单个间隔及时处理的区块。