深入探讨以太坊网络多维Gas定价的复杂性和潜力。
在以太坊网络中,资源都是通过”Gas”这个单一资源来限制和定价的。Gas是对处理特定交易或区块所需的”计算工作量”的衡量。Gas融合了多种类型的”努力”,其中最主要的有:
1. 原始计算(如ADD,MULTIPLY)
2. 读写以太坊存储(如SSTORE,SLOAD,ETH转账)
3. 数据带宽
4. 生成区块
5. ZK-SNARK证明的成本
例如,下面这笔交易总共花费了47085 Gas。其中包括:
1. 21000 Gas的”基本费用”
2. 1556 Gas用于作为交易一部分的calldata字节
3. 16500 Gas用于读写存储
4. 2149 Gas用于制作日志
剩下的Gas用于执行EVM。用户必须支付的交易费与交易消耗的Gas成正比。一个区块最多可包含3000万Gas,Gas价格通过EIP-1559目标机制不断调整,以确保区块平均包含1500万Gas。
这种方法的主要优点是,由于所有交易都合并到一个虚拟资源中,市场设计非常简单。优化交易以最小化成本很容易,优化区块以收取尽可能高的费用也相对容易(不包括MEV),而且没有奇怪的激励机制鼓励某些交易与其他交易捆绑以节省费用。
但是,这种方法也存在一个主要的低效率问题:它将不同的资源视为可以相互转换,而网络所能处理的实际基本限制却并非如此。理解这个问题的一种方法是看下图:
如果n资源有明显的安全限制,那么一维Gas可能会使吞吐量降低高达n倍。因此,人们对多维Gas概念的兴趣由来已久,通过EIP-4844,我们今天实际上已经可以在以太坊上使用多维Gas了。本文探讨了这种方法的好处,以及进一步提高这种方法的前景。
Blobs: 坎昆升级后的多维Gas
今年年初,平均区块大小为150kB。其中很大一部分是卷积数据:为了安全起见,在链上存储数据的L2协议。这些数据的成本很高:尽管卷积上的交易成本比以太坊L1上的相应交易成本低5-10倍,但对于许多用例来说,即使是这样的成本也太高了。
这个问题最终是通过在每个区块中引入一个单独的便于卷积的数据空间(称为”Blobs”)来解决的。在坎昆升级后,一个以太坊区块最多可包含(i)3000万Gas和(ii)6个Blobs,每个Blobs可包含约125kB的calldata。这两种资源都有独立的价格,由类似EIP-1559的独立定价机制调整,目标是每个区块平均使用1500万Gas和3个Blobs。
因此,卷积的成本降低了100倍,卷积的交易量增加了3倍多,而理论上的最大区块大小仅略有增加:从1.9MB增加到2.6MB。
滚动交易费用,由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可扩展性的重大收益?如果是,那么哪种具体的提案更适合协议经济和应用开发人员?很有可能,最佳方案既不是之前提到的那些,也不是上面提到的那些,我们仍有余地提出更为优雅、更为有效的解决方案。