以太坊帳戶抽象和 ERC-4337
作者:鹿目圓,IOBC Capital
以太坊系統中實際存在兩種類型的帳戶:
一種是由私鑰控制的外部帳戶(externally-owned account,EOA),比如我們所使用的錢包中的帳戶,這類帳戶都有自己的餘額。擁有者可以通過創建和簽名一筆交易從自己的外部帳戶發送消息;
另一種是由部署到區塊鏈上的代碼控制的合約帳戶 (contract account),由存儲在智能合約帳戶(有時也被稱為智能錢包)內的以太坊虛擬機代碼控制。當合約帳戶收到信息時,其內部代碼就會被激活,並允許它對內部存儲進行讀取和寫入以及創建新合約等操作。
按照目前的以太坊協議,只有外部帳戶才可以發起交易,並且僅允許帳戶的所有人修改其帳戶狀態。
什麼是帳戶抽象化?
帳戶抽象是對以上兩種帳戶的一種改進,嘗試模糊二者之間的界限,變成一種包含複雜邏輯的通用性帳戶,使帳戶可以同時擁有合約帳戶和外部帳戶的功能。
這種做法相當於讓用戶按照合約帳戶的格式來定義外部帳戶,用戶可以在智能合約錢包中包含任何邏輯驗證。由密鑰控制的帳戶也可以獲得代碼的支持。
帳戶抽象化的各種方案
一直以來,實現帳戶抽象化都是以太坊開發者社區的願景。社區也提出了各種各樣的方案,如:EIP-86,EIP-2938等。
EIP-86 是為帳戶抽象做技術準備,它定義了一種新的帳戶類型,允許用戶創建基於智能合約的帳戶。
以太坊協議本身要求將所有內容打包到源自 ECDSA 安全的外部帳戶 (EOA) 的交易中,每個用戶操作都需要由來自 EOA 的事務包裝,這會產生 21000 gas 的費用。用戶需要在單獨的 EOA 中擁有 ETH來支付gas。
EIP-86提出的帳戶抽象帶來新類型的事務,與傳統事務必須有一個 EOA 作為發送者相比,這些事務沒有發送者。這種事務破壞了事務哈希的唯一性。EIP-86原計劃於 Metropolis 階段升級,但由於前面所說的問題,開發者決定在 Metropolis 中暫緩引入。
EIP-2938提供了一種帳戶抽象化解決方案,通過更改一部分以太坊協議,允許合約帳戶與外部帳戶一樣可以發起交易。但是由於這個方案需要在共識層進行以太坊協議的更改,所以並沒有得到廣泛的接受。
後來提出的新的協議ERC-4337則提供了一種無需更改共識協議的方案試圖達到與EIP2938同樣的效果,這種安全性更高的實現方式目前在社區中得到了更多的關注。
ERC-4337如何實現?
ERC-4337沒有試圖修改協議共識,而是在系統中複製了mempool的功能。
用戶發送一個用戶操作(UserOperation)對象,這個對象中包括了用戶的意圖、簽名和其他數據。用戶操作有一個單獨的 mempool 存儲池,連接到這個存儲池的節點會進行 ERC-4337 特定的驗證,以過濾操作來確保他們只收到支付費用的操作。
由礦工或使用Flashbots服務的打包者批量收集這些用戶操作,打包成單筆捆綁交易(bundle transaction) ,並納入以太坊區塊中。打包者為以太坊中的捆綁交易支付gas fee,並收取每個單獨的UserOperation所支付的費用進行補償。打包者將使用費用優先級邏輯選擇包含哪些UserOperation對象。
其中的用戶操作UserOperation 看起來像一個事務,但它是一個 ABI 編碼的結構,包括了以下字段:
1、發件人:進行操作的錢包;
2、nonce 和 signature:傳遞給錢包驗證函數的參數,以便錢包可以驗證操作;
3、initCode:如果錢包尚不存在,則用於創建錢包的初始化代碼;
4、callData:用於實際執行步驟調用錢包的數據。
而每一個錢包都是一個智能合約,必須包括兩個功能函數:
1、validateUserOp,它接受一個 UserOperation 作為輸入。這個函數應該驗證UserOperation裡的簽名和nonce,如果驗證成功則支付費用並增加nonce,如果驗證失敗則拋出異常;
2、op執行函數,將calldata解析成錢包執行操作的一個或多個指令。
ERC-4337帶來的變化
如果該提議被普遍採用,簽名驗證轉移到了以太坊虛擬機(EVM)上,validateUserOp函數添加了任意簽名和隨機數驗證邏輯,使驗證邏輯變得更加靈活。
如此一來,簽署交易之時就能採用新的密碼學工具,錢包也可以提供一些新的功能,比如:
- 多重簽名;
- 社交恢復;
- 更高效、更簡單的簽名算法(例如 Schnorr、BLS);
- 後量子安全簽名算法(例如,Lamport、Winternitz);
- 可升級錢包。
這種方案還打開了各種其他交易許可管理,比如允許交易通過智能合約來支付gas費。
在目前,外部錢包要在以太坊上交互的gas fee只能通過錢包中的ETH來支付,如果你的錢包中只有ERC-20代幣,沒有ETH,你將沒有辦法將這些代幣轉出。當ERC-4337採用後,用戶可以使用帳戶中的ERC-20代幣來支付費用,由礦工節點用合約作為中介來代為支付ETH上鏈並獲取用戶的ERC-20代幣。
抽象化實現後,由外部帳戶的所有者簽名交易並進行廣播將不再是發起交易的唯一方法。這將為以太坊充當元交易的中繼者帶來可能。目前許多以太坊上的應用都需要依靠中繼者在區塊鏈上發布用戶交易,並向中繼者支付費用。如果錢包中可以內置更複雜的合約,有些中繼者就不再有存在的必要,也就不需要向他們支付額外的費用。
雖然有很多優點,但是新方案也同樣面臨一些問題。
最突出的一點就是更高的Gas成本,基本的ERC-4337操作約需要42000 gas,而常規交易需要 21000 gas,原因如下:
1、需要支付大量的單個存儲讀/寫成本,在 EOA 的情況下,這些成本會捆綁到一筆 21000 gas 的付款中:
(1)編輯包含 pubkey+nonce (~5000) 的存儲 slot;
(2)用戶操作調用數據成本(約 4500,通過壓縮可減少到約 2500);
(3)ECRECOVER (~3000);
(4)首次訪問錢包本身 (~2600)
(5)首次訪問收款人帳戶 (~2600)
(6)將 ETH 轉入收款人帳戶 (~9000)
(7)編輯存儲以支付費用(~5000)
(8)訪問包含代理 (~2100) 的存儲 slot,然後訪問代理本身 (~2600);
2、除了上述存儲讀/寫成本之外,合約還需要執行 "業務邏輯"(解包 UserOperation、對其進行哈希、洗牌變量等)
3、需要消耗 gas 來支付日誌費用(EOA 不發布日誌);
4、一次性合約創建成本(約 32000 gas,加上代理中每個 code byte 200 gas,再加上設置代理地址的 20000 gas)
簡而言之,帳戶抽象地址的每一步都需要計算,需要消耗更多的資源,也增加了額外的費用。
好在這並不是無解的。
由於Rollup擅長進行數據壓縮,與數據複雜的帳戶抽象方案具有天然的契合點。
在Vitalik最新的提案中,提出了通過layer 2來處理帳戶抽象化產生的數據。其改進點在於,將只能分步驟實現的功能打包成批交易,同時用SNARK技術來保證交易有效性。
通過將ERC-4337與Rollup技術結合,可以在帳戶抽象化中實現數據壓縮和降低gas成本的效果,更好地發揮帳戶抽象的優勢。
結語
在以太坊重點發展Layer 2的格局已定的現在,Vitalik對以太坊升級的後續計劃開始轉向帳戶抽象。最新的提案中展示了rollup+帳戶抽象的技術路徑。各個Rollup提供商也推出了兼容帳戶抽象的新版本。
今年6月,zkSync發布V2更新信息:增添"帳戶抽象"功能,增加與以太坊EVM的兼容性。10月,ERC-4337發布了新版本,添加了包括 BLS 簽名算法的簽名聚合功能。簽名聚合能夠讓構建者和批次提交者也能聚合簽名(例如 BLS、SNARKs),大大減少鏈上數據,可為 rollups 降低數據成本。
我們有理由相信,帳戶抽象帶來的變化同樣蘊藏著生態爆發的可能性。隨著Rollup的發展,可以與Rollup進行結合的帳戶抽象化一定也能發展出更優更精細的方案。