譯者導讀
最近以太坊社群研究員針對區塊大小和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。這意味著一個區塊可以打包總使用量高達3,000 萬Gas 的交易。
倫敦分叉後的Gas 使用情況
自那時起,以太坊的區塊Gas 上限保持不變,截至2024 年,仍然是每個區塊3,000 萬Gas。
我們準備好增加區塊大小了嗎?
最近,有些人對以太坊的Gas 上限表示擔憂,並要求增加。在Reddit 上的最新以太坊基金會AMA 中,Vitalik 表示考慮了將Gas 上限增加33% 至4,000 萬的想法。他的推理基於摩爾定律,該定律指出微晶片上的電晶體數量大約每兩年翻一番,從而使得運算能力相應增加。這項原則表明,網路效能,包括處理和執行交易的能力,也可以隨時間增加。
來自以太坊基金會的研究人員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 對本文的評論
I would favor an EIP to increase calldata cost, perhaps back to the original 68 per nonzero byte, now that we have EIP-4844 blobs for data-heavy use cases.
It would address the worst-case data issues and add breathing room to raise not just gas limit but also blob count target.
— vitalik.eth (@VitalikButerin) January 24, 2024
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
[AMA] We are EF Research (Pt. 11: 10 January, 2024)
byu/JBSchweitzer inethereum
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