投资币 · 2024-11-24 13:47
在以太坊中,资源直到最近还是有限的,并通过一种称为「Gas」的单一资源来定价。Gas 是衡量处理特定交易或区块所需「计算量」(computational effort)的度量单位。Gas 将多种类型的「计算量」融合在一起,其中最重要的包括:
1、原始计算(Raw computation,例如 ADD、MULTIPLY);
2、读写和写入以太坊存储(例如 SSTORE、SLOAD、ETH 转账);
3、数据带宽;
4、生成区块的 ZK-SNARK 证明的成本。
例如,我发送的这笔交易总共消耗了 47,085 Gas。其中包括:(i)基本成本为 21000 Gas,(ii)作为交易一部分包含的 calldata 字节消耗了 1556 Gas,(iii)读写存储消耗了 16500 Gas,(iv)生成日志(log)消耗了 2149 Gas,其余用于 EVM 执行。用户必须支付的交易费用与交易消耗的 Gas 成正比。一个区块最多可以包含 3000 万 Gas,并且 Gas 价格通过 EIP-1559 targeting 机制不断调整,确保每个区块平均包含 1500 万 Gas。
这种方法有一个主要的优势:因为所有内容都合并为一个虚拟资源,所以市场设计非常简单。优化交易以最小化成本很容易,优化区块以收取尽可能高的费用相对容易(不包括 MEV),并且没有奇怪的激励机制鼓励一些交易与其他交易捆绑以节省费用。
然而,这种方法也存在低效性:它将不同的资源视为可以相互转换,而实际的底层限制并不一样。要理解这个问题,你可以先看下面这张图表:
Gas 限制强加了一个约束条件:
实际的底层安全约束通常更接近:
这种差异导致 Gas 限制要么无端地排除了实际安全的区块,要么接受了实际上不安全的区块,或者两者兼而有之。
如果有 n 种资源具有不同的安全限制,那么一维 Gas 可能会使吞吐量最多降低 n 倍。因此,长期以来,人们一直对多维 Gas 的概念感兴趣,而通过 EIP-4844,我们现在实际上已经在以太坊上实现了多维 Gas。本文探讨了这种方法的优点,以及进一步进行增强的前景。
Blob:Dencun 中的多维 Gas
今年年初,平均区块大小为 150 kB。其中很大一部分是 Rollup 数据:Layer2 协议在链上存储数据。这些数据非常昂贵:尽管 Rollup 上的交易成本仅为以太坊 L1 上相应交易的 5-10 倍,但即使这样的成本对于许多用例来说也太高了。
那为什么不降低 calldata 的 Gas 成本(目前非零字节为 16 Gas,零字节为 4 Gas),以使 Rollup 更便宜呢?我们之前这样做过,现在也可以再次这样做。但这里的答案是:区块的最大大小是 30,000,000/16=1,875,000 非零字节,而网络勉强能或者几乎不能处理这样大小的区块了。再将成本降低 4 倍会使最大值提高到 7.5 MB,这将给安全性带来巨大风险。
这个问题最终通过在每个区块中引入一个独立的、对 Rollup 友好的数据空间(称 blob)来解决。
这两种资源有不同的价格和限制:在 Dencun 硬分叉之后,一个以太坊区块最多可以包含(i)3000 万 Gas 和(ii)6 个 blob,每个 blob 可以包含约 125 kB 的 calldata。这两种资源都有单独的价格,并通过单独的类似于 EIP-1559 的定价机制进行调整,目标是每区块平均使用 1500 万 Gas 和 3 个 blob。
结果是,Rollup 的成本降低了 100 倍,Rollup 上的交易量增加了 3 倍以上,而理论上的最大区块大小仅略有增加:从约 1.9 MB 增加到约 2.6 MB。
注:Rollup 交易费用,由 Growthepie.xyz 提供。Dencun 分叉发生于 2024 年 3 月 13 日,引入了多维定价 blob。
多维 Gas 和无状态客户端
在不久的将来,无状态客户端(stateless clients)的存储证明也会出现类似的问题。无状态客户端是一种新型客户端,将能够验证链而无需在本地存储大量或任何数据。无状态客户端通过接受该区块中交易需要访问的以太坊状态的特定部分的证明来实现这一点。
一次存储读取需要花费 2100-2600 Gas,具体取决于读取类型,而存储写入成本更高。平均而言,一个区块会执行大约 1000 次存储读写操作(包括 ETH 余额检查、 SSTORE 和 SLOAD 调用、合约代码读取和其他操作)。然而,理论上的最大值是 30,000,000/2,100=14,285 次读取。无状态客户端的带宽负载与该数字成正比。
目前的计划是通过将以太坊的 State tree 设计从 Merkle Patricia trees 转变为 Verkle trees 来支持无状态客户端。然而,Verkle trees 不具备抗量子性,并且对于较新的 STARK 证明系统来说并不是最优选择。因此,许多人有兴趣通过二进制 Merkle trees 和 STARKs 来支持无状态客户端,要么完全跳过 Verkle,要么在 Verkle 过渡几年后,一旦 STARK 变得更加成熟,就进行升级。
基于二进制哈希树分支的 STARK 证明具有许多优点,但其关键弱点在于生成证明的时间很长:Verkle 树可以每秒证明十万个以上的值,基于哈希的 STARKs 通常只能每秒证明几千个哈希,而证明每个值都需要包含许多哈希的「分支」(branch)。
考虑到今天从 Binius 和 Plonky3 等超优化证明系统以及 Vision-Mark-32 等专用哈希中预测的数字,我们似乎将在一段时间内处于一个实用范围内,即每秒证明 1000 个值是可行的,但证明 14,285 个值则不可行。平均区块会没问题,但潜在最坏情况下的区块(由攻击者发布)会破坏网络。
我们处理此类情况的 default 方法是重新定价:提高存储读取的成本,以减少每个区块的最大值到更安全的水平。但是,我们已经这样做了很多次,如果再次这样做,会使太多应用变得太昂贵。一个更好的方法是多维 Gas:分别对存储访问进行限制和收费,将平均使用量保持在每个区块 1,000 次存储访问,但设置每个区块的上限进行设置,例如 2000 次。
另一个值得考虑的资源是状态大小的增长:即增加以太坊状态大小的操作,这些操作之后需要全节点来保存。状态大小增长的独特之处在于,限制它的理由完全来自于长期持续的使用,而不是峰值。
因此,为增加状态大小的操作(例如,zero-to-nonzero SSTORE、合约创建)添加一个单独的 Gas 维度可能是有价值的,但目标不同:我们可以设定一个浮动价格来针对特定的平均使用量,但完全不设置每个区块的限制。
这展示了多维 Gas 的一个强大属性:它让我们能够分别针对每个资源,询问(i)理想平均使用量是多少?(ii)每个区块的安全最大使用量是多少?与基于每个区块的最大值来设定 Gas 价格,并让平均使用量跟随其后不同,我们有 2n 自由度来设定 2n 参数,根据对网络安全的考虑来调整每一个参数。
更复杂的情况,例如当两种资源的安全性考虑部分相加时,可以通过使一个操作码或资源消耗多种类型的 Gas 的某种数量来处理(例如,一个 zero-to-nonzero SSTORE 可能消耗 5000 个无状态客户端证明 Gas 和 20000 个存储扩展 Gas)。
每笔交易 Max(选取数据或计算消耗更大的那种)
令
相关文章
Relevent