賬戶抽象旨在改善整個以太坊生態系統中的用戶和開發者體驗。它不僅使鏈上用戶體驗更加易於使用和順暢,還使開發者能夠在以太坊上實現更強大的功能,並以更加有意義的方式為用戶提供服務。
我們將賬戶抽象的方法進行了如下分類:
這種方法提供了使 EOA 過渡到 CA 的機制,而無需轉移其資產,例如 EIP 7377 和 EIP 5003(當與 EIP 3074 一起考慮時)。
先前已提出了多種創建智能賬戶和在協議層面實施賬戶抽象的提案;EIP-86 和 EIP-2938 是其中被引用較多的幾個。然而,這一設計曾遭遇了較大的反對,是因為它帶來的複雜性,以及人們認為以太坊尚未準備好應對這種複雜性。
在合併後,Vitalik 重新提出了這個話題,ERC-4337 被提議作為智能賬戶標準的可選版本,類似於 MEV(最大可提取價值)的 PBS(提議者-構建者分離)架構。因此,用戶如果希望訪問智能賬戶的優勢,可通過 ERC-4337 管道來重新定義賬戶邏輯和交易的有效性規則,這些結構稱為 UserOperation(簡稱 UserOps)。
ERC-4337 不需要引入複雜性就能將智能賬戶的優勢帶入現有的以太坊,作為智能賬戶的協議外替代方案。然而,這並不意味著該基礎設施在現有狀態下是最優的,因為其本身的複雜性仍然是一個潛在的故障點。
為了應對這一複雜性,草擬了 RIP 7560 作為以太坊及其 L2 網絡上 ERC-4337 基礎設施的正式版本,使其繼承網絡的 Sybil 抗性機制,而不必重新定義一套新的規則(如 ERC-4337 與 RC 7562 所做的那樣)。
在本報告中,我們將重點探討 EOA 的可編程性,評估描述這一方向解決方案的各種 EIP,並討論它們的優缺點。在本系列的第二部分和第三部分中,我們將涵蓋以太坊正在探索的賬戶抽象的另外兩種方法類別。
要探討什麼可以進行抽象化處理,我們首先需要對當前的賬戶設計有一個(較為)完整的瞭解。本節將主要回顧以太坊賬戶實際情況,介紹它們的交易是如何被驗證和執行的。
以太坊賬戶是存有以太幣(ETH)餘額並能夠在以太坊區塊鏈上發送交易的實體。賬戶通過一個 42 字符的十六進制“地址”表示,該地址是賬戶資產和交易的唯一標識。
地址充當區塊鏈狀態樹的入口鍵。該狀態樹的葉節點是賬戶數據結構,可以被分解為以下四個字段:
這四個字段的內容用於定義賬戶的類型,並最終決定其功能的範圍。因此,以太坊的賬戶可以分為以下兩種類型:
EOAs 的 codeHash
和 storageHash
字段為空,只能由持有私鑰的人控制。其地址可以通過將“0x”前綴加到賬戶公鑰的 keccak-256 哈希後的最後 20 個字符來獲得。
codeHash
)被寫入 EVM 中,並負責通過定義其邏輯和交互來控制賬戶。它們的交易完全基於拉取模式,並且以其已部署代碼的邏輯為前提。
由於這些賬戶只能通過其代碼內容進行控制,因此它們不需要私鑰,僅有公鑰。因此,任何能夠更新或更改合約賬戶代碼內容的代理人,都能訪問其餘額。
CA 的地址是通過其創建者的地址和合約部署時的 nonce 派生出來的。
交易
我們剛剛將賬戶描述為能夠在以太坊上發送交易的實體。因此,可以理解,賬戶的一個主要功能就是發送和接收交易,而區塊鏈則充當著記錄交易歷史的賬本,並描述交易如何根據區塊鏈協議規範的規則改變賬戶字段。
那麼,“交易”到底是什麼呢?
交易是從賬戶發出的操作,導致網絡“狀態”的變化。它們是由賬戶加密簽名的指令,執行時會更新整個網絡狀態。
無許可性伴隨著扭曲激勵的風險,必須定義嚴格的準則(或有效性規則)來應對這種環境中的交互。
在此背景下,交易必須遵循一定的有效性規則,才能被視為有效並執行。大多數有效性規則是通過對發送交易的賬戶施加約束來實現的,並且這些規則會根據賬戶類型的不同而有所變化。
在以太坊上,外部擁有賬戶(EOAs)是為終端用戶優化的賬戶類型。它們能夠以特定的方式發送交易,並且能夠完全自主地運作。EOAs 還可以在本地創建,常見的方式是通過使用如MetaMask、Rainbow、Rabby 等錢包服務提供商。
另一方面,合約賬戶(CAs)只能發送其邏輯允許的交易,並且只有在被“調用”時才會發送交易。此外,合約賬戶只能由擁有足夠餘額支付其狀態存儲費用的 EOA 創建。
從更高層次來看,EOAs 僅能持有餘額,而 CAs 既可以持有餘額,又可以持有邏輯,用以決定如何使用這些餘額。
這些屬性是由以下邏輯參數決定的,這些參數定義了賬戶交易必須遵循的規則:
這些參數對 EOAs 而言是嚴格的,因此:
更廣泛地說,EOAs 的執行邏輯限制了它們每個有效簽名只能發送一次交易。
另一方面,CAs 在這些參數上更加靈活:
在大多數實際情況中,使用的邏輯是多簽名方案,該方案規定,必須由特定賬戶(通常是EOAs)提供有效的 M 簽名(M < N),才能使對 CA 邏輯的更改有效。
評估這些特性後,我們觀察到,每種類型的賬戶都在自治性和可編程性之間做出了權衡。
在接下來的小節中,我們將研究這些設計選擇的影響,從而充分理解本系列中討論的每個 EIP 的提案。
現在我們對不同類型賬戶的功能有了相對簡明的瞭解,我們可以更容易地理解它們的優點以及它們對以太坊用戶體驗和開發者體驗所帶來的問題。
正如我們之前提到的,EOAs(外部擁有賬戶)是面向終端用戶的一級賬戶。應用程序設計上便於與 EOAs 進行交互,幾乎沒有複雜性,創建一個 EOA 也沒有成本。然而,它的簡易性也帶來了顯著的侷限性,因為它們是嚴格確定性的設計。
與 EOAs 相關的一些問題有:
不是每個人都想(或者能夠)一直持有 ETH(看看那價格波動),所以可行的解決方案是要麼允許多種 Gas 貨幣(但這太複雜了,會打破“貨幣”部分描述的多個不變性),要麼允許由不是交易來源賬戶的其他賬戶結算 Gas 費用。
另一方面,合約賬戶(CAs)主要面向開發者和更技術化的用戶群體。它們作為智能合約的載體(即我們認為智能合約是其包含的邏輯或代碼內容),因此可以實現由 EVM 支持的新型交易格式。
然而,儘管具備這些特性,CAs 仍然是被美化的二級賬戶,因為它們沒有自主性。它們有如下一些缺點:
在回顧了導致本小節所定義問題的設計選擇之後,我們現在可以繼續評估提出的解決方案。
賬戶抽象的概念(至少是通過智能賬戶)一直是以太坊路線圖的重要組成部分。傳說中,其實現所涉及的複雜性曾威脅到以太坊的發佈進度,因此它被放棄,取而代之的是當前的設計,不同類型的賬戶提供不同的功能。隨著以太坊將重點轉向“合併”(The Merge),這一概念再次被推遲,而如今它作為網絡下一個重大升級——Pectra 的核心部分重新浮出水面。然而,它的複雜性仍被視為一個重大缺點,導致其無法得到正式確立,尤其是以太坊已經轉向了以 Rollup 為中心的路線圖。
當前的要求可以總結為兩方面:
直觀來看,這一概念在鏈抽象和互操作性的背景下扮演著更重要的角色,但我們在本報告中僅討論實現賬戶抽象的技術舉措。
賬戶抽象旨在將 EOA 和 CA 的最佳特性結合成一種新的賬戶標準——智能賬戶。這種智能賬戶允許完全或部分地將賬戶的有效性規則分離為驗證邏輯和執行邏輯;使賬戶能夠像合約賬戶一樣定義自己的有效性規則——在 EVM 允許的範圍內,同時又能像外部擁有賬戶一樣保持完全的自主性。
常常有人將智能賬戶和智能合約錢包混淆,不明白它們之間的區別,因此我們將在下文明確描述這兩者的差異:
智能賬戶是以太坊賬戶的一種設計理念,旨在實現編程靈活性和自主性的平衡。其理念是, EOA 和 CA 都可以通過某些機制(例如 ERC 4337)變成智能賬戶,這些機制允許它們根據需要用定製的有效性規則替換由網絡強加的有效性規則。
另一方面,智能合約錢包只是作為合約賬戶接口的錢包提供者(是的,錢包並不是賬戶)。
智能合約錢包的商業化推動了 CA 在更廣泛市場的普及,使得技術門檻較低的用戶能夠利用其功能。然而,它們仍然面臨與 CA 相關的固有問題。
回到之前的討論;我們曾討論過用於定義賬戶交易有效性規則的參數:
前四個參數的值可以統稱為賬戶的驗證邏輯,這些驗證邏輯是在交易執行開始之前進行的檢查。
最後一個參數定義了交易執行的方式。
在介紹部分,我們通過對各種提議設計進行某種分類,概述了當前賬戶抽象(AA)領域的整體情況。接下來,我們將重點關注以太坊賬戶困境的第一類解決方案——EOA 可編程性。
以太坊最大的吸引力在於其新興且充滿活力的 DeFi 生態系統,該生態系統包含多種去中心化應用(DApp),它們是主要的流動性匯聚點。多數去中心化應用(DApps)都優化為服務外部擁有賬戶(EOAs),因此難以與合約賬戶(CAs),也就是智能賬戶,進行交互。雖然智能合約錢包在這種情況下可以幫助 CAs,但它們也有自身的侷限性,而且提供的用戶體驗完全不同。
在 DApp 和錢包提供商逐漸適應智能賬戶標準的過程中,正在探索一種過渡性解決方案,即為 EOA 提供臨時增強功能,使其能夠克服大部分限制,無論是驗證邏輯還是執行邏輯。
下面,我們將介紹三項主要的 EIP(以太坊改進提案)規範,這些提案為 EOA 的可編程性提供了可操作的路徑;從較少被關注的 EIP 5806,到雄心勃勃的 EIP 3074,再到最終取得勝利的 EIP 7702。
該提案旨在通過允許外部擁有賬戶(EOA)執行委託調用(delegate call)來擴展其功能,使其能夠調用合約賬戶(CA)的邏輯(即智能合約)。這實際上使得智能合約在調用方 EOA 的上下文中執行,也就是說,EOA 依然掌控驗證邏輯,而執行邏輯則由相應的 CA 的邏輯處理。
在進一步討論之前,讓我們回到 EIP-7,回顧一下以太坊演進的歷史。
EIP-7 提議創建 0xf4/DELEGATECALL
操作碼,用於在調用主賬戶時使用輔助賬戶的邏輯,同時保持主賬戶的 [sender] 和 [value] 字段的值不變。
換句話說,主賬戶“繼承”(或者如果你願意,可以稱為借用)次賬戶的邏輯,並在指定的消息調用期間內執行,這樣次賬戶的邏輯就在主賬戶的上下文中被執行。
這個操作碼使得 DApp 開發者可以將應用邏輯拆分到多個智能合約中,同時保持相互依賴性,從而輕鬆繞過代碼大小和 gas 費用的限制。
那麼,委託調用如何讓合約賬戶(CAs)相互依賴呢?EIP-5806 以 EIP-7 為靈感,提出了將委託調用功能擴展到外部擁有賬戶(EOAs)的建議;也就是說,讓我們允許 EOAs 也與 CAs 互相依賴,因為為什麼不呢。
EIP 5806 引入了一種新的符合 EIP-2718 的交易類型,具體內容如下: rlp([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list, signature_y_parity, signature_r, signature_s])
這些交易設計使得 [to] 字段——表示接收方地址——只能接受 20 字節的地址輸入,從而禁止發送方使用 CREATE 操作碼。
RLP 方案中每個組件的動機如下:
雖然 EIP-5806 交易被封裝在 EIP-2718 信封中,使其在很大程度上兼容舊版,但 EOA 與 CA 並不等同。因此,必須在 EOA 使用委託調用時定義某些限制,以防止破壞不變性。
這些限制主要針對以下操作碼:
EIP 5806 的主要適用場景是外部擁有賬戶(EOAs)的執行抽象。允許 EOAs 無需信任即可與智能合約進行交互,超越簡單的調用合約邏輯,從而為它們提供以下功能:
EIP-5806 提出的變化,雖然啟用了所需的功能,但並不特別創新;它的存在大多基於已經有效的 EIP-7。這使得它可以繞過許多可能的接受障礙。
其中一個早期提出的主要擔憂是,允許外部擁有賬戶(EOAs)像當前的合約賬戶(CAs)一樣訪問並修改存儲數據的潛在風險。這打破了網絡上關於 EOAs 如何進行交易的許多固定規則,因此通過引入前面小節中提到的限制來處理這一問題。
第二個批評(有點像雙刃劍)是 EIP-5806 的簡單性;有一種觀點認為,接受 EIP-5806 所帶來的回報可能不足以彌補其成本,因為它只啟用了執行抽象,而沒有更多的功能。與其他類似的 EIP 相比,接受 EIP-5806 後,所有其他有效性限制仍然由網絡定義,而不是像其他類似提案那樣提供更多的功能。
EIP-3074 提議允許外部擁有賬戶(EOAs)將大部分驗證邏輯委託給專門的合約賬戶,稱為‘調用者(invokers)’,通過將調用者的授權邏輯覆蓋在自己的驗證邏輯上,來處理特定形式的交易。
它通過將其訪問策略的簽名授權給一個 invoker 合約來實現這一點,之後該合約就負責定義 EOA 的訪問策略。
此 EIP 提議向以太坊虛擬機(EVM)中添加兩個新的操作碼:
[authorized]
賬戶,授權該賬戶代表另一個 [authority]
賬戶執行操作。[authorized]
賬戶從 [authority]
賬戶發起/執行調用。這兩個操作碼使得 EOA 可以將控制權委託給一個預先建立的合約賬戶(CA),從而通過該合約賬戶行事,而無需部署一個合約,避免了部署合約所帶來的成本和外部影響。
EIP-3074 允許交易使用 [MAGIC] 簽名格式,以防止與其他交易簽名格式發生衝突。傳遞 [AUTHCALL] 指令的活動賬戶被定義為一個上下文變量字段 [authorized],該字段只在一個交易內存在,並且必須在每次新的 [AUTHCALL] 中重新定義。
在理解每個操作碼的複雜性之前,先來了解 EIP-3074 交易中涉及的實體:
調用者合約接收來自 [authority] 的 [AUTH] 消息及其 [COMMIT] 值;該值定義了賬戶希望對 [authorized] 執行 [AUTHCALL] 指令時施加的限制。
因此,調用者合約負責確保在 [authorized] 賬戶中定義的 [contract_code] 不存在惡意行為,並且能夠滿足由主簽名賬戶在 [COMMIT] 值中定義的不變性。
[AUTH] 操作碼有三個棧元素輸入;簡而言之,它由三個輸入計算一個輸出。這些輸入為:
後兩個輸入用於描述一個從 0 到 97 的可修改內存範圍,其中:
變量 [yParity]、[r] 和 [s] 共同解釋為 ECDSA 簽名 [magic],它基於 secp256k1 曲線和以下消息生成:
[keccak256 (MAGIC || chainID || nonce || invoker address || COMMIT)]
其中:
如果計算出的簽名有效且簽名者地址與 [authority] 相同,[authorized] 字段將更新為 [authority] 提供的值。如果這些要求未得到滿足,[authorized] 字段將保持其先前的狀態,或作為未設置值。
該操作碼的 gas 費用計算為以下各項的總和:
[AUTH] 被設計為不修改內存,並將 [authority] 的值作為參數,因此可以輕鬆驗證其簽名。
[AUTHCALL] 操作碼
[AUTHCALL] 操作碼有七個棧元素輸入,用於計算一個棧元素輸出。其邏輯與 [CALL] 操作碼相同;即,它用於向賬戶發送消息調用並觸發其合約中的特定邏輯。唯一的不同之處在於, [AUTHCALL] 被設計為在執行前先設置 [CALLER] 的值。
因此, [AUTHCALL] 由 [authority] 用來在 [authorized] 中觸發特定上下文的行為,執行過程中的邏輯檢查如下:
[AUTHCALL] 的 gas 費用由以下部分組成:
[AUTHCALL] 返回的數據通過以下方式訪問:
為了簡化技術細節,通常以兩種方式指定以太坊交易的值:
在 EOA 中,如前所述,授權與執行緊密結合,即(tx.origin == msg.sender)。這一簡單的不變性導致了報告中“賬戶與交易有效性”小節所討論的大多數問題。
[AUTH] 消息來自 [authority],允許將 tx.origin 功能偏移到 [authorized],而保持 msg.sender 不變。它還允許使用 [COMMIT] 值定義對這一權限的限制。
[AUTHCALL] 允許 [authorized] 訪問合約邏輯,通過 [invoker] 作為中介,確保其訪問的合約無害。也就是說,每個 [AUTHCALL],[authorized] 必須為其 [COMMIT] 指定一個特定的 [invoker]。
EIP-3074 主要用於允許 EOA 將其授權邏輯委託給不同的賬戶,但其開放設計在不同的上下文中能夠實現更多功能。
EOA 的整個驗證邏輯可以通過應用必要的約束/創新來抽象化,基於目標邏輯的一些可能設計包括:
正如其一位作者所言:“我不希望錢包暴露出可以授權任意調用者的功能…”。EIP-3074 所帶來的最大問題之一是,在其基礎上創新可能很容易導致許可化和專有的交易流程,就像當前以太坊的 MEV 和 PBS 市場的演變一樣。
默認情況下,調用者合約需要經過廣泛的審計,以防止比目前更嚴重的攻擊。這不可避免地會導致一個生態系統,其中只有少數由有影響力人物開發的調用者合約會被錢包開發者作為默認選項採用。因此,這就變成了一個權衡問題:是在不斷審計和支持調用者合約的過程中,承擔用戶安全風險,還是選擇採用來自已建立和信譽良好的來源的調用者合約,這些合約對用戶安全有更好的保障,同時對合約安全的監督較少。
這一點的另一個方面是,與設計、審計和推廣一個功能性和安全的 invoker 相關的成本問題。較小的團隊幾乎總是會被更大的組織超越——尤其是在營銷方面——即便他們的產品更好,較大的組織由於已有一定的聲譽,通常更容易獲得成功。
EIP-3074 使 ECDSA 簽名機制更加根深蒂固,因為它仍然被認為比通過 invoker 引入的授權機制更有效。儘管有一些觀點認為量子抗性目前不是一個確定的問題,而且在未來 ECDSA 可能被攻破的情況下,實際上面臨的風險更大;以太坊的目標通常是始終走在這些問題前面。為了獲得在用戶體驗上的微小改進,可能犧牲量子抗性和審查抗性,並不是近未來的最佳選擇。
關於向前兼容性的問題,在 EIP-3074 的好處尚在評估時,ERC-4337(無需任何協議更改)已經取得了一個良好的市場,因此你也必須兼容它,以避免生態系統的隔離。而且即使在本地賬戶抽象的路線圖中,[AUTH] 和 [AUTHCALL] 操作碼最終會在 EVM 中變得過時,給以太坊帶來大量的技術債務,來換取用戶體驗的微小改善。
在發送 [AUTH] 消息並委託控制後,EOA 必須避免使用常規的私鑰授權方案,因為發送“普通”交易會導致其委託給每個調用者的授權被撤銷。
因此,ECDSA 方案仍然優於任何其他授權方案,意味著私鑰丟失會導致賬戶資產的完全喪失。
該提案最初作為 EIP 3074 的一個簡化變種提出,甚至旨在作為其更新版本。它的誕生是為了應對 EIP 3074 的一些效率問題,特別是它與已經蓬勃發展的 4337 生態系統以及原生賬戶抽象提案 RIP 7560 的不兼容性問題。
它的設計方法是引入一種新的符合 EIP 2718 的交易類型——[SET_CODE_TX_TYPE],使得 EOA(外部擁有賬戶)能夠在指定交易中表現為智能賬戶。
此設計不僅實現了與 EIP 5806 相同的功能,還提供了更多功能,同時與原生賬戶抽象路線圖和現有提議保持兼容。
EIP-7702 允許 EOA 通過 [SET_CODE_TX_TYPE] 2718 規範交易導入合約的代碼內容,交易格式為:
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])
此負載與 EIP 5806 非常相似,唯一的不同是它引入了一個“授權列表”。該列表是按順序排列的值,格式為:
[[chain_id, address, nonce, y_parity, r, s], ...]
其中每個元組定義了 [address] 的值。
在進行下一步操作之前,涉及 [SET_CODE_TX_TYPE] 的各方為:
當 [authority] 簽署一個指定 [address] 的 [SET_CODE_TX_TYPE] 時,便會創建一個委託設計者。這是一個“指針程序”,它使得所有由於 [authority] 的操作而導致的代碼檢索請求都會被引導到 [address] 可見的代碼中。
對於每個 [chain_id, address, nonce, y_parity, r, s] 元組,7702 類型交易的邏輯流程如下:
authority = ecrecover(keccak(MAGIC || rlp([chain_id, address, nonce])), y_parity, r, s)
驗證 [authority] 的簽名。簡而言之,這個 EIP 允許 EOAs 發送交易,設置指向合約代碼的指針,使它們在後續交易中能夠實現此邏輯。因此,它比 EIP 5806 更強大,因為它允許 EOAs 持有代碼內容,直到它們希望為止(而 EIP 5806 僅允許 EOAs 發送委託調用)。
雖然可以爭論說它不再是一個抽象,因為 EOA 積極地選擇它希望執行的邏輯,但它仍然不是該邏輯的‘主要擁有者’。此外,它並不直接包含邏輯,而只是指定了指向邏輯的指針(以減少計算複雜度)。所以我們仍然稱之為執行抽象!
儘管 require(msg.sender == tx.origin)
不變式被打破以允許自我贊助,但該 EIP 仍然允許集成贊助交易中繼。需要注意的是,這些中繼需要一個基於聲譽或股份的系統來防止惡意攻擊。
EOAs 只能指向賬戶代碼的特定部分,從而使得只有該部分的邏輯可以在其上下文中執行。
這還使得子密鑰的存在成為可能,從而實現“權限降級”,確保特定的 dApp 僅在特定條件下能夠訪問賬戶餘額。例如,你可以設想一個權限,允許支出 ERC-20 代幣但不允許支出 ETH,或者每日至多支出總餘額的 1%,或僅與特定應用交互。
由於其非限制性的性質,EIP-7702 交易可以允許用戶訪問 CREATE2 操作碼,並使用它將字節碼部署到某個地址,而無需其他限制性參數(如費用市場邏輯,例如 EIP-1559 和 EIP-4844)。這使得該地址可以在多個狀態機中恢復並使用相同的字節碼,其中每個鏈上的賬戶負責定義其他上下文變量參數。
儘管 EIP-7702 仍然非常新,但其依賴項和潛在缺點已經進行了大量原型設計和測試。由於其極簡主義的模型,它在不同的上下文中具有很大的靈活性和實用性。然而,它打破了許多不變式,並且不立即向後兼容。
其中的一些邏輯包括:
* **交易中途 EOA nonce 修改**:EIP-7702 不限制任何操作碼,以確保一致性。這意味著 EOA 可以在執行 EIP-7702 交易時實現 CREATE、CREATE2 和 SSTORE 等操作碼,從而允許其 nonce 在不同的上下文中增加。
* **允許非零 codeHash 值的賬戶作為交易發起者**:EIP-3607 的實施是為了減少 EOA 和 CA 之間的“地址碰撞”潛在影響。地址碰撞發生在 EOA 的地址與 CA 的地址完全相同時。大多數用戶對賬戶的實際內容(甚至對賬戶和地址之間的區別)並不熟悉,因此允許地址碰撞意味著 EOA 可以偽裝成 CA,吸引用戶資金並最終竊取這些資金。EIP-3607 通過規定包含代碼的賬戶不能使用自己的授權邏輯來花費其餘額來解決這個問題。然而,EIP-7702 打破了這一不變式,使得即使獲得了一些可編程性,EOA 仍能保持自主性。
簽署賬戶地址而不是其代碼內容實際上類似於 3074 中使用的調用者方案。它沒有提供嚴格的跨鏈代碼內容一致性保證,因為一個地址在不同鏈上的代碼內容可能不同。這意味著一個在某條鏈上包含相同邏輯的地址,在另一條鏈上可能是掠奪性或完全惡意的,這可能導致用戶資金的損失。
目前的 EOA(外部擁有賬戶)形式受限,無法讓用戶充分利用 EVM 提供的可編程功能。雖然我們在本報告開始時概述了多種升級賬戶的路徑,但選擇的解決方案必須保持安全、可靠的自主管理原則。此外,EOA 升級可能會顯著影響用戶體驗和應用開發者,因此必須考慮所有利益相關者的聲音。
允許 EOA 以任何方式執行代碼極大地擴展了賬戶的功能,但這種新型的可表達性也帶來了實際的風險和可能的盲點。解決這些權衡對於為以太坊用戶提供一個無可爭議的更好用戶體驗(UX)至關重要。
以太坊的開放討論文化使其成為這種創新的絕佳試驗場,因為幾乎每個設計的每個影響都被領域專家徹底解構。這樣的全面考慮有助於減輕來自對手的不當行為風險。
EIP-7702 目前是將 EVM 可編程性引入 EOA 的典型機制,被視為替代 EIP 3074 在 Pectra 升級中的位置。它繼承了 3074 機制的開放設計,同時大幅降低了攻擊面和風險。它還通過避免 3074 對某些操作碼類別的限制,實現了更多功能。
儘管該提案的設計仍在進行一些完善,但它已經獲得了開發者的大量支持,尤其是因為它得到了 Vitalik 的支持。
在社區中,有觀點認為這種賬戶抽象方式可能比智能賬戶更優。這一評論強調,這種方式需要更少的變動,且不如智能賬戶複雜,同時 EOA 已經得到認可。然而,我們必須牢記以太坊網絡各層級未來的量子抗性安全目標。由於 EOA 授權使用基於 ECDSA 的簽名方案,當前賬戶模型核心無法實現這一量子安全性。
因此,EOA 的可編程性應被視為邁向智能賬戶的一個步驟,而非終點。它為 EOA 提供了更強大的功能,提升了用戶和開發者體驗,同時與最終的智能賬戶目標保持兼容。
在我們的下一個報告中,我們將深入探討 EOA 遷移方案,看看它們在賬戶抽象路線圖中的適配程度,敬請關注!
賬戶抽象旨在改善整個以太坊生態系統中的用戶和開發者體驗。它不僅使鏈上用戶體驗更加易於使用和順暢,還使開發者能夠在以太坊上實現更強大的功能,並以更加有意義的方式為用戶提供服務。
我們將賬戶抽象的方法進行了如下分類:
這種方法提供了使 EOA 過渡到 CA 的機制,而無需轉移其資產,例如 EIP 7377 和 EIP 5003(當與 EIP 3074 一起考慮時)。
先前已提出了多種創建智能賬戶和在協議層面實施賬戶抽象的提案;EIP-86 和 EIP-2938 是其中被引用較多的幾個。然而,這一設計曾遭遇了較大的反對,是因為它帶來的複雜性,以及人們認為以太坊尚未準備好應對這種複雜性。
在合併後,Vitalik 重新提出了這個話題,ERC-4337 被提議作為智能賬戶標準的可選版本,類似於 MEV(最大可提取價值)的 PBS(提議者-構建者分離)架構。因此,用戶如果希望訪問智能賬戶的優勢,可通過 ERC-4337 管道來重新定義賬戶邏輯和交易的有效性規則,這些結構稱為 UserOperation(簡稱 UserOps)。
ERC-4337 不需要引入複雜性就能將智能賬戶的優勢帶入現有的以太坊,作為智能賬戶的協議外替代方案。然而,這並不意味著該基礎設施在現有狀態下是最優的,因為其本身的複雜性仍然是一個潛在的故障點。
為了應對這一複雜性,草擬了 RIP 7560 作為以太坊及其 L2 網絡上 ERC-4337 基礎設施的正式版本,使其繼承網絡的 Sybil 抗性機制,而不必重新定義一套新的規則(如 ERC-4337 與 RC 7562 所做的那樣)。
在本報告中,我們將重點探討 EOA 的可編程性,評估描述這一方向解決方案的各種 EIP,並討論它們的優缺點。在本系列的第二部分和第三部分中,我們將涵蓋以太坊正在探索的賬戶抽象的另外兩種方法類別。
要探討什麼可以進行抽象化處理,我們首先需要對當前的賬戶設計有一個(較為)完整的瞭解。本節將主要回顧以太坊賬戶實際情況,介紹它們的交易是如何被驗證和執行的。
以太坊賬戶是存有以太幣(ETH)餘額並能夠在以太坊區塊鏈上發送交易的實體。賬戶通過一個 42 字符的十六進制“地址”表示,該地址是賬戶資產和交易的唯一標識。
地址充當區塊鏈狀態樹的入口鍵。該狀態樹的葉節點是賬戶數據結構,可以被分解為以下四個字段:
這四個字段的內容用於定義賬戶的類型,並最終決定其功能的範圍。因此,以太坊的賬戶可以分為以下兩種類型:
EOAs 的 codeHash
和 storageHash
字段為空,只能由持有私鑰的人控制。其地址可以通過將“0x”前綴加到賬戶公鑰的 keccak-256 哈希後的最後 20 個字符來獲得。
codeHash
)被寫入 EVM 中,並負責通過定義其邏輯和交互來控制賬戶。它們的交易完全基於拉取模式,並且以其已部署代碼的邏輯為前提。
由於這些賬戶只能通過其代碼內容進行控制,因此它們不需要私鑰,僅有公鑰。因此,任何能夠更新或更改合約賬戶代碼內容的代理人,都能訪問其餘額。
CA 的地址是通過其創建者的地址和合約部署時的 nonce 派生出來的。
交易
我們剛剛將賬戶描述為能夠在以太坊上發送交易的實體。因此,可以理解,賬戶的一個主要功能就是發送和接收交易,而區塊鏈則充當著記錄交易歷史的賬本,並描述交易如何根據區塊鏈協議規範的規則改變賬戶字段。
那麼,“交易”到底是什麼呢?
交易是從賬戶發出的操作,導致網絡“狀態”的變化。它們是由賬戶加密簽名的指令,執行時會更新整個網絡狀態。
無許可性伴隨著扭曲激勵的風險,必須定義嚴格的準則(或有效性規則)來應對這種環境中的交互。
在此背景下,交易必須遵循一定的有效性規則,才能被視為有效並執行。大多數有效性規則是通過對發送交易的賬戶施加約束來實現的,並且這些規則會根據賬戶類型的不同而有所變化。
在以太坊上,外部擁有賬戶(EOAs)是為終端用戶優化的賬戶類型。它們能夠以特定的方式發送交易,並且能夠完全自主地運作。EOAs 還可以在本地創建,常見的方式是通過使用如MetaMask、Rainbow、Rabby 等錢包服務提供商。
另一方面,合約賬戶(CAs)只能發送其邏輯允許的交易,並且只有在被“調用”時才會發送交易。此外,合約賬戶只能由擁有足夠餘額支付其狀態存儲費用的 EOA 創建。
從更高層次來看,EOAs 僅能持有餘額,而 CAs 既可以持有餘額,又可以持有邏輯,用以決定如何使用這些餘額。
這些屬性是由以下邏輯參數決定的,這些參數定義了賬戶交易必須遵循的規則:
這些參數對 EOAs 而言是嚴格的,因此:
更廣泛地說,EOAs 的執行邏輯限制了它們每個有效簽名只能發送一次交易。
另一方面,CAs 在這些參數上更加靈活:
在大多數實際情況中,使用的邏輯是多簽名方案,該方案規定,必須由特定賬戶(通常是EOAs)提供有效的 M 簽名(M < N),才能使對 CA 邏輯的更改有效。
評估這些特性後,我們觀察到,每種類型的賬戶都在自治性和可編程性之間做出了權衡。
在接下來的小節中,我們將研究這些設計選擇的影響,從而充分理解本系列中討論的每個 EIP 的提案。
現在我們對不同類型賬戶的功能有了相對簡明的瞭解,我們可以更容易地理解它們的優點以及它們對以太坊用戶體驗和開發者體驗所帶來的問題。
正如我們之前提到的,EOAs(外部擁有賬戶)是面向終端用戶的一級賬戶。應用程序設計上便於與 EOAs 進行交互,幾乎沒有複雜性,創建一個 EOA 也沒有成本。然而,它的簡易性也帶來了顯著的侷限性,因為它們是嚴格確定性的設計。
與 EOAs 相關的一些問題有:
不是每個人都想(或者能夠)一直持有 ETH(看看那價格波動),所以可行的解決方案是要麼允許多種 Gas 貨幣(但這太複雜了,會打破“貨幣”部分描述的多個不變性),要麼允許由不是交易來源賬戶的其他賬戶結算 Gas 費用。
另一方面,合約賬戶(CAs)主要面向開發者和更技術化的用戶群體。它們作為智能合約的載體(即我們認為智能合約是其包含的邏輯或代碼內容),因此可以實現由 EVM 支持的新型交易格式。
然而,儘管具備這些特性,CAs 仍然是被美化的二級賬戶,因為它們沒有自主性。它們有如下一些缺點:
在回顧了導致本小節所定義問題的設計選擇之後,我們現在可以繼續評估提出的解決方案。
賬戶抽象的概念(至少是通過智能賬戶)一直是以太坊路線圖的重要組成部分。傳說中,其實現所涉及的複雜性曾威脅到以太坊的發佈進度,因此它被放棄,取而代之的是當前的設計,不同類型的賬戶提供不同的功能。隨著以太坊將重點轉向“合併”(The Merge),這一概念再次被推遲,而如今它作為網絡下一個重大升級——Pectra 的核心部分重新浮出水面。然而,它的複雜性仍被視為一個重大缺點,導致其無法得到正式確立,尤其是以太坊已經轉向了以 Rollup 為中心的路線圖。
當前的要求可以總結為兩方面:
直觀來看,這一概念在鏈抽象和互操作性的背景下扮演著更重要的角色,但我們在本報告中僅討論實現賬戶抽象的技術舉措。
賬戶抽象旨在將 EOA 和 CA 的最佳特性結合成一種新的賬戶標準——智能賬戶。這種智能賬戶允許完全或部分地將賬戶的有效性規則分離為驗證邏輯和執行邏輯;使賬戶能夠像合約賬戶一樣定義自己的有效性規則——在 EVM 允許的範圍內,同時又能像外部擁有賬戶一樣保持完全的自主性。
常常有人將智能賬戶和智能合約錢包混淆,不明白它們之間的區別,因此我們將在下文明確描述這兩者的差異:
智能賬戶是以太坊賬戶的一種設計理念,旨在實現編程靈活性和自主性的平衡。其理念是, EOA 和 CA 都可以通過某些機制(例如 ERC 4337)變成智能賬戶,這些機制允許它們根據需要用定製的有效性規則替換由網絡強加的有效性規則。
另一方面,智能合約錢包只是作為合約賬戶接口的錢包提供者(是的,錢包並不是賬戶)。
智能合約錢包的商業化推動了 CA 在更廣泛市場的普及,使得技術門檻較低的用戶能夠利用其功能。然而,它們仍然面臨與 CA 相關的固有問題。
回到之前的討論;我們曾討論過用於定義賬戶交易有效性規則的參數:
前四個參數的值可以統稱為賬戶的驗證邏輯,這些驗證邏輯是在交易執行開始之前進行的檢查。
最後一個參數定義了交易執行的方式。
在介紹部分,我們通過對各種提議設計進行某種分類,概述了當前賬戶抽象(AA)領域的整體情況。接下來,我們將重點關注以太坊賬戶困境的第一類解決方案——EOA 可編程性。
以太坊最大的吸引力在於其新興且充滿活力的 DeFi 生態系統,該生態系統包含多種去中心化應用(DApp),它們是主要的流動性匯聚點。多數去中心化應用(DApps)都優化為服務外部擁有賬戶(EOAs),因此難以與合約賬戶(CAs),也就是智能賬戶,進行交互。雖然智能合約錢包在這種情況下可以幫助 CAs,但它們也有自身的侷限性,而且提供的用戶體驗完全不同。
在 DApp 和錢包提供商逐漸適應智能賬戶標準的過程中,正在探索一種過渡性解決方案,即為 EOA 提供臨時增強功能,使其能夠克服大部分限制,無論是驗證邏輯還是執行邏輯。
下面,我們將介紹三項主要的 EIP(以太坊改進提案)規範,這些提案為 EOA 的可編程性提供了可操作的路徑;從較少被關注的 EIP 5806,到雄心勃勃的 EIP 3074,再到最終取得勝利的 EIP 7702。
該提案旨在通過允許外部擁有賬戶(EOA)執行委託調用(delegate call)來擴展其功能,使其能夠調用合約賬戶(CA)的邏輯(即智能合約)。這實際上使得智能合約在調用方 EOA 的上下文中執行,也就是說,EOA 依然掌控驗證邏輯,而執行邏輯則由相應的 CA 的邏輯處理。
在進一步討論之前,讓我們回到 EIP-7,回顧一下以太坊演進的歷史。
EIP-7 提議創建 0xf4/DELEGATECALL
操作碼,用於在調用主賬戶時使用輔助賬戶的邏輯,同時保持主賬戶的 [sender] 和 [value] 字段的值不變。
換句話說,主賬戶“繼承”(或者如果你願意,可以稱為借用)次賬戶的邏輯,並在指定的消息調用期間內執行,這樣次賬戶的邏輯就在主賬戶的上下文中被執行。
這個操作碼使得 DApp 開發者可以將應用邏輯拆分到多個智能合約中,同時保持相互依賴性,從而輕鬆繞過代碼大小和 gas 費用的限制。
那麼,委託調用如何讓合約賬戶(CAs)相互依賴呢?EIP-5806 以 EIP-7 為靈感,提出了將委託調用功能擴展到外部擁有賬戶(EOAs)的建議;也就是說,讓我們允許 EOAs 也與 CAs 互相依賴,因為為什麼不呢。
EIP 5806 引入了一種新的符合 EIP-2718 的交易類型,具體內容如下: rlp([chainID, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, data, access_list, signature_y_parity, signature_r, signature_s])
這些交易設計使得 [to] 字段——表示接收方地址——只能接受 20 字節的地址輸入,從而禁止發送方使用 CREATE 操作碼。
RLP 方案中每個組件的動機如下:
雖然 EIP-5806 交易被封裝在 EIP-2718 信封中,使其在很大程度上兼容舊版,但 EOA 與 CA 並不等同。因此,必須在 EOA 使用委託調用時定義某些限制,以防止破壞不變性。
這些限制主要針對以下操作碼:
EIP 5806 的主要適用場景是外部擁有賬戶(EOAs)的執行抽象。允許 EOAs 無需信任即可與智能合約進行交互,超越簡單的調用合約邏輯,從而為它們提供以下功能:
EIP-5806 提出的變化,雖然啟用了所需的功能,但並不特別創新;它的存在大多基於已經有效的 EIP-7。這使得它可以繞過許多可能的接受障礙。
其中一個早期提出的主要擔憂是,允許外部擁有賬戶(EOAs)像當前的合約賬戶(CAs)一樣訪問並修改存儲數據的潛在風險。這打破了網絡上關於 EOAs 如何進行交易的許多固定規則,因此通過引入前面小節中提到的限制來處理這一問題。
第二個批評(有點像雙刃劍)是 EIP-5806 的簡單性;有一種觀點認為,接受 EIP-5806 所帶來的回報可能不足以彌補其成本,因為它只啟用了執行抽象,而沒有更多的功能。與其他類似的 EIP 相比,接受 EIP-5806 後,所有其他有效性限制仍然由網絡定義,而不是像其他類似提案那樣提供更多的功能。
EIP-3074 提議允許外部擁有賬戶(EOAs)將大部分驗證邏輯委託給專門的合約賬戶,稱為‘調用者(invokers)’,通過將調用者的授權邏輯覆蓋在自己的驗證邏輯上,來處理特定形式的交易。
它通過將其訪問策略的簽名授權給一個 invoker 合約來實現這一點,之後該合約就負責定義 EOA 的訪問策略。
此 EIP 提議向以太坊虛擬機(EVM)中添加兩個新的操作碼:
[authorized]
賬戶,授權該賬戶代表另一個 [authority]
賬戶執行操作。[authorized]
賬戶從 [authority]
賬戶發起/執行調用。這兩個操作碼使得 EOA 可以將控制權委託給一個預先建立的合約賬戶(CA),從而通過該合約賬戶行事,而無需部署一個合約,避免了部署合約所帶來的成本和外部影響。
EIP-3074 允許交易使用 [MAGIC] 簽名格式,以防止與其他交易簽名格式發生衝突。傳遞 [AUTHCALL] 指令的活動賬戶被定義為一個上下文變量字段 [authorized],該字段只在一個交易內存在,並且必須在每次新的 [AUTHCALL] 中重新定義。
在理解每個操作碼的複雜性之前,先來了解 EIP-3074 交易中涉及的實體:
調用者合約接收來自 [authority] 的 [AUTH] 消息及其 [COMMIT] 值;該值定義了賬戶希望對 [authorized] 執行 [AUTHCALL] 指令時施加的限制。
因此,調用者合約負責確保在 [authorized] 賬戶中定義的 [contract_code] 不存在惡意行為,並且能夠滿足由主簽名賬戶在 [COMMIT] 值中定義的不變性。
[AUTH] 操作碼有三個棧元素輸入;簡而言之,它由三個輸入計算一個輸出。這些輸入為:
後兩個輸入用於描述一個從 0 到 97 的可修改內存範圍,其中:
變量 [yParity]、[r] 和 [s] 共同解釋為 ECDSA 簽名 [magic],它基於 secp256k1 曲線和以下消息生成:
[keccak256 (MAGIC || chainID || nonce || invoker address || COMMIT)]
其中:
如果計算出的簽名有效且簽名者地址與 [authority] 相同,[authorized] 字段將更新為 [authority] 提供的值。如果這些要求未得到滿足,[authorized] 字段將保持其先前的狀態,或作為未設置值。
該操作碼的 gas 費用計算為以下各項的總和:
[AUTH] 被設計為不修改內存,並將 [authority] 的值作為參數,因此可以輕鬆驗證其簽名。
[AUTHCALL] 操作碼
[AUTHCALL] 操作碼有七個棧元素輸入,用於計算一個棧元素輸出。其邏輯與 [CALL] 操作碼相同;即,它用於向賬戶發送消息調用並觸發其合約中的特定邏輯。唯一的不同之處在於, [AUTHCALL] 被設計為在執行前先設置 [CALLER] 的值。
因此, [AUTHCALL] 由 [authority] 用來在 [authorized] 中觸發特定上下文的行為,執行過程中的邏輯檢查如下:
[AUTHCALL] 的 gas 費用由以下部分組成:
[AUTHCALL] 返回的數據通過以下方式訪問:
為了簡化技術細節,通常以兩種方式指定以太坊交易的值:
在 EOA 中,如前所述,授權與執行緊密結合,即(tx.origin == msg.sender)。這一簡單的不變性導致了報告中“賬戶與交易有效性”小節所討論的大多數問題。
[AUTH] 消息來自 [authority],允許將 tx.origin 功能偏移到 [authorized],而保持 msg.sender 不變。它還允許使用 [COMMIT] 值定義對這一權限的限制。
[AUTHCALL] 允許 [authorized] 訪問合約邏輯,通過 [invoker] 作為中介,確保其訪問的合約無害。也就是說,每個 [AUTHCALL],[authorized] 必須為其 [COMMIT] 指定一個特定的 [invoker]。
EIP-3074 主要用於允許 EOA 將其授權邏輯委託給不同的賬戶,但其開放設計在不同的上下文中能夠實現更多功能。
EOA 的整個驗證邏輯可以通過應用必要的約束/創新來抽象化,基於目標邏輯的一些可能設計包括:
正如其一位作者所言:“我不希望錢包暴露出可以授權任意調用者的功能…”。EIP-3074 所帶來的最大問題之一是,在其基礎上創新可能很容易導致許可化和專有的交易流程,就像當前以太坊的 MEV 和 PBS 市場的演變一樣。
默認情況下,調用者合約需要經過廣泛的審計,以防止比目前更嚴重的攻擊。這不可避免地會導致一個生態系統,其中只有少數由有影響力人物開發的調用者合約會被錢包開發者作為默認選項採用。因此,這就變成了一個權衡問題:是在不斷審計和支持調用者合約的過程中,承擔用戶安全風險,還是選擇採用來自已建立和信譽良好的來源的調用者合約,這些合約對用戶安全有更好的保障,同時對合約安全的監督較少。
這一點的另一個方面是,與設計、審計和推廣一個功能性和安全的 invoker 相關的成本問題。較小的團隊幾乎總是會被更大的組織超越——尤其是在營銷方面——即便他們的產品更好,較大的組織由於已有一定的聲譽,通常更容易獲得成功。
EIP-3074 使 ECDSA 簽名機制更加根深蒂固,因為它仍然被認為比通過 invoker 引入的授權機制更有效。儘管有一些觀點認為量子抗性目前不是一個確定的問題,而且在未來 ECDSA 可能被攻破的情況下,實際上面臨的風險更大;以太坊的目標通常是始終走在這些問題前面。為了獲得在用戶體驗上的微小改進,可能犧牲量子抗性和審查抗性,並不是近未來的最佳選擇。
關於向前兼容性的問題,在 EIP-3074 的好處尚在評估時,ERC-4337(無需任何協議更改)已經取得了一個良好的市場,因此你也必須兼容它,以避免生態系統的隔離。而且即使在本地賬戶抽象的路線圖中,[AUTH] 和 [AUTHCALL] 操作碼最終會在 EVM 中變得過時,給以太坊帶來大量的技術債務,來換取用戶體驗的微小改善。
在發送 [AUTH] 消息並委託控制後,EOA 必須避免使用常規的私鑰授權方案,因為發送“普通”交易會導致其委託給每個調用者的授權被撤銷。
因此,ECDSA 方案仍然優於任何其他授權方案,意味著私鑰丟失會導致賬戶資產的完全喪失。
該提案最初作為 EIP 3074 的一個簡化變種提出,甚至旨在作為其更新版本。它的誕生是為了應對 EIP 3074 的一些效率問題,特別是它與已經蓬勃發展的 4337 生態系統以及原生賬戶抽象提案 RIP 7560 的不兼容性問題。
它的設計方法是引入一種新的符合 EIP 2718 的交易類型——[SET_CODE_TX_TYPE],使得 EOA(外部擁有賬戶)能夠在指定交易中表現為智能賬戶。
此設計不僅實現了與 EIP 5806 相同的功能,還提供了更多功能,同時與原生賬戶抽象路線圖和現有提議保持兼容。
EIP-7702 允許 EOA 通過 [SET_CODE_TX_TYPE] 2718 規範交易導入合約的代碼內容,交易格式為:
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, destination, value, data, access_list, authorization_list, signature_y_parity, signature_r, signature_s])
此負載與 EIP 5806 非常相似,唯一的不同是它引入了一個“授權列表”。該列表是按順序排列的值,格式為:
[[chain_id, address, nonce, y_parity, r, s], ...]
其中每個元組定義了 [address] 的值。
在進行下一步操作之前,涉及 [SET_CODE_TX_TYPE] 的各方為:
當 [authority] 簽署一個指定 [address] 的 [SET_CODE_TX_TYPE] 時,便會創建一個委託設計者。這是一個“指針程序”,它使得所有由於 [authority] 的操作而導致的代碼檢索請求都會被引導到 [address] 可見的代碼中。
對於每個 [chain_id, address, nonce, y_parity, r, s] 元組,7702 類型交易的邏輯流程如下:
authority = ecrecover(keccak(MAGIC || rlp([chain_id, address, nonce])), y_parity, r, s)
驗證 [authority] 的簽名。簡而言之,這個 EIP 允許 EOAs 發送交易,設置指向合約代碼的指針,使它們在後續交易中能夠實現此邏輯。因此,它比 EIP 5806 更強大,因為它允許 EOAs 持有代碼內容,直到它們希望為止(而 EIP 5806 僅允許 EOAs 發送委託調用)。
雖然可以爭論說它不再是一個抽象,因為 EOA 積極地選擇它希望執行的邏輯,但它仍然不是該邏輯的‘主要擁有者’。此外,它並不直接包含邏輯,而只是指定了指向邏輯的指針(以減少計算複雜度)。所以我們仍然稱之為執行抽象!
儘管 require(msg.sender == tx.origin)
不變式被打破以允許自我贊助,但該 EIP 仍然允許集成贊助交易中繼。需要注意的是,這些中繼需要一個基於聲譽或股份的系統來防止惡意攻擊。
EOAs 只能指向賬戶代碼的特定部分,從而使得只有該部分的邏輯可以在其上下文中執行。
這還使得子密鑰的存在成為可能,從而實現“權限降級”,確保特定的 dApp 僅在特定條件下能夠訪問賬戶餘額。例如,你可以設想一個權限,允許支出 ERC-20 代幣但不允許支出 ETH,或者每日至多支出總餘額的 1%,或僅與特定應用交互。
由於其非限制性的性質,EIP-7702 交易可以允許用戶訪問 CREATE2 操作碼,並使用它將字節碼部署到某個地址,而無需其他限制性參數(如費用市場邏輯,例如 EIP-1559 和 EIP-4844)。這使得該地址可以在多個狀態機中恢復並使用相同的字節碼,其中每個鏈上的賬戶負責定義其他上下文變量參數。
儘管 EIP-7702 仍然非常新,但其依賴項和潛在缺點已經進行了大量原型設計和測試。由於其極簡主義的模型,它在不同的上下文中具有很大的靈活性和實用性。然而,它打破了許多不變式,並且不立即向後兼容。
其中的一些邏輯包括:
* **交易中途 EOA nonce 修改**:EIP-7702 不限制任何操作碼,以確保一致性。這意味著 EOA 可以在執行 EIP-7702 交易時實現 CREATE、CREATE2 和 SSTORE 等操作碼,從而允許其 nonce 在不同的上下文中增加。
* **允許非零 codeHash 值的賬戶作為交易發起者**:EIP-3607 的實施是為了減少 EOA 和 CA 之間的“地址碰撞”潛在影響。地址碰撞發生在 EOA 的地址與 CA 的地址完全相同時。大多數用戶對賬戶的實際內容(甚至對賬戶和地址之間的區別)並不熟悉,因此允許地址碰撞意味著 EOA 可以偽裝成 CA,吸引用戶資金並最終竊取這些資金。EIP-3607 通過規定包含代碼的賬戶不能使用自己的授權邏輯來花費其餘額來解決這個問題。然而,EIP-7702 打破了這一不變式,使得即使獲得了一些可編程性,EOA 仍能保持自主性。
簽署賬戶地址而不是其代碼內容實際上類似於 3074 中使用的調用者方案。它沒有提供嚴格的跨鏈代碼內容一致性保證,因為一個地址在不同鏈上的代碼內容可能不同。這意味著一個在某條鏈上包含相同邏輯的地址,在另一條鏈上可能是掠奪性或完全惡意的,這可能導致用戶資金的損失。
目前的 EOA(外部擁有賬戶)形式受限,無法讓用戶充分利用 EVM 提供的可編程功能。雖然我們在本報告開始時概述了多種升級賬戶的路徑,但選擇的解決方案必須保持安全、可靠的自主管理原則。此外,EOA 升級可能會顯著影響用戶體驗和應用開發者,因此必須考慮所有利益相關者的聲音。
允許 EOA 以任何方式執行代碼極大地擴展了賬戶的功能,但這種新型的可表達性也帶來了實際的風險和可能的盲點。解決這些權衡對於為以太坊用戶提供一個無可爭議的更好用戶體驗(UX)至關重要。
以太坊的開放討論文化使其成為這種創新的絕佳試驗場,因為幾乎每個設計的每個影響都被領域專家徹底解構。這樣的全面考慮有助於減輕來自對手的不當行為風險。
EIP-7702 目前是將 EVM 可編程性引入 EOA 的典型機制,被視為替代 EIP 3074 在 Pectra 升級中的位置。它繼承了 3074 機制的開放設計,同時大幅降低了攻擊面和風險。它還通過避免 3074 對某些操作碼類別的限制,實現了更多功能。
儘管該提案的設計仍在進行一些完善,但它已經獲得了開發者的大量支持,尤其是因為它得到了 Vitalik 的支持。
在社區中,有觀點認為這種賬戶抽象方式可能比智能賬戶更優。這一評論強調,這種方式需要更少的變動,且不如智能賬戶複雜,同時 EOA 已經得到認可。然而,我們必須牢記以太坊網絡各層級未來的量子抗性安全目標。由於 EOA 授權使用基於 ECDSA 的簽名方案,當前賬戶模型核心無法實現這一量子安全性。
因此,EOA 的可編程性應被視為邁向智能賬戶的一個步驟,而非終點。它為 EOA 提供了更強大的功能,提升了用戶和開發者體驗,同時與最終的智能賬戶目標保持兼容。
在我們的下一個報告中,我們將深入探討 EOA 遷移方案,看看它們在賬戶抽象路線圖中的適配程度,敬請關注!