從 4337 到 7702:深入解讀以太坊帳號抽象賽道的過去與未來
作者:十四君
前言
本文整體分兩大模塊:
上半段,將從2015年起的首個AA提案出發,系統整理目前為止的Eip提案主要內容,期望由史出發挖掘AA歷史提案的歷程,並綜合性評價各方案優缺點。
下半段,著重對比EIP4337提出之後面臨的市場低迷反饋,再深入分析如今即將被納入下個版本以太坊升級的EIP7702,此提案一旦合併,將全方位改變鏈上應用形態。
EIP-7702 具有劃時代的改變,且聽十四君細細講來
1、帳號抽象的背景
1.1 帳號抽象的意義定位
以太坊創始人vitalik在2023年年底再次更新 ETH 發展路線圖,但其中針對帳號抽象的設定,並未改過。如今的主流模式也正是從EIP-4337,步入到下個階段VoluntaryEOA Conversion(自願轉換EOA帳號)。
https://x.com/VitalikButerin/status/1741190491578810445
在EIP4337推出一年多以來(在2023.3.1號丹佛的 WalletCon 上,官宣由以太坊基金會開發人員設計實現的ERC-4337 的核心合約已經通過了 OpenZeppelin 的審計,被認為是正式推出的歷史節點)。
始終是只得到用戶的廣泛認可,但並不被廣泛使用,如此矛盾的市場環境下,讓EIP-7702的進度被大幅提前,乃至已經被確認將在下一次升級被合併其中。
1.2 帳號抽象的市場現狀
無需多言,直接看數據吧。
經過一年半的發展,EIP4337在主流鏈帳號的集合下,僅僅有1200W的地址數,其中最為讓人驚訝的是在以太坊主網上,活躍地址僅僅6,764個,或許統計維度有所問題,但至少與EOA與CA的地址數相差甚廣,要知道以太坊主網上獨立地址數已經達到2億7千萬(數據源於:https://etherscan.io/chart/address)。
可以說在主網上EIP4337是毫無實質性發展。
(圖表數據來源:https://dune.com/niftytable/account-abstraction)
不過,這並不磨滅AA的本質價值,因為他從一開始的EIP4337的設計就注定了,他面對主網嚴重的往前兼容性問題上無法做好,所以伴隨著各類L2層鏈的普遍嵌入原生AA,EIP4337的地址數在L2上獲得爆發,其中base和polygon鏈的7月月度活躍用戶分別是100W和300W,倒也頗為可觀。
所以,並不是EIP4337設計錯了,他有很多優點,我們一會會系統的總結,如今的現狀是源於主網與L2之間的差異,他們需要用各自適合的方案。
2、帳號抽象是什麼?
帳號抽象,聽著很費解,但其實本質解決的是產權分離的問題。
EVM架構(即以太坊虛擬機)中有兩種帳號,外部帳號(EOA)和合約帳號(Contract Account),外部帳號的所有權和簽名權其實是同一個體單位持有的。持有私鑰的人不只擁有這個帳號的「所有權」,同時還有權利「簽名轉移所有資產」。
這是由以太坊帳號交易結構決定的
從下圖的結構中可以發現,其實以太坊的標準交易是沒有From方的,那麼我做了一次資金轉帳,具體消費的是什麼地址上的資金?實際是是通過其VRS參數(即用戶簽名)反解析出From地址的。
這裡涉及到ECDSA等非對稱加密,單向門檻函數等概念,咱們不做展開,總之這裡是由密碼學來保障安全性,當然這也就造成了如今的產權合併的EOA地址窘境。
而EIP4337的核心效果,就是在交易字段裡增加了Sender Address字段,從而能讓私鑰與被操作的地址分離開。
那為什麼產權分離這麼重要呢?
因為外部帳號(EOA)設計會衍伸出更多的問題:
私鑰難保護:用戶失去私鑰(遺失、黑客攻擊、密碼學上的被破解)意味著失去所有資產。
簽名算法少:原生協議在驗證交易上只能使用 ECDSA 簽名和驗簽算法。
簽名權限高:無原生多簽(多簽只能通過智能合約實現協作),單簽即可執行任意操作。
交易手續費只能通過 ETH 支付,並不支持批量交易。
交易隱私泄露:一對一交易容易分析帳號持有者的隱私信息。
上述的約束讓普通用戶很難使用以太坊:
首先,使用以太坊上的任何應用,用戶都必須持有以太(並承擔以太價格波動的風險)。
其次,用戶需要處理複雜的費用邏輯,Gas price、Gas limit、事務阻塞(Nonce順序)這些概念對用戶來說過於複雜。
最後,雖然許多區塊鏈錢包或應用試圖通過產品優化提高用戶體驗,但它們的實際效果甚微。
所以破局之道在於實現帳號抽象,將所有權(Owner)和簽名權(Signer)解耦(Decoupling),從而才能逐個解決上述問題。
其實歷史的方案有很多,最終都會匯聚到兩種路線
3、AA歷史提案脈絡梳理
問題的解法看似有很多的EIP提案,但歸根究底,就是兩種核心思路,所以過往每一個沒有被通過的EIP,其考慮的問題也就匯聚成了現在方案的破局之道。
3.1 第一種路線是讓EOA地址變為CA地址
早在2015年11月15日,圍繞EIP-101,Vitalik 就提出以合約作為帳號的新結構。將地址改為只有代碼和存儲空間,改變手續費支持由ERC20支付,通過預編譯合約將原生代幣改為類ERC20來存餘額(可具備代扣授權等功能),將交易字段精簡到只有to、startgas、data和code。
現在看來,簡直是大躍進式變革,會大幅改動底層設計,讓每個帳號地址都擁有自己的"代碼"邏輯(其實也正是現在EIP-7702要做到的效果)。
還能衍生出其他的功能,比如
讓交易使用更多加密算法,可以由各地址內部Code來指定驗簽鑑權方法
具備抗量子攻擊特性,因為代碼具備升級特性。
讓以太幣具備與ERC20合約一致的功能特性,核心效果有了代扣授權,從而無需原生幣的損耗
提升帳號的自定義空間,兼容社交恢復、sbt支持、密鑰找回等
沒有繼續推進的原因也很簡單,顯然是步伐太大,對於當前交易哈希衝突問題,安全性隱患考慮不周所以一直擱置,但每個優點的理念都成為後續EIP4337以及EIP7702的核心功能之一。
後來還有一系列EIP試圖完善這種邏輯
EIP-859:主鏈帳號抽象--2018-01-30
試圖解決Code的部署問題,核心作用是,如果出現了若交易方合約未部署,則使用交易附帶code參數執行合約錢包部署,其次還提出新的 PAYGAS 操作碼,除了支付gas外,也成為一筆交易的參數中驗證部分與執行部分的分隔符。
雖然當時無疾而終,但是這也成了現在EIP7702的核心邏輯之一,EIP7702的每一筆交易結合特殊的交易結構,可以附帶一定的代碼,從而在本次交易中讓EOA地址擁有合約能力。
EIP-7702:設置 EOA 帳號代碼 2024-05-07
這也是本文後續討論機制的核心EIP,由Vitalik 發表了 EIP-7702 作為 EIP-3074 的替代方案(2024-05-07)。因此EIP-3074 被棄用,EIP-7702 被確定在即將到來的 ETH Prague/Electra(Pectra)硬分叉中納入,具體內容咱們在下文展開。
3.2 第二種路線是讓EOA地址驅動CA地址
EIP-3074:增加AUTH 和AUTHCALL 操作碼--2020-10-15
在EVM 中加入兩個新的OpCodes AUTH 和 AUTHCALL ,讓EOA 能透過這兩個opcode 授權合約代替EOA 的身份去呼叫其他合約。
結合下圖,概括來說一個EOA 能將一則已簽的消息(交易)送至自己信任的合約(稱作Invoker)上,此Invoker合約可以利用 AUTH 和 AUTHCALL 操作碼來代替這個EOA 送出這筆交易。
EIP-4337:用交易內存池實現帳號抽象--2021-09-29
這方面我之前已經有很多文章深入分析其機制,可拓展閱讀:
https://research.web3caff.com/zh/archives/3212,
總之,他受到MEV的啟發進行設計,其核心價值是可以完全避免共識層協議更改。
eip4337提出新的事務對象UserOperation,用戶將此對象發送到內存池中,由bundlers從礦工維度批量打包交付合約執行交易事務,本質上是把底層的交易與帳號運作拉到合約層面執行。
EIP-5189:通過背書人來操作抽象帳號---2022-06-29
這算是優化了EIP4337的邏輯,是面對惡意的Bundler 通過建立資金罰款背書endorser的機制來防止Dos阻塞攻擊。
3.3 其他用於支持AA的提案
EIP-2718:新交易類型的包裝信封--2020-06-13
這倒是一個已經Final的提案,他定義一個新的交易類型,作為未來新增的交易類型的信封。
最終效果是,當引入新的交易類型時, 透過特定編碼來區分這是哪一種交易,讓其只需有向後兼容性,而無需往前兼容。最常見的例子就是EIP1559了,他區分了交易的手續費,使用了新的交易類型編碼,又不影響最初的legacy的交易類型。
EIP-3607:讓EOA地址不可部署合約--2021-06-10
這是AA路徑上的補充方案,用於防止合約部署地址與EOA地址衝突的問題。他會控制合約生成方法,讓系統不允許將代碼部署到已經是 EOA 地址的地址上。這個風險其實很小,畢竟以太坊地址有 160 位長,雖然存在用私鑰碰撞出指定合約地址私鑰的方法,但以比特幣全算力投入估計,也還需要一年的時間。
3.4 如何理解帳號抽象發展歷程?
首先需要理解轉為CA後的價值
基本上也就是EIP-4337的實際效果,他可以實現
但是,EIP-4337的核心缺點是違背人性動機原則。
他看起來是更好了,但是陷入了一種市場發展的死循環,Dapp很多還不兼容,那用戶就不樂意使用CA地址,甚至使用CA有更高的交易成本(普通轉帳場景,也會交易費用翻倍),也太依賴於Dapp本身的兼容性。
所以在以太坊主網上迄今為止始終沒有得到普及。
成本就是用戶最重要衡量的標準,必須降低成本。
但是要真正降低GAS,就必須以太坊本身做軟分叉升級,修改GAS計算或者修改操作碼的GAS消耗等模塊,然而既然要軟分叉,那何不直接考慮EIP-7702呢?
4、全面解析EIP-7702
4.1 EIP-7702是什麼
它通過新的交易類型來區分,可以允許EOA在單筆交易中臨時具備智能合約的功能,進而支持業務上進行批量交易、無Gas交易和自定義權限管理等,且無需引入新的EVM opCode(影響往前兼容性)。
他可以讓用戶在不部署智能合約的情況下,就可以獲得大部分AA的能力,甚至可以提供第三方代用戶發起交易的能力,且不需要用戶提供私鑰,只需簽名授權的信息。
4.2 數據結構
他定義了新的交易類型0x04,該交易類型的TransactionPayload 是下列內容的RLP編碼序列化結果
- rlp([
chainid, //鏈ID,用於防止重放攻擊。 nonce, // 交易計數器,確保交易唯一性。 maxpriorityfeepergas, //1559交易費用 maxfeepergas, //1559交易費用
gaslimit, destination, //交易目標地址 value, data, accesslist, //訪問列表,用於EIP-2929中的Gas優化。
authorizationlist, signatureyparity, // 3個簽名參數,用於驗證交易簽名。 signaturer,
signature_s
])
重要的是其中新增了authorization_list對象,存儲簽名者希望在其EOA中執行的代碼,用戶簽署交易的同時也簽署要執行的合約代碼,他作為二維列表存在,說明可以批量存放多個操作信息,執行批量操作。
- authorizationlist = [[chainid, address, nonce, y_parity, r, s], …]
4.3 交易生命周期
4.3.1 驗證階段
在執行交易的開始階段,對於每個authorizationlist的 [chainid, address, nonce, y_parity, r, s] 元組:
從簽名r、s中採用ecrecover恢復出簽名者地址(注意這是以太坊本身的機制,所以該EIP沒有改變簽名算法)。authority = ecrecover(keccak(MAGIC || rlp([chainid, address, nonce])), yparity, r, s](與之前解簽名得出from地址類似,這裡得出的是針對這個list的局部簽名地址)
驗證鏈ID(防分叉鏈重放)。
驗證authority簽名者的代碼是否為空或已經委託(驗證交易是否屬於有效7702交易,後續會通過delegation機制去代理執行交易)。
驗證authority簽名者的nonce(防authority的簽名重放)。
設置authority簽名者的代碼為 0xef0100 || address(用於繞過EIP3607防碰撞策略的)
增加authority簽名者的nonce(防局部簽名重放)。
將authority簽名者帳號添加到已訪問地址列表中(轉熱地址,降低查詢存儲的gas費)
4.3.2 執行操作階段
要執行的合約代碼以及操作指令在哪裡?
"新"版本僅更改了代碼部署方面的行為。
它不再將帳號代碼設置為contractcode,而是從authorizationlist中檢索代碼address並將該代碼設置為帳號代碼。
所以,當需要執行授權代碼時,從authorization_list的 address字段指定的地址加載代碼,並在簽名者帳號的上下文中執行。
這意味著用戶的合約代碼實際上是存儲在鏈上的某個特定地址,而不是直接包含在交易中。
而操作指令和相關參數則存儲在交易負載的data字段中。
4.4 EIP-7702有什麼價值?
他對於Web3錢包的全鏈路都會有變化,用戶體驗也因此巨變,因為EOA發起的普通交易也可以類似合約執行多種邏輯,比如批量transfer。對於CeFi場景會影響交易鑑別,也影響沖提歸集手續費
由於其出現,打破了很多曾經的定勢,比如:
打破了帳號餘額只能因源自該帳號的交易而減少的不變量。
打破了交易執行開始後 EOA nonce 增加1的不變量(可能同時增加多個)。
打破了tx.origin和msg.sender兩個比對的防護邏輯,很多過往的合約有風險了。
打破了EOA本身無法發出事件的現狀,對部分鏈上事件識別監聽可能需要注意。
打破了EOA地址接受ERC20、721、1155等資產必然成功的現狀(因為回調機制,可能失敗)
4.5 對比EIP-7702和EIP-4337
- EIP-7702的優勢
gas更低,因為無需經過entrypoint模塊,減少鏈上操作。
用戶遷移成本更低,無需提前部署鏈上合約作為主體
與Eip4337相比,同樣會有代碼委託執行,也同樣會有兩種方式:
完全委託(Full Delegation)
- 完全委託是指將某個操作的全部權限委託給一個特定地址。例如,用戶可以將所有ERC-20代幣的管理權限委託給一個智能合約地址,從而使得這個智能合約可以代表用戶執行所有相關操作。
受保護的委託(Protected Delegation)
受保護的委託是指在委託的過程中增加一些限制和保護措施,確保委託操作的安全性和可控性。
例如,用戶可以僅將部分ERC-20代幣的管理權限委託給一個智能合約,或者設置一些限制條件(如每天最多花費總餘額的1%)。
- EIP-7702的缺點
他的核心缺點是屬於軟分叉升級,需要大家共識推動,並且改動巨大,對鏈上生態影響太廣,十四君初步評估下來,就有以下挑戰,但是挑戰也就是市場的機會:
自由度極高,難以被審計,用戶會更需求靠譜的錢包承擔安全防護的保護。
對原架構變化過大,雖然用不同交易類型區分,但是很多基建尤其鏈上不可改合約都無法直接適配。
對EOA地址提供了合約能力,但對應的存儲空間無法留存。
單獨交易的成本稍微提高,因為會大量增加Calldata的部分,估算調用的總成本將是16(gas) * 15(字節) = 240(gas)calldata 成本,加上EIP-3860的成本2 * 15 = 30,再加上大約的運行時成本150。因此,僅僅準備帳號哪怕什麼都不做,就要增加500的Gas了。
"如果接收者簽署了沒有接收功能的代碼,發送者在嘗試發送資產時可能會面臨 DoS。" 見案例。這個問題其實是 EOA A 簽署了它不應該簽署的東西------一個設置了錯誤實現(沒有receive())的可重放文件。
鏈上沖提邏輯可能不一致,比如當轉移 ERC-20 代幣時,如果接收方帳號有代碼,則代幣合約將調用onERC20Received接收方帳號。如果onERC20Received還原或返回錯誤的值,則令牌傳輸將還原。
另外如果 EOA 可以發出事件,會不會有什麼問題?一些基礎設施可能需要注意。
這些還只是十四君基於目前EIP7702提案內容,以及對應的官方論壇討論總結出的一些缺點,最終還需要基於最終的實現代碼才能分析完全。
參考如下:
- https://eips.ethereum.org/EIPS/eip-7702
https://ethereum-magicians.org/t/eip-set-eoa-account-code-for-one-transaction/19923
https://github.com/ethereum/EIPs/pull/8527
5、 全文總結
本文看似篇幅宏大,實際上文字內容只有6k餘字,中間涉及的很多往期EIP解讀,都在文中鏈接可以拓展,我就不進而追溯了。
目前看,帳號抽象,確實只能放在第六模塊,即修復一切,也即最後在推行,如今大幅加快EIP7702的進度,更多帶來的還是對系統安全性的挑戰,可以預料到,最終他會實現,畢竟以太坊合併,修改共識算法這樣的顛覆性事件都可以發生,又談何區區新的交易類型呢。
但是這一次顛覆的內容太多了,打破多個鏈上不可能的潛規則,也打破了大多數Dapp的應用邏輯,但是他死死的佔住了最核心的一點,就是用戶的成本更低了!對比EIP4337近乎翻倍的交易成本而言。
用戶本身還是EOA地址,只是在需要的時候才去驅動和使用CA邏輯,所以持有成本低了。無需先轉換出鏈上CA身份再做操作,等於用戶無需註冊了。
用戶可以輕鬆用EOA做到多交易並行,比如授權代扣和執行代扣兩種合一,這樣對用戶交易成本本身就低了,而對於Dapp而言,尤其是需要做鏈上企業級管理的項目方,比如交易所等更是顛覆性的優化,批量歸集一旦原生實現,基本交易所成本可以瞬間減少一半以上,最終也可以惠及用戶。
所以,雖然他改變了很多,但佔據成本這個維度,就值得全部Dapp去研究和適配,因為這一次,用戶必然站在了EIP7702的一邊。