最近以太坊社区研究员针对区块大小和 gas 上限的讨论和分析多了起来,原因大致是在最近一次 EF reddit AMA 中,Vitalik Buterin 提及将 Gas 上限增加 33% 至 4000 万的想法。
可是我们准备好增加区块大小了吗?从经济学的角度分析,实则以太坊区块大小受多个要素影响,而每一要素的变动会导致区块大小增加多少?
本文先是解释了区块大小的定义 (我们通常所说的 gas limit 和基于 byte 去计量的 block size 是不相同却密切相关的);然后在一定的假设下,给出了最坏的情况下区块大小的计算方式 (指的是一个区块能大到什么程度);而基于这个计算方式,给出了不同变量对区块大小的影响的数据分析:gas 上限、calldata 定价、新增 blob 交易对区块大小的影响。
区块大小和网络安全以及去中心化程度息息相关,增加区块大小的影响不是单一的,在对变量和权衡的多方分析下,才能做出更好的决策。
文章 |Toni Wahrstätter
翻译 | Franci
最近关于提高以太坊区块 Gas 上限的讨论非常多。有些人基于摩尔定律主张增大区块大小,有些人基于个人直觉,有些人则只是在随意散布消息,还有些人担心其他链如 Solana 会在用户广泛采用方面超越以太坊。
接下来,我想展示一些图表和数据,这可能有助于我们做出一个在不影响以太坊去中心化的前提下最大化 Gas 上限的决策。
从最初讲起与比特币不同,以太坊没有固定的区块大小限制,而是依赖于一种灵活的区块大小机制,这种机制由某种单位 "gas" 来衡量。在以太坊中,Gas 是一个衡量执行操作(如交易或智能合约)所需计算量的单位。以太坊中的每项操作都需要一定数量的 Gas 来完成,每个区块都有一个 Gas 上限,这决定了一个区块可以包含多少操作。
最开始,2015 年时以太坊每个区块有 5000 Gas 的上限制。这个上限很快被提高到约 300 万,然后在 2016年稍后提高到约 470 万。随着 Tangerine Whistle 硬分叉 (EIP-150) 在 2016年的实施,作为对 DoS 攻击的回应,通过重新定价各种 IO 密集型操作码,Gas 上限被提高到 550 万。在这些攻击之后,矿工持续提高 Gas 上限,在 2017 年 7 月到约 670 万,2017 年 12 月到约 800 万,2019 年 9 月到约 1000 万,2020 年 8 月到 1250 万,最终在 2021 年 4 月 3 日到约 1500 万。
随时间变化的 Gas 使用情况此后,随着 Spurious Dragon、Byzantium、Constantinople、Istanbul 和 Berlin 硬分叉的激活,某些操作码的定价进一步得到了细化。这些细化的例子包括 EIP-145、EIP-160、EIP-1052、EIP-1108、EIP-1884、EIP-2028、EIP-2200、EIP-2565 和 EIP-2929。
以太坊费用市场最重大的变化发生在 2021 年 8 月的伦敦硬分叉 (EIP-1559) 的引入。EIP-1559 引入了 base fee,该费用会根据对区块空间的需求随时间/区块高度动态调整。同时引入了 "target size",将其设定为每个区块 1500 万 Gas。这个 target 用于指导 base fee 的动态调整。如果一个区块中使用的总 Gas 数量超过这个 target,那么下一个区块的 base fee 就会增加。相反,如果使用的总 Gas 数量低于 target,则 base fee 减少。这个机制旨在创建一个更可预测的费用市场,并通过稳定交易开销改善用户体验。此外,EIP-1559 还引入了 base fee 的销毁机制,永久地从流通量中移除了那部分 Ether。这增强了协议的可持续性,同时创造了所谓的超稳健货币迷因 (ultra sound money meme)。
在 EIP-1559 下,还设有一个最大(或“硬上限”)Gas 上限,设为 target 的两倍,即 3000 万 Gas。这意味着一个区块可以打包总使用量高达 3000 万 Gas 的交易。
伦敦分叉后的 Gas 使用情况自那时起,以太坊的区块 Gas 上限保持不变,截至 2024 年,仍然是每个区块 3000 万 Gas。
我们准备好增加区块大小了吗?最近,一些人对以太坊的 Gas 上限表示担忧,并要求将其增加。在 Reddit 上的最新以太坊基金会 AMA 中,Vitalik 表示考虑了将 Gas 上限增加 33% 至 4000 万的想法。他的推理基于摩尔定律,该定律指出微芯片上的晶体管数量大约每两年翻一番,从而使得计算能力相应增加。这一原则表明,网络性能,包括处理和执行交易的能力,也可以随时间增加。
来自以太坊基金会的研究人员 Dankrad 和 Ansgar 也支持在评估 Dencun 升级后的情况后增加 Gas 上限的想法。此外,以太坊基金会的 Pari 发表了一篇帖子,探索潜在的 Gas 上限增加途径。像 Geth 的 Peter 和 Marius 这样的其他人则对增加 Gas 上限表示担忧,特别是在没有适当的工具/监控到位的情况下。这些担忧主要和这些问题相关:加速状态增长、同步时间和重组块率。
区块大小是什么?区块的大小可以通过两种方式衡量:
Gas 使用量区块大小(以字节为单位)虽然这两种衡量方式相关联,但必须独立考虑。
例如,一个包含许多非零 calldata 字节的区块在字节大小上可能很大,而实际的 Gas 使用量 (每非零字节需要 16 Gas) 可能仍然相对较小。
先不考虑压缩后的情况,在遵守Geth 每笔交易 128 KB 限制的前提下,当前可以达到的最大区块大小约为 6.88 MB。这样一个的区块里将最大化打包 128 KB 交易的数量。实际计算出来的结果是,包含约 130,900 字节的零字节 calldata(每字节 4 Gas)的 55 笔交易,以及一个填满剩余空间的交易。然而,经过 snappy 压缩后,这样的区块最终大小约为 0.32 MB,这可以忽略不计。
而另一种情况,考虑最大可能性的区块大小,包含 15 笔携带非零字节 calldata 的交易,压缩后大小可达约 1.77 MB。
因此,截至今日,1.77 MB 代表执行层区块的真实区块大小上限。
译者注:
在上面的几个段落中,作者在固定 gas 上限 30 M 的情况下,想要让 block size 最大,尝试计算最多可以把区块塞到多大。
如果固定 gas 上限,要让 block size 变大,那么只能塞 calldata(因为计算/STORE之类的字节码其实是不会消耗区块存储空间的)。
所以,要让区块变大,无非就是尽量往交易塞 calldata。然后,有“塞 0 calldata” 和 “塞非 0 calldata” 两种方法,需要计算才能知道哪种能让 block size 更大。最终结果是“塞非 0 calldata” 的 block size 更大。
基于 Geth 客户端限制每笔交易最多 128 KB 这一前提,下面开始计算两个例子。
case 1:56 个大小为 130,900 B (< 128 KB) 的交易(里面都是零 calldata,4 gas/B):用的 gas = 56* (130,900 * 4+21000) = 30497600 > (30 M),所以最多只能塞 55 个上述交易+ 1 个小于上述交易的交易。对应的区块大小约为 55*128 = 7040 kB = 6.875 MB。然而,由于 calldata 全是 0,所以压缩后区块大小约为 0.32 MB。
case 2:15 个大小为 130,900 B (< 128 KB) 的交易(里面都是非零 calldata,16 gas/B):用的 gas = 15 *(130900 *16+21000) = 31731000 > 30 M。对应的区块大小约为 14 *128 = 1792 kB = 1.75 MB ~ 15 * 128 = 1.875 M。然而,由于 calldata 是非零,不好压缩,所以压缩后区块大小约为 1.77 MB。)
就这个最大区块大小而言,我们可以识别出几个影响它的因素:
Gas 上限:Gas 上限会影响最大区块大小,这是毋庸置疑的。上限越高,区块中可以塞进的数据就越多。操作和数据的定价:操作的 gas 越便宜,区块内就能执行越多次操作。虽然像CALLDATALOAD或CALLDATACOPY这样的操作,它们的开销都是 3 Gas,相对便宜;但其他操作码如CREATE则更昂贵。区块中使用的操作码越昂贵,该区块中用于calldata(或其他操作)的空间就越少。客户端限制:虽然客户端限制的影响不那么明显,但比如像 Geth 客户端这样对每笔交易的 128 kb 限制也可以影响最终区块大小。由于每笔交易的固定费用是 21k Gas,客户端每笔交易的大小限制越低,就需要更频繁地支付固定费用,从而“浪费”本可以用于calldata的 gas。所以最终,这个限制可以导致最大区块大小减少约 0.07 MB。需要注意的是,客户端限制只影响交易的广播,并不影响已经被确认的区块。首先,让我们看看每个区块的 Gas 上限:
区块 Gas 上限对最大区块大小的影响像以太坊这样的区块链,提高区块 Gas 上限是最直接和明显的扩容方式。更高的上限意味着更多的数据空间。然而,这也意味着需要每个运行全节点的人传播和下载更大的区块。如上图所示,“最坏情况(即前面通过计算得出的最大区块大小)”下的区块大小与区块 Gas 上限的增加大致呈线性关系。通过创建塞满尽可能多的非零字节 calldata 交易的区块,就可以达到这样的最大区块大小。
接下来,让我们看看另一个影响因素 —— 以太坊的定价机制。在当前的例子中,具体就是目前被设定为 16 Gas 的非零字节calldata的开销:
每非零字节 Calldata 开销对最大区块大小的影响如上图所示,增加非零calldata的开销会让区块大小减小。换句话说,将开销降低到比如说每字节 8 Gas,会使最坏情况下的区块大小翻倍。这很直观,因为降低价格允许将双倍数量的数据放入区块中。
那么EIP-4844 (Proto-Danksharding)上线后呢?我不会在这里详细介绍 4844,因为 eip4844.com 上有很好的文档,但简单来说,EIP-4844 引入了类似“sidecar (挎斗)”结构的数据类型,叫做 blob,每个 blob 可塞进约 125 kb 的数据。Blob 数据费用机制与 EIP-1559 类似,也存在一个“target”,用于锚定 blob 数量。在 Dencun 硬分叉中,target 设为每个区块 3 个 blob,最大限制设为每个区块 6 个 blob。值得注意的是,blob 拥有自己的费用市场,创建了所谓的多维费用市场。这意味着 blob 不必与标准交易竞争,而是与 EIP-1559 机制下的费用解耦。
到目前为止,一切顺利。让我们看看这次升级如何影响以太坊的平均区块大小。
新增 blob 之后对压缩后的信标链平均区块大小的影响截至今日,采用 snappy 压缩后的信标链区块的平均区块大小约为 125 KB。有了 4844,我们每个区块再增加 375 KB,从而使当前平均区块大小增加 4 倍。如果达到最大数量的 blob,我们实质上将当前区块大小增加了七倍。
最坏情况下的区块大小从约 1.77 MB 增加到约 2.5 MB。这个估算没有将区块的 CL (共识层) 部分考虑在内。但不管怎样,在遭受 DoS 攻击的情况下,我们必须做好应对这种最大区块大小的准备。
总结最终,如果要提高当前的区块 Gas 上限,我们需要在实施前进行彻底的研究和分析。虽然像 Coinbase、Binance、Kraken 或 Lido 节点运营商这样的成熟的实体能够应对超过 4000 万的区块 Gas 上限的情况,但独立质押者可能会比较困难。
因此,这样的决策必须经过深思熟虑,以确保我们不会牺牲去中心化。
最后,构建一个像 Facebook 那样容量大、性能强的东西相对容易,但重要的是不能失去我们大多数人所追求的东西:去中心化。
可以在这里找到上述所做的估算和图表的代码。
Related Links
模块化结构下 EIP-4844 的设计逻辑
https://www.ethereum.cn/Eth2/4844-design
EIP-4488: Transaction calldata gas cost reduction with total calldata limit
https://eips.ethereum.org/EIPS/eip-4488
Vitalik 对本文的评论
https://twitter.com/VitalikButerin/status/1750183998523871561
EIP-150 in 2016,Gas cost changes for IO-heavy operations
https://github.com/ethereum/EIPs/blob/6572e92dccb2a581c0082befb953050f75d0ece5/EIPS/eip-150.md
EIP-1559: Fee market change for ETH 1.0 chain
https://eips.ethereum.org/EIPS/eip-1559
ultra sound money meme
https://ultrasound.money/
Ethereum Foundation 11th AMA
https://www.reddit.com/r/ethereum/comments/191kke6/ama_we_are_ef_research_pt_11_10_january_2024/?rdt=48041
Testing path for a gas limit increase
https://ethresear.ch/t/testing-path-for-a-gas-limit-increase/18399/1
EIP-4844: SHARD BLOB TRANSACTIONS, Proto-Danksharding
https://www.eip4844.com/
多维度 EIP-1559
https://www.ethereum.cn/Eth1.x/multidimensional-eip-1559
本文图表分析的代码,eth-gas-limit-analysis
https://github.com/nerolation/eth-gas-limit-analysis