作者:Dragan Rakita,Paradigm 翻譯:善歐巴,金色財經
EOF(EVM 物件格式)
EOF(EVM Object Format)是一組旨在改進EVM的小型EIP。它引入了一種新的字節碼格式,為EVM的未來做好準備。
EOF的優勢
EOF的價值難以解釋,因為它不是單一的東西,由於多次在分叉中被推遲以及多年的開發和研究、不同版本的演變,使得解釋變得更加複雜。
本文的目的是總結這些優勢並用一句話解釋它們:
優勢:
-
EOF允許操作碼的Gas定價變化
-
如果瓦斯定價變化,傳統字節碼可能會表現不同。
移除瓦斯可觀測性
-
這意味著移除GAS操作碼,以及CALL/DELEGATECALL/STATICCALL中的燃氣限制。
允許L2根據其用例改變燃氣
-
例如,zk L2中哈希操作的高成本。
-
EIP-7667:提高雜湊函數的瓦斯成本。
減少字節碼大小,降低瓦斯使用
-
早期數據顯示代碼/初始化代碼大小和燃氣使用量的減少:
-
Uniswap-v3部署減少6.5%的初始化程式碼和部署程式碼。
-
部署UniswapV3Factory使用約14%更少的燃氣,並呼叫runTest使用約9%更少的燃氣。
-
ENS DNSRegistrar部署減少約6%的初始化程式碼和約1.5%的部署程式碼。
-
ENS調用proveAndClaim:使用約10%更少的燃氣。
允許字節碼轉換和可升級性
-
移除程式碼可觀測性意味著移除PC, CREATE/CREATE2, EXTCODEHASH, EXTCODESIZE, EXTCODECOPY, CODESIZE和CODECOPY操作碼。
-
如果程式碼更改,傳統合約將無法運作。
-
這將允許我們在未來引入verkle時對EOF字節碼進行任何形式的修改。
EOF啟用操作碼立即數
-
開啟SWAPN, DUPN和EXCHANGE操作碼的可能性。
-
這為Solidity在堆疊大小上提供了更多自由,解決了Solidity中的堆疊深度過深問題。
移除昂貴的跳躍目標分析
-
在Reth中,分析結果與字節碼一起保存,但其他客戶端不一樣。移除在合約執行前的跳轉目標分析提高了速度。
-
隨著分析的移除,未來我們可以增加最大字節碼大小。
靜態分析變得更容易
-
子程序強制更結構化的控制流,這使模糊測試更有效,並且可以實現線性時間的靜態分析。
-
資料和程式碼分離,更容易推理。
EOF字節碼可以編譯成更快的字節碼
-
EOF字節碼可以編譯成機器碼。
未來證明EVM
-
字節碼的版本和結構允許其可擴展性。這對L2和標準化尤其有用。
-
一個例子是EIP-7701:帶有EOF的本地帳戶抽象,增加了新的頭部部分。
位址空間擴充
-
新的EXT*CALL操作碼透過要求位址欄位填入零,為未來的位址擴充做好了準備。當以太坊決定擴展地址空間時,EOF已經為這些變化做好了準備。
與當前EVM的集成
對於開發人員來說,一個重要的問題是實施變更所需的努力、測試成本和維護這些操作碼的成本。
新的操作碼不會與傳統操作碼衝突,EOF的驗證不會觸及已棄用的操作碼。
EOF的編碼和解碼可以進行模糊測試。驗證是一個新事物,在Revm中大約有500行程式碼,但有很多邊緣情況需要覆蓋,並需要集中精力在各個實現中做到正確。
建立交易用作EOF字節碼的載體,類似EOFCREATE但在執行前需要驗證。
大多數操作碼非常簡單:
-
EXTCALL (0xf8), EXTDELEGATECALL (0xf9), EXTSTATICCALL (0xfb)
-
具有與已棄用的CALL相同的藍圖,但移除了gas_limit和記憶體輸出欄位。
-
在RETURNDATALOAD引入之前(在一個很早的分叉中),CALL操作碼的記憶體輸出必須在執行CALL操作碼之前設定。這不允許動態輸出。
-
EOFCREATE和RETURNCONTRACT
-
是EOF的新內容,需要特殊處理。
-
EXCHANGE (0xe8), SWAPN (0xe7), DUPN (0xe6), DATACOPY (0xd3), DATASIZE (0xd2), DATALOADN (0xd1), DATALOAD (0xd0), RJUMP (0xADN (0xd1), DATALOAD (0xd0), RJUMP (0xe00eJUM. RETURNDATALOAD
-
邏輯簡單,大多數只需10-20行程式碼實作。沒有很多需要覆蓋的邊緣情況。
-
CALLF (0xe3), RETF (0xe4), 和JUMPF (0xe5)
-
需要子程式堆疊和堆疊驗證,複雜度大約需要20-30行程式碼。
-
需要一個開發人員約2-3個月的時間。測試工作已經開始。目前大約有2000個手寫的驗證測試,狀態測試工作也正在進行中。
變化集中在EVM中,因此與客戶端其餘部分的整合取決於客戶端的架構以及保存字節碼的位置。
EXTCODESIZE和EXTCODEHASH需要知道帳戶是否為EOF,並傳回預先定義的值(0xEF00的大小和雜湊),這可能會略微改變客戶端的整合方式。一個想法是將is_eof標誌保存在普通帳戶表中,以在呼叫任何EXTCODE類型的操作碼時跳過字節碼的載入。
對L2的影響
最大的問題是為什麼L2不實施這些變更?我們是否應該在以太坊L1上停止EVM改進?
現實情況是,L2還沒準備好,不僅如此,它們也沒有一個平台來幫助整合這些創新。字節碼版本控制有助於建構L2可以使用的平台,程式碼可觀測性的移除有助於緩解可升級性問題,燃氣變化幫助ZK L2消除燃氣炸彈的DDoS向量(例如,zk中的哈希值非常昂貴)。
更重要的是,EOF不僅僅是一種格式,它還需要語言(Solidity/Vyper/Huff)的支持,並需要工具鏈的支持才能使用。它需要一個生態系統來使用它,這種格式為L2提供了更多的穩定性,以便在其上進行創新。
缺點:傳統字節碼仍然存在
這是一個常見問題。傳統字節碼將永遠存在,如果我們不提供替代方案,我們將陷入困境。有了替代格式的字節碼,未來我們可以在狀態過期發生時過渡並移除傳統字節碼。
總結
EOF不是下一個耀眼的東西,它是修復初始EVM版本遺留問題的維護EIP,除了破壞它,沒有其他方法可以解決這些問題。它對於EVM的進一步發展和未來證明是必要的。