menu-icon
anue logo
鉅樂部鉅亨號鉅亨買幣
search icon
區塊鏈

開發者指南:詳解帳戶抽象提案EIP-4337工作流程

BlockBeats 律動財經 2022-11-29 09:30

cover image of news article
律動財經圖片

EIP-4337 詳細工作流程

本文不會從頭介紹 EIP-4337,僅介紹 4337 的主要合約是如何實現的。適合對 4337 有一定了解的開發者,由其是錢包開發者,以及愛好者或研究員閱讀。



主要內容位於流程圖 中:





需要配合 4337 源碼閱讀 GitHub—eth-infinitism/account-abstraction at main。



4337 Spec 中有更多詳細細節 EIP-4337: Account Abstraction using alt mempool。  



請注意:



- 本流程圖只畫出了普通類型的交易,未涉及 Aggregator。掌握普通流程後才方便掌握聚合型的交易。

- 流程圖中箭頭不代表程序的調用棧或輸入輸出,僅代表相關角色、函數、事件的發生的先後順序。

- 為方便讀者對宏觀架構的快速理解,流程圖中省略了一部分函數調用和邏輯。被省略的部分有可能對你研究的問題或疑惑有很大意義,具體看你想了解什麼內容,所以還是需要你必要時仔細閱讀源碼。

核心概念



研究 4337 需要掌握以下核心概念:



UserOperation 的內容 EntryPoint 實現 Wallet 實現 Paymaster 實現驗證階段、執行階段的執行流程與錯誤處理 Gas 的支付流程與計算

UserOperation

一種內容類似 transaction 的偽交易對象,通過新的 RPC 方法 code>eth_sendUserOperation 提交給節點。



UO 中的字段含義大部分是顯然的,僅挑選幾個容易誤解的進行分析:



sender,此處指的是要交互的 wallet,而非 msg.sender 或 tx.origin 等其他任何概念 verificationGasLimit,驗證交易時的 gasLimitcallGasLimit,執行交易時的 gasLimitpreVerificationGas,補償 bundler 調用 code>handleOps () 時會一部分未計算在內的 gas 成本(如提交交易的 calldata 成本)。

Prefund

這個並非 UO 中的一個字段,而是由上面三個 gas 參數計算而出。代表了該 UO 在 strong> 驗證階段 預先支付給 code>EntryPoint 的總成本。Prefund 雖然是在驗證階段支付的,但包含了 preVerificationGas,驗證和執行三部分的成本。之後不會再向 code>EntryPoint 進行支付 gas。





具體計算參見 code>EntryPoint 中的 code>_getRequiredPrefund。



EntryPoint

EntryPoint 是所有功能的核心入口。每個項目自行部署自己的 EntryPoint。Bundler,Wallet 和 Paymaster 都需要圍繞 EntryPoint 工作。



Bundler 在 EntryPoint 內實現兩個功能



鏈下驗證 UO,剔除不符合要求和有問題的 UO。鏈下驗證一是防止 DoS,二是避免 bundler 在鏈上損失 gas。

打包合規的 UO,提交上鏈。

Wallet 與 EntryPoint

向 EntryPoint 支付 gas 費

只響應來自 EntryPoint 的消息

執行來自 EntryPoint 的具體交易內容

注意,EntryPoint 不是 Wallet 的 factory。官方給出的圖片容易給人造成這種誤解,但官方實現並非如此。

Paymaster 與 EntryPoint

向 EntryPoint 支付 gas 費

只響應來自 EntryPoint 的消息

向 EntryPoint 確認自己的為某 UO 服務的意願

在 EntryPoint 內質押才能成為 paymaster

我們可以看到 Wallet 與 Paymaster 都有可能向 EntryPoint 支付 gas。gas 餘額會儲存在 code>deposits 這個 mapping 中。



注意,雖然 deposits 字面意思為充值,但並非必須一個需要預先手動完成的動作,也可以在每一筆 UO 發生時,計算缺少多少 gas 並自動充值。



最終,若所有操作的 actualGasCost 小於 prefund, EntryPoint 會將多餘額度退款至你的 deposit。  





注意, validationActualCost & callActualCost 僅僅是為了說明而作的標記,並非真實存在的變量。它們是由 gasPrice() 累加的。  



Wallet



代表用戶最終使用的錢包。需要開發者至少實現以下兩個自定義方法:



簽名驗證:你可以使用任何密碼學手段來實現簽名驗證,比如,為了配合使用蘋果的 Security Enclave 而實現 NIST P-256 的 ECDSA。如果沒有特殊需求可直接使用以太坊的 ECDSA。

處理交易:EntryPoint 通過 code>address (sender).call (callData) 來調用 wallet 中的具體的交易功能。那麼 call 需要有至少一個可執行的函數,如 transferEther (),callAnotherContrat () 等。

開發者還需要自行實現 wallet factory,需要創建錢包時,工廠會被 code>SenderCreator 合約調用。新建錢包應使用 code>CREATE2 方法以保障生成地址的確定性。



Paymaster

Paymaster 可以為用戶支付 gas,因此可以實現:



免費交易:用戶激勵,讓用戶免費使用錢包 

gasless 交易:不直接用 ether 支付 gas,而使用其他 token 或 nft 等

等等其他類似的贊助交易功能

Paymaster 需要開發者實現:



validatePaymasterUserOp ():由於 paymaster 的開放性,驗證邏輯需要開發者完全自己定義。驗證後有可能需要實現類似 code>wallet 中 code>payPrefund () 的功能。

_postOp:必須重寫此方法,否則會被 revert。此方法可以定義在 paymaster 贊助完交易後需要做什麼,如在驗證時為用戶支付了 ether,則此處要求用戶支付等價的 ERC-20。  

原文連結

暢行幣圈交易全攻略,專家駐群實戰交流

▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!

前往鉅亨買幣找交易所優惠






Empty