作者:Alfred,imToken Labs 開發者
2024 年7 月8 日至11 日,以太坊社區會議(EthCC)在比利時布魯塞爾舉行,這是歐洲規模最大的以太坊年度活動,重點關注技術和社區。
本屆以太坊社群會議(EthCC 7)共有超過350 名活躍在區塊鏈產業一線的意見領袖發表演講,imToken Labs Alfred 受邀參與,並在大會上發表主題為「揭示未來:多鏈帳戶抽象解析”的演講。
演講概要速覽:
- 帳戶抽象化(AA)主要包括兩個關鍵點:簽名抽象化和支付抽象。簽名抽象讓使用者可以選擇任何喜歡的驗證機制,付款抽象則允許使用多種交易付款選項。這種靈活性提供了更安全、更優的使用者體驗。
- 在ERC-4337 和原生AA 中,「驗證」階段的入口點函數是固定的,而在「執行」階段,只有原生AA 中的入口點是固定的。驗證交易的限制和執行交易的步驟在不同實作中有各自的特點和限制。
- 在EVM 相容鏈上實施ERC-4337,有兩個關鍵區別:Rollup 設計中的協定差異和位址計算方式的差異,導致在L1 和L2 之間實現ERC-4337 時出現難以注意的開發細節。
以下為演講全文:
大家好,我是Alfred,現任imToken Labs 的區塊鏈開發人員。今天,我向大家介紹ERC-4337 和Native AA 的概念,討論它們之間的差異,並重點分析L1 和L2 的4337 標準的主要差異。
帳戶抽象介紹
1. 什麼是帳戶抽象
帳戶抽象化(AA)主要包括兩個關鍵點:簽名抽象化和支付抽象。
- 簽章抽象:使用者可以選擇任何喜歡的驗證機制,而不僅限於某些數位簽章演算法(如ECDSA)。
- 支付抽象:使用者可以使用多種交易支付選項,例如使用ERC-20 資產取代原生資產支付,或讓第三方贊助交易。
這種靈活性提供了更安全、更優的使用者體驗。帳戶抽象的目標是透過多種方式實現這兩個關鍵點。
2. 什麼是ERC-4337
目前,以太坊協議中的外部擁有帳戶(EOA)存在一些限制,例如固定的簽名方法和支付設計。 ERC-4337 透過引入更靈活的帳戶管理和交易處理方法來解決這些問題。
- userOp 結構:在ERC-4337 中,使用者將userOp 結構傳送到Bundler。 Bundler 會收集多個userOp,並透過呼叫handleOps 函數將它們傳送到EntryPoint 合約。
- EntryPoint 合約:此合約像作業系統一樣處理交易,主要功能包括:
- 呼叫帳戶合約中的validate 函數,確保userOp 已獲得帳戶所有者授權。
- 收取費用。
- 呼叫帳戶合約中的execute 函數,執行userOp 的目標操作。
3. 什麼是原生AA
在以太坊中,帳戶分為EOA 和合約帳戶。然而,在原生AA 中,每個帳戶都是一個合約,且交易處理機制直接嵌入到區塊鏈協議中。
各區塊鏈網路中的AA 設計:
- ERC-4337 帳號抽象:以太坊、Arbitrum、Optimism、Base、Linea、Scroll、Polygon PoS
- 原生帳戶抽象化遵循ERC-4337:StarkNet & zkSync 時代
- 具有隱私設計的原生帳戶抽象化:Aztec
如果你對Aztec Native AA 或EIP-3074、EIP-7702 感興趣,今天我們將專注於ERC-4337 之後的原生AA。詳細資訊請參考我寫的文章,列在文末。
ERC-4337 和原生AA 的區別
1. 作業系統角色
AA OS 需要回答以下問題:
- 誰決定Gas 價格?
- 誰決定交易順序?記憶體池在哪裡?
- 誰觸發入口點函數?
- 什麼決定了交易處理的流程?
在ERC-4337 中,這些角色透過Bundler 和EntryPoint Contract 協同完成。
在原生AA 中,使用者將其userOps 傳送給官方伺服器的操作員/ 排序器,而不是Bundler 和EntryPoint Contract。
在StarkNet 中,Sequencer 負責處理所有這些任務。
在zkSync 中,Era 與其他AA 實現的主要差異在於Operator 需要與bootloader(系統合約)配合工作。 Bootloader 開啟新區塊,定義其參數(包括區塊參數和其他Gas 參數),並接收來自Operator 的交易以進行驗證。
2. 合約接口
由於三個步驟的存在,帳戶合約介面在不同實作中是相似的,這些入口點函數只能由AA OS 呼叫:
- ERC-4337:驗證使用者操作
- zkSync:驗證交易、交易支付、執行交易
- StarkNet:execute、validate、validate_declare、validate_deploy
在ERC-4337 和原生AA 中,「驗證」階段的入口點函數是固定的,而在「執行」階段,只有原生AA 中的入口點是固定的。
3. 驗證步驟的限制
由於驗證交易沒有成本限制(本質上,驗證交易是呼叫視圖函數),攻擊者可以對記憶體池進行DoS 攻擊,從而破壞捆綁器(EIP-4337)或運算符/ 排序器(原生AA)。
EIP-4337 定義了禁止哪些操作碼以及如何限制儲存存取。 zkSync Era 放寬了一些OpCode 的使用:
- 合約邏輯只能存取自己的儲存槽。如果帳戶合約的地址是地址A,它可以存取:
- 屬於位址A 的儲存槽
- 屬於任何其他位址A 的儲存槽
- 屬於任何其他位址的儲存槽keccak256 (A || X):這意味著直接使用位址作為映射中的鍵(例如,映射(address => value) ),相當於存取槽keccak256 (A || X)。例如,ERC-20 合約中的資產餘額。
- 合約邏輯無法存取全域變量,例如區塊號。 StarkNet 也不允許外部合約呼叫。
4. 執行步驟的限制
在zkSync 中,執行系統呼叫需要確認系統標誌的存在。例如,增加nonce 的唯一方法是與NonceHolder 交互,而部署合約則需要與ContractDeployer 交互。系統標誌確保帳戶開發人員有意識地與系統合約互動。
在ERC-4337 和StarkNet 中,執行階段沒有特殊限制。
5. 隨機數
- 在ERC-4337 中,入口點隨機數的設計區分了192 位元金鑰值和64 位元隨機數值。
- 在zkSync 中,NonceHolder 系統合約管理nonce,確保嚴格遞增,即將隨機數增加1。
- 在StarkNet 中,nonce 也是嚴格遞增的,但沒有抽象的nonce 來由特定的合約管理。
6. 使用第一個事務進行部署
- ERC-4337 在userOp 結構中包含initcode 字段,以在其第一個userOp 中部署發送者(帳戶合約)。
- 在StarkNet 和zkSync 中,使用者必須將第一筆交易傳送給算子/ 排序器來部署帳戶合約。
7. zkSync 中的特殊設計
如果你直接將ETH 從以太坊EOA 轉移到zkSync, 無需部署自訂帳戶合約,你將收到一個具有相同地址的預設帳戶。該帳戶可以像以太坊EOA 一樣工作,並且也由相應的以太坊EOA 的私鑰控制。
這帳戶類型是版本None 而不是version1 。你不能呼叫DefaultAccount 的函數,因為它沒有在核心空間部署任何程式碼。
L1 的4337 和L2 的4337 的區別
在EVM 相容鏈上實施ERC-4337 有兩個關鍵區別:協定差異和位址差異。
1. 協議差異
Rollup 設計中,L2 需要將資料上傳到L1 以進行安全性和結算。在ERC-4337 的背景下,與此上傳過程相關的費用,例如L1 安全費和blob 費用,應該被納入預驗證Gas 中。確定預驗證Gas 中適當的上傳費用是一項重大挑戰。
2. 地址差異
zkSync ERA 的create 函數中的地址編碼方式與以太坊和OP 總和不同。此外,StarkNet 使用獨特的雜湊函數進行位址計算。在EVM 相容鏈上的ERC-4337 背景下,我們通常假設位址計算在各鏈上是一致的。然而,有一個難以注意的細節可能會導致以太坊和L2 中的ERC-4337 實現之間的帳戶合約地址不同。
關鍵問題是在硬分叉中添加新的操作碼。例如,如果L2 鏈不支援上海硬分叉,且在編譯時未指定EVM 版本,push0 的引入會導致字節碼改變,即使Solidity 程式碼是相同的。
結語
以下是一些資源,供你了解更多有關帳戶抽象的資訊。請隨時聯絡我,如果你有任何疑問,可以在Twitter 上找到我(@murmurlu)。
《Aztec 帳戶抽象介紹》,請參閱:
https://medium.com/@ChiHaoLu/introduction-of-aztec-account-abstraction-98535c9edf2e
《StarkNet 帳號抽象介紹》,請參閱:
https://medium.com/taipei-ethereum-meetup/introduction-of-starknet-account-abstraction-2c343b561d6e
《zkSync 帳號抽象介紹》,請查閱:
https://medium.com/taipei-ethereum-meetup/zksync-%E4%B8%AD%E7%9A%84%E5%8E%9F%E7%94%9F-account-abstraction-%E4%BB% 8B%E7%B4%B9-bc7269f8893a
《Starknet 和zkSync:比較分析》,請查閱:
https://medium.com/nethermind-eth/starknet-and-zksync-a-comparative-analysis-d4648786256b