
作者:Vitalik,以太坊創始人;翻譯:善歐巴,比特鏈視界
最近的 Dencun 硬分叉中不太知名的 EIP 之一是EIP-6780,它刪除了操作碼SELFDESTRUCT的大部分功能。
該 EIP 是以太坊協議開發中經常被低估的部分的一個關鍵示例: 通過消除複雜性和添加 新的 安全保證來簡化協議的努力。 這是我所說的「PURGE」的一個重要部分:精簡以太坊和清除技術債務的項目。將會有更多的 EIP 具有類似的精神,因此 值得了解 EIP-6780如何實現的目標,以及未來Purge中可能會清除哪些其他EIP。
EIP-6780如何簡化以太坊協議?
EIP-6780 減少了操作碼SELFDESTRUCT的功能,它會銷毀調用它的合約並清空其代碼和存儲,因此只有在同一交易期間創建合約時它才有效。這本身並沒有降低 規範 的複雜性。然而,它確實通過引入兩個新的不變量來改進 實現 :
1、EIP-6780 後,單個區塊中可以編輯的存儲槽數有最大數量(大致為:gas limit / 5000)。
2、如果合約在交易或區塊開始時具有非空代碼,則在該交易或區塊結束時它將具有相同的代碼。
之前,這些不變量都不是True:
1、 SELFDESTRUCT
擁有大量存儲槽的合約可以在單個區塊內清除無限數量的存儲槽。這將使Verkle樹的實現變得更加困難,並且使以太坊客戶端的實現變得更加複雜,因為它們需要額外的代碼來有效地處理這種特殊情況。
2、合約的代碼可以通過SELFDESTRUCT從非空變為空,事實上合約甚至可以在之後立即用不同的代碼重新創建。這使得帳戶抽象錢包中的交易驗證更難使用代碼庫而不容易受到 DoS 攻擊。
現在,這些不變量 都是 True,使得構建以太坊客戶端和其他類型的基礎設施變得更加容易。幾年後,希望未來的EIP能夠完成這項工作並 SELFDESTRUCT
完全消除。
哪些其他「purges」正在進行?
-
Geth 最近刪除了數千行代碼,刪除了對pre-merge PoW網絡的支持。
-
這個 EIP正式體現了這樣一個事實:我們不再需要代碼來擔心「空帳戶」(請參閱:EIP-161 ,它引入了這個概念作為上海 DoS 攻擊修復的一部分)
-
Dencun 中 blob 的存儲窗口為 18 天,這意味著以太坊節點只需要約 50 GB 來存儲 blob 數據,並且此數量不會隨著時間的推移而增加
前兩個顯著改善了客戶端開發人員的體驗。後者顯著提高了節點運營商的壽命。
還有哪些其他可能需要Purge的東西?
預編譯(Precompiles)
預編譯是以太坊合約,它沒有 EVM 代碼,而是具有必須由客戶端自己直接實現的邏輯。這個想法是,預編譯可用於實現無法在 EVM 中有效實現的複雜形式的密碼學。
如今,預編譯的使用非常成功,特別是通過橢圓曲線預編譯啟用基於 ZK-SNARK 的應用程式。然而,還有其他很少使用的預編譯:
-
RIPEMD-160
:引入哈希函數是為了支持與比特幣更好的兼容性 -
Identity
:返回與其輸入相同的輸出的預編譯 -
BLAKE2
:引入哈希函數是為了支持與 Zcash 更好的兼容性 -
MODEXP
引入非常大的模冪以支持基於 RSA 的加密
事實證明,對這些預編譯的需求 遠遠 低於預期。 Identity
被廣泛使用,因為它是複製數據最簡單的方法,但自從 Dencun 以來,操作碼MCOPY已經取代了它。不幸的是,這些預編譯都是共識錯誤的巨大來源,也是新 EVM 實現的巨大痛苦來源,包括 ZK-SNARK 電路、形式驗證友好的實現等。
有兩種方法可以刪除這些預編譯:
-
只需刪除預編譯即可,例如。EIP-7266刪除了 BLAKE2。這很簡單,但會破壞任何仍在使用它的應用程式。
-
將預編譯替換為執行相同操作的 EVM 代碼塊(儘管不可避免地會產生更高的 Gas 成本),例如。本草案 EIP就是為了身份預編譯而這樣做的。這比較困難,但幾乎肯定不會破壞使用它的應用程式(除非在極少數情況下,新 EVM 代碼的 Gas 成本超過了某些輸入的區塊 Gas 限制)
歷史區塊 (EIP-4444)
如今,每個以太坊節點都有望永久存儲所有歷史區塊。長期以來,人們一直認為這是一種非常浪費的方法,並且由於高存儲要求而使得運行以太坊節點變得不必要的困難。在 Dencun 中,我們引入了 blob,它只需要存儲約 18 天。使用EIP-4444,一段時間後,以太坊區塊也將從默認以太坊節點中刪除。
需要解決的一個關鍵問題是:如果舊歷史記錄並沒有被每個節點存儲,那麼用什麼 來 存儲它呢?實際上,區塊瀏覽器等大型實體將會這樣做。然而,使 p2p 協議來存儲和傳遞該信息也是可能的,而且並不困難,這對於任務來說更加優化。
以太坊區塊鏈是永久性的,但要求每個節點永遠存儲所有數據是實現這種永久性的一種非常「矯枉過正」的方式。
一種方法是針對舊歷史的簡單點對點torrent網絡。另一種是針對以太坊使用進行更明確優化的協議,例如門戶網絡。
或者,以模因格式:
減少運行以太坊節點所需的存儲量可以大大增加願意做節點的人數。EIP-4444 也可以減少節點同步時間,這也簡化了許多節點運營商的工作流程。因此,EIP-4444可以大大提高以太坊節點的去中心化。潛在地,如果每個節點默認存儲一小部分歷史記錄,我們甚至可以像今天一樣在網絡上存儲每個特定歷史記錄的大致相同數量的副本。
日誌改革
直接引用這個EIP草案:
日誌最初的引入是為了讓應用程式能夠記錄有關鏈上事件的信息,以便去中心化應用程式(dapp)能夠輕鬆查詢這些信息。使用bloom過濾器,dapp 將能夠快速瀏覽歷史記錄,識別包含與其應用程式相關的日誌的幾個塊,然後快速識別哪些單個事務具有所需的日誌。
實際上,這種機制太慢了。幾乎所有訪問歷史記錄的 dapp 最終都不是通過對以太坊節點(甚至遠程託管節點)的 RPC 調用,而是通過集中式額外協議服務。
我們可以做什麼?我們可以刪除bloom過濾器,並簡化 LOG
操作碼,這樣 它 所做的就是創建一個將哈希值放入狀態的值。然後,我們可以構建單獨的協議,使用 ZK-SNARK 和增量可驗證計算(IVC)來生成可證明正確的「日誌樹」,它表示給定的所有日誌的易於搜索的表 topic
,以及需要日誌和想要的應用程式去中心化可以使用這些單獨的協議。
轉向SSZ
如今,以太坊的大部分區塊結構(包括交易和收據)仍然使用基於RLP和 Merkle Patricia 樹的過時格式進行存儲。這使得開發使用該數據的應用程式變得不必要的困難。
以太坊共識層已轉向更清潔、更高效的SimpleSerialize (SSZ):
資料來源:https://eth2book.info/altair/part2/building_blocks/merkleization/
但是,我們仍然需要完成轉換,並將執行層移至相同的結構。
SSZ 的主要優勢包括:
-
規範更加簡單和清晰
-
與現狀的六叉 Merkle Patricia 樹相比,大多數情況下 Merkle 證明的長度縮短了 4 倍
-
與極長的最壞情況相比,Merkle 證明的長度有界(例如,證明合約代碼或長收據輸出)
-
無需實現複雜的位操作代碼(RLP 需要)
-
對於 ZK-SNARK 用例,通常可以重用圍繞二元 Merkle 樹構建的現有實現
如今,以太坊中存在三種類型的加密數據結構:SHA256 二叉樹、SHA3 RLP 哈希列表和十六進位 Patricia 樹。一旦我們完成向 SSZ 的過渡,我們將只剩下兩個:SHA256 二叉樹和 Verkle 樹。從長遠來看,一旦我們在 SNARKing 哈希方面做得足夠好,我們很可能會用使用 SNARK 友好哈希(一種適用於所有以太坊的加密數據結構)的二進位 Merkle 樹來取代 SHA256 二叉樹和 Verkle 樹。