原文:Multidimensional gas pricing
编译:Odaily星球日报 Asher
在以太坊网络中,资源都是通过 Gas 这个单一资源来限制和定价的。Gas 是对处理特定交易或区块所需的 计算工作量 的衡量。Gas 融合了多种类型的 努力,其中最主要的有:
原始计算(如 ADD, MULTIPLY )
读写以太坊存储(如 SSTORE, SLOAD, ETH transfers)
数据带宽
生成区块 ZK-SNARK 证明的成本
例如,这笔交易总共花费了 47085 Gas。这其中包括:(i) 21000 Gas 的 基本费用;(ii) 1556 Gas 用于作为交易一部分的 calldata 字节;(iii) 16500 Gas 用于读写存储;(iv) 2149 Gas 用于制作日志;其余用于执行 EVM。用户必须支付的交易费与交易消耗的 Gas 成正比。一个区块最多可包含 3000 万 Gas,Gas 价格通过 EIP-1559 目标机制不断调整,确保区块平均包含 1500 万 Gas。
这种方法有一个主要优点:由于所有交易都合并到一个虚拟资源中,因此市场设计非常简单。优化交易以最小化成本很容易,优化区块以收取尽可能高的费用也相对容易(不包括 MEV),而且没有奇怪的激励机制鼓励某些交易与其他交易捆绑以节省费用。
但这种方法也存在一个主要的低效率问题:它将不同的资源视为可以相互转换,而网络所能处理的实际基本限制却并非如此。理解这个问题的一种方法是看下图:
如果 𝑛 资源有明显的安全限制,那么一维 Gas 可能会使吞吐量降低高达 𝑛 倍。因此,人们对多维 Gas 概念的兴趣由来已久,通过 EIP-4844 ,我们今天实际上已经可以在以太坊上使用多维 Gas 了。这篇文章探讨了这种方法的好处,以及进一步提高这种方法的前景。
Blobs: 坎昆升级后的多维 Gas
今年年初,平均区块大小为 150 kB。其中很大一部分是卷积数据:为了安全起见,在链上存储数据的 L2 协议。这些数据的成本很高:尽管卷积上的交易成本比以太坊 L1 上的相应交易成本低 5-10 倍,但对于许多用例来说,即使是这样的成本也太高了。
这个问题最终是通过在每个区块中引入一个单独的便于卷积的数据空间(称为 Blobs)来解决的。
在坎昆升级后,一个以太坊区块最多可包含 (i) 3000 万 Gas 和 (ii) 6 个 Blobs,每个 Blobs 可包含约 125 kB 的 calldata。这两种资源都有独立的价格,由类似 EIP-1559 的独立定价机制调整,目标是每个区块平均使用 1 500 万 Gas 和 3 个 Blobs。
因此,卷积的成本降低了 100 倍,卷积的交易量增加了 3 倍多,而理论上的最大区块大小仅略有增加:从 1.9 MB 增加到 2.6 MB。
滚动交易费用,由 growthepie.xyz 提供。Dencun 分叉发生在 2024 年 3 月 13 日,引入了多维定价的 Blobs
多维 Gas 和无状态客户端
未来,无状态客户端将面临存储证明的问题。无状态客户端是一种新型客户端,能够在本地存储很少或不存储任何数据的情况下验证区块链。它接受证明来验证区块中特定部分的以太坊状态,无需自身存储任何数据。
一个区块平均进行约 1000 次存储读写操作,但理论上的最大值可能是上千万次。现行计划是通过将以太坊的状态树设计从 Merkle Patricia 树迁移到 Verkle 树来支持无状态客户端。然而,Verkle 树并不具备量子抗性,也不适用于较新的 STARK 证明系统。
因此,许多人希望通过二进制 Merkle 树和 STARKs 支持无状态客户端,可以完全跳过 Verkle,或在 Verkle 迁移后的几年再进行升级。虽然二进制哈希树分支的 STARK 证明具有许多优点,但生成证明的速度较慢,无法满足高速的需求。
预计未来会有一段时间内能够在不到一秒的时间内证明 1000 个值的情况,但无法达到 14,285 个值的证明速度。为了解决这一问题,提出了多维 Gas 的概念。这种方法可以分别限制和收费存储访问,确保每个区块的平均存储访问量为 1000 次,同时设置每个区块的限制为 2000 次,以提高网络的安全性和效率。
多维 Gas 的更广泛应用
状态大小增长是另一个需要考虑的资源。当增加以太坊状态大小时,全节点需要持有更多数据。与其他资源不同,状态大小增长的限制主要源自长期的持续使用而非短期峰值。因此,为了处理状态大小增长的操作,可以考虑增加一个单独的 Gas 维度。这种方法的目标是设置一个浮动价格,以特定的平均使用量为目标,而不是设定每块的限制。
这展示了多维 Gas 的强大特性,可以针对每种资源提出不同的问题:(i)每种资源的理想平均使用量是多少;(ii)每块资源的安全最大使用量是多少。通过设定这些参数,可以根据网络的安全情况来调整 Gas 的价格,而不是根据每个区块的最大使用量来调整。在处理更复杂的情况时,可以使用多种 Gas,例如,一个零到非零的 SSTORE 操作可能需要消耗不同类型的 Gas,如无状态客户端证明 Gas 和存储扩展 Gas。
每笔交易最大值:获取多维 Gas 更弱但更简单的策略
在单维 Gas 系统中,交易的 Gas 成本是根据数据和计算两者消耗的 Gas 来确定的。然而,在多维 Gas 系统中可以根据交易消耗的主要资源来确定 Gas 成本。这一方法提高了吞吐量,同时保持了安全性。
EIP-7623 提出了类似的方案,通过增加每字节的最低价格,减少了交易在区块中所占空间,但这也导致了一些问题,如单个资源消耗较多的交易仍需支付高额费用,同时也创造了数据密集型和计算密集型交易捆绑在一起以节省成本的动机。虽然这种方法有其局限性,但其带来的好处也是值得的,但如果愿意投入更多开发工作,那么有更理想的解决方案。
多维 EIP-1559 :更难但更理想的策略
多维 EIP-1559 其核心是通过跟踪 excess_blobs 参数来调整 Blob 的基本费用,以确保区块的平均使用量保持在目标水平。
当区块包含的 Blob 数量超过目标值时,基本费用会增加,以降低使用量;反之,则会减少。这种定价机制使得区块内的交易价格动态调整,以保持区块填充一半的状态。同时,短期内的使用量激增也会触发限制机制,保证了交易的合理竞争。
在以太坊中,Gas 的这种定价方式已经存在多年:早在 2020 年,EIP-1559 就引入了非常类似的机制。随着 EIP-4844 的推出,现在对 Gas 和 Blob 分别采用两种浮动价格。
对于用户和区块构建者而言,体验与之前类似,但需要适应两个单独的费用。然而,对于开发者来说,需要重新设计 EVM 功能,以适应多价格和多限制的环境,这可能会增加一些挑战。
多维定价、EVM 和子调用
在 EVM 中,存在两种 Gas 限制:每个交易设置了总 Gas 限制,以及合约调用其他合约时的单独 Gas 限制。这使得合约可以调用不信任的合约,同时确保调用后仍有剩余 Gas 用于其他计算。然而,要在不同类型的执行之间实现多维 Gas 定价存在挑战。这种多维度方案需要子调用为每种 Gas 类型提供多个限制,这将对 EVM 进行深入改变,并且不兼容现有应用程序。
多维度 Gas 提议通常只停留在两个维度上:数据和执行。数据分配在 EVM 外部,因此不需要内部更改即可分别定价。对于开发者来说,这意味着需要重新设计 EVM 及其周围基础设施,以适应多个价格和多个限制。某些情况下,优化也会变得更加困难,因为无法明确说出哪种方法更有效,这可能会影响开发流程。
虽然存在一些挑战,但可以通过实现类似于 EIP-7623 的方案来解决这些问题。这种方案可以为存储操作收取额外费用,并在交易结束时进行退款,以确保主调用仍具备足够的 Gas 来执行后续操作。
小结
无论哪种情况,值得强调的是,一旦开始引入多维执行 Gas,系统的复杂度就会显著提高,这似乎是难以避免的。
因此,我们面临着一个复杂的抉择:是否愿意在 EVM 层面上接受更多的复杂性,以换取释放 L1 可扩展性的重大收益,如果是,那么哪种具体的提案更适合协议经济和应用开发人员?很有可能,最佳方案既不是之前提到的那些,也不是上面提到的那些,我们仍有余地提出更为优雅、更为有效的解决方案。