本文作者為 Tim Beiko,是以太坊核心開發者,這篇文章是他對於接下來上海升級的解讀。由 DeFi 之道編譯、整理。
(前情提要:以太坊「信標鏈質押提款」訂於2023年3月!於上海升級硬分叉首階段)
歡迎閱讀有關 AllCoreDevs 在 2022 年的最後一次更新。
長話短說:
上海/ Capella 升級的內容已經敲定:提款,EOF,還有一些小改動……只要不耽誤提款即可 ❌
Blobspace 即將到來 : EIP-4844 將成為以太坊下一次升級的中心,其召喚儀式即將開始🕯️
開發者們正在努力協調執行客戶端和共識客戶端升級進程的技術方面。我們還看到了關於更好地將社區的意見納入流程的積極討論📣
上海 / Capella 升級
在最近一次 AllCoreDevs 電話會議上,客戶端團隊就上海 / Capella 升級的最終範圍達成了共識。雖然升級的名稱可能仍有爭議,但團隊們已經清楚了升級的範圍,這次升級的主要任務是為質押者引入信標鏈提款。
儘快解決這個問題是客戶端團隊的目標,因此升級中的其他功能需要同時準備好,或者有可能會被移除。
上海 EL 規範列出了所有包含的 EIP:
- EIP-3540:EVM 物件格式 (EOF) v1
- EIP-3651:Warm COINBASE
- EIP-3670:EOF – 代碼驗證
- EIP-3855:PUSH0 指令
- EIP-3860:限制和計量 initcode
- EIP-4200:EOF – 靜態相對 jumps
- EIP-4750:EOF – 函數
- EIP-4895:信標鏈推送提款操作
- EIP-5450: EOF -堆棧驗證
雖然列表很長,但我們可以將它們分為三個不同的部分:小改進、EVM 物件格式以及提款。讓我們來逐一分析:
小改進⚙️
EIP-3651:Warm COINBASE
該 EIP 修複了 EIP-2929 中的一個疏忽,該疏忽根據客戶端是否已將數據欄位存儲在內存中(WARM)或需要從磁盤中檢索它們(COLD)來更改訪問某些數據欄位的 gas 成本。
EIP-2929 在每個事務開始時,將客戶端內存中的兩段數據設置為 WARM:發送地址和接收地址。EIP-3651 在這個列表中添加了第三個地址,即 COINBASE 地址(又名 feeRecipient),因為它也是客戶端在處理區塊交易時在內存中的地址。
EIP-3855:PUSH0 指令
顧名思義,EIP-3855 引入了一個將值 0 推入堆棧的操作碼。Pushing 0 經常用於填充 EVM 中的值,此操作碼將提供一種更有效、更便宜的方法來實現這一點。
EIP-3860:限制和計量 initcode
該 EIP 增加了 initcode 的最大大小,並引入了基於其長度的 gas 計量。 大小限制為 EVM 添加了一個不變量,這將使推理和提出更改變得更容易。
引入了一個2 gas/32 字節的initcode 開銷,以說明客戶端在執行之前必須執行的 jumpdest 分析,這在以前的 gas 計劃中並沒有被考慮到。
EVM 物件格式 🧰
上海升級包括的大多數 EIP 都是單一功能的一部分 : EVM 物件格式 (EOF)。這項升級工作被分解為 5 個不同的 EIP,以幫助客戶端開發人員單獨地直譯每個更改,但為了提供更高層次的概述,本周發布了一個統一的規範。這 5 個 EOF EIP 分別是:
1、EIP-3540: EVM 物件格式(EOF) v1
2、EIP-3670: EOF -代碼驗證
3、EIP-4200: EOF -靜態相對跳轉
4、EIP-4750: EOF -函數
5、EIP-5450: EOF -堆棧驗證
值得注意的是,EOF 的第一步是在倫敦升級中使用 EIP-3541,它為 EOF 合約保留了 0xEF00 前綴。在過去的幾個月裡,上海 EOF 升級的範圍也發生了變化。
2 月份,客戶端團隊同意為上海升級考慮兩個最小的 EOF EIP:EIP 3540 和 EIP 3670。它們將充當建構塊,但如果不引入 EIP 4200、EIP 4750 以及 EIP 5450 將無法提供全部功能。雖然有可能擴展 EOF,但向後不兼容的擴展可能需要一次版本升級。 由於具有特定版本的前 EOF 或 EOF 合約必須始終可執行,因此每個新的 EOF 版本都意味著客戶端開發人員必須維護一組與舊規則並行的新 EVM 執行規則。
在 EOF 之前,客戶端一次隻維護一組 EVM 規則。代碼庫還支援曆史 EVM 規則,這些規則可以改變每次網路升級,但一旦它們到達鏈的頂端,就隻能應用最新的規則。而使用 EOF,客戶端將維護兩個並行的 EVM 規則集,因此它們可以在 EOF 和非 EOF 合約中執行代碼。換句話說,EOF 版本bumps 增加了並行的數量,而不是順序的,必須維護的 EVM 規則集。
出於這個原因,在過去的幾個月裡,客戶端團隊開始更喜歡一種「大 EOF」方法。 這樣,雖然他們必須實施更大的變更集,但 EOF 版本將保持更長時間,從而減少要維護的「並行 EVM」的數量。因此,「大 EOF」被考慮並最終納入到接下來的上海升級中。
也就是說,更大的功能顯然更難以實施和測試,而客戶端團隊們並不希望看到 EOF 顯著延遲信標鏈提款。 因此,客戶端團隊們同意,如果到明年 1 月, EOF 實施不完整且相互之間無法快速互操作,則將 EOF 從上海移除。
在這個背景下,現在讓我們簡單地介紹一下各種 EOF EIP:
EIP-3540:EVM 物件格式 (EOF) v1
該 EIP 為 EOF 合約引入了「容器」。 它在合約中添加了區分代碼和數據部分的標籤,並防止部署不符合格式的 EOF 合約。 這保證了任何鏈上 EOF 合約都將遵循有效的布局,從而簡化了與這些合約的交互以及對它們的靜態分析。
EIP-3670:EOF – 代碼驗證
EIP-3670 建立在 EIP-3540 引入的容器之上,確保合約 EOF 中的代碼有效,或阻止其部署。
這意味著未定義的操作碼無法在 EOF 合約中部署,這具有減少所需的 EOF 版本更新數量的額外好處。 如果添加了新的操作碼,隻需更改驗證規則即可啟用它,並且可以保證沒有 EOF 部署的合約在其代碼部分引用它。
EIP-4200:EOF – 靜態相對 JUMPs
EIP-4200 引入了第一個 EOF 專用操作碼:RJUMP、RJUMPI 和 RJUMPV,它們將目標編碼為帶符號的即時值。編譯器可以使用這些新的 JUMP 操作碼來優化 gas 成本,因為它們消除了對現有 JUMP 和 JUMPI 操作碼所需的運行時 jumpdest 分析的需要。
EIP-4750:EOF – 函數
EIP-4750 比 EIP-4200 的功能更進一步:它不允許 JUMP 和 JUMPI 操作碼,並為 RJUMP、RJUMPI 和 RJUMPV 無法複製的函數添加了替代方案。它通過在 EOF 字節碼中引入特定的函數部分來實現這一點,這些函數部分可以分別使用新的 JUMPF、CALLF 和 RETF 操作碼跳轉到、調用以及回傳。
EIP-5450:EOF – 堆棧驗證
最後,EIP-5450 為 EOF 合約添加了另一個驗證檢查,這次是圍繞堆棧進行的。該 EIP 可防止 EOF 合約部署可能導致堆棧下溢,以及某些溢位情況的代碼。 有了這個,客戶端可以減少它們在執行 EOF 合約期間進行的驗證檢查的數量,因為它們可以更好地保證與堆棧相關的異常。
作為一名非 EVM 專家,以上就是我能帶你走的最遠的地方! 如果你想深入了解 EOF,我推薦你們閱讀 Geth 的 lightclients 或 Solidity 的 Leo 的文章。
信標鏈提款
最後但同樣重要的是,「Shapella」的主要組成部分是信標鏈提款。這一變化在共識層規範以及 EIP-4895 中都有規定。現在稍微有點過時的元規範將這些聯係在了一起。
下面簡單說說提款的工作原理:
當提出一個區塊時,驗證器通過驗證器索引線性掃描,找到前 16 個具有 0x01 憑據的驗證器,這些驗證器要麼:
- 餘額超過 32 ETH(即已累積驗證者獎勵)
- 可提款(即已完全退出驗證者集)
根據這些,驗證器將創建一個提款列表,以包含在他們的 ExecutionPayload 中。 該列表中的每一項都包含以下內容:
- WithdrawalIndex:所有提款中的索引——這有助於區分從同一驗證器到同一地址的相同金額的提款;
- ValidatorIndex:餘額被提取的驗證器的索引;
- ExecutionAddress: 需要發送提款的執行層 ETH 地址;
- Amount: 要發送到 ExecutionAddress 的金額,以 gwei(不是 wei)為單位;
在建構或處理區塊時,EL 客戶端將在交易執行後應用這些提款。換句話說,處理提款類似於工作量證明獎勵的記入方式,並且不會與用戶交易爭奪區塊空間。
還有一些值得注意的細節:
在處理提款時,「全部」和「部分」提款在優先級/順序方面沒有區別。 一旦驗證器離開退出隊列,就會發生完全提款,當對驗證器集的線性掃描到達驗證器的索引時,部分提款會定期發生。
為了處理提款,驗證器必須使用 0x01 憑證,它代表一個 ETH 地址。 在信標鏈啟動時,只允許使用 BLS 密鑰對的 0x00 憑據。 為了啟用提款,具有 0x00 憑證的驗證器將需要簽署 BLSToExecutionChange 消息。 這些將作為 Capella 升級的一部分啟用。 驗證者可以期待多種工具的支援和教學來簽署此消息。
對驗證器集的掃描以每個區塊為界。 如果在掃描驗證器集的一個子集後,沒有 16 個提款需要處理,驗證器將停止掃描,下一個將從上次掃描的驗證器索引中提取。
與往常一樣,將有幾個開發者測試網(devnet)和測試網(甚至可能是一些新的!)供驗證者運行整個進程,並在主網上線之前解決所有問題。
不過,上海/Capella 升級並不是唯一取得進展的升級! 開發團隊們也一直在期待下一個升級。
Cancun 升級
上海升級的內容已定,但很多 CFI 的 EIP 沒有被納入,客戶端團隊開始討論下一次 Cancun 升級應該考慮納入什麼 🏝️
在 CL 方面,EIP-4844 已被指定為 capella 後的第一個升級。 EL 尚未支援這種布局規範,但 EL 團隊同意遵循類似的路徑,並將下一次升級圍繞 EIP-4844 進行。
按照使用 devcon 城市名稱進行升級的慣例,開發者創建了 cancun.md,並正式將 EIP-4844 包含在這次升級當中。
這個決定是在 2022 AllCoreDevs 電話會議的最後幾分鐘做出的,所以沒有時間討論其他提案。那些在上海升級獲得 CFI ,但沒有入選的 EIP,已被轉移到 Cancun 的 CFI 名單上,以太坊魔術師論壇已創建了Post來討論 Cancun 候選 EIP。明年初,關於 Cancun 範圍的討論將正式開始。
KZG 儀式🕯️
另一件與 Cancun 升級相關的事情是 KZG 儀式🕯️,這是 EIP-4844 的一項要求。
儀式將生成驗證 blob 數據有效性所需的隨機性。 要使它被認為是安全的,必須隻有一個參與者誠實地參與。
從明年 1 月開始,這個儀式將向所有人開放幾個月。 目標是獲得 10,000 名貢獻者,這計劃成為迄今為止規模最大的此類儀式! 如果你想確保自己不錯過它,請關注 Trent Van Epps!
合併後升級進程
正如之前的更新中提到的,合並後的一個大的待辦事項是在 EL 和 CL 中協調以太坊的升級進程。 EL 使用黃皮書和 EIP 來指定更改,而 CL 使用可執行的 Python 規範。
EL 流程的優勢在於 EIP 被社區所熟知,並且其格式能夠清楚地呈現提案背後的原因。 大量數學的黃皮書與 EIP 相結合,並且需要將規範置於 EIP 的上下文中,這使得執行層規範既難以理解又難以擴展。
CL 方面有相反的問題:它有一個清晰易懂的規範,存在於一個單一的存儲庫中,但是更改不能明確地識別,並且提案被隱藏在存儲庫中的其他開放 PR 中。
隨著以太坊執行層規範的引入,我們有望彌合 EL 方面的差距。 而且,通過一些流程爭論,我們也許能夠將 EIP 作為 CL 流程的一部分引入……!
也就是說,隨著上海升級範圍的討論和最終確定,很明顯這個進程中可能會缺少另一個「部分」:讓社區表達他們對更改的相對偏好,參與關於升級整體範圍的討論(而不是單個 EIP),並將其納入 AllCoreDevs 和 CL 電話會議的決策中。
目前還不太清楚這是什麼樣子的——我很樂意提供建議! – 但隨著積極參與協議更改的利益相關者數量以及 L1 變更對兩者影響的領域數量的增長,顯然需要一些東西。
幸運的是,我們並不是從頭開始:以太坊魔術師論壇已經存在多年,其 IRL 聚會以及臨時分組討論室或社區電話會議可能是擴展的良好起點。
期待 2023 年初,有關於這方面的更多更新!
下一步
2022 年就這樣結束了,多棒的一年啊!三個月前,我們甚至還沒有合並 ! 而現在,以太坊正在後台默默地運行權益證明(PoS),重點已經轉移到即將發生的事情上。
隨著一月份假期的結束,你可以期待:
- 上海/Capella 開發者測試網(devnets)和影子分叉(shadow fork)👻
- KZG 儀式正在進行🕯️
- 圍繞 Cancun 升級的討論,以及網路升級進程應該如何演進以更好地捕捉社區的偏好🏝️
謝謝閱讀!感謝在過去一年中花時間努力改進以太坊的每個人-我們做了很多工作。希望你們都有一個應得的假期🎄。
2023 年見👋!
📍相關報導📍
以太坊核心會議》1500萬顆ETH「2023年3月」解鎖!秋季進入上海升級階段二