什麼是 user operations?
User operation 是包含交易細節的物件,代表發送者的智慧合約帳戶執行這些交易。User operation 是一種偽交易物件,讓 Account Abstraction 得以運作,而不需要對 Ethereum 及支援 ERC-4337 的 layer 2 區塊鏈進行共識層的變更。
若要開發智慧合約錢包(SCW),或是讓去中心化應用程式與 SCW 相容,了解定義 user operation 的各項參數、user op 各欄位在 user op 建構過程中如何被填入、user op 如何被 bundler 打包,以及如何被 paymaster 驗證與執行,會很有幫助。
利用我們的 Embedded Accounts 與 account abstraction 基礎設施,讓新使用者能夠建立 email 及 passkey 內嵌錢包!
觀看影片:用 Solidity 建構並執行 user operation
user operation 包含哪些欄位?
User operation(UO)包含與一般交易類似的欄位(例如 sender、to、calldata、maxFeePerGas、maxPriorityFee、signature 及 nonce),但也有一些新的欄位是 user operation struct 特有的,包括 callGasLimit、verificationGasLimit、preVerificationGas 及 paymasterAndData。
UO 欄位的定義可在官方 ERC-4337 規格文件中找到,以下為摘要:
- callGasLimit - 主要執行呼叫所使用的 gas
- verificationGasLimit - 完成驗證步驟所使用的 gas
- preVerificationGas - 支付給 bundler,用以支付預驗證的執行與 calldata 成本
- paymasterAndData - 贊助的 paymaster 地址,加上要傳送給 paymaster 的資料
Alchemy AA infra 團隊工程師 David Philipson 撰寫的「You Could Invented Account Abstraction」系列文章第一部分中,對 user operation 的設計與架構有詳細說明。
接下來,讓我們了解正確填入 user operation 各欄位的標準流程。
發送 user operation 的流程為何?
將 user operation(user op)發送給 bundler 的典型流程包含多個步驟:
- 建構部分填入的 user op,填入 sender、nonce、initCode 及 callData
- 透過 eth_estimateUserOperationGas 向 bundler RPC 估算此部分 user op 的 gas
- 填入 preVerificationGas、verificationGasLimit、callGasLimit
- 若使用不依賴 user op 內容的 paymaster,例如 ERC20 paymaster,可在此步驟填入 paymasterAndData。
- 估算此操作所需的 gas 費用,並填入 maxFeePerGas 及 maxPriorityFeePerGas
- (選用)將 user op 送交贊助 paymaster 進行簽署,並填入 paymasterAndData
- 此步驟必須在此進行,因為 paymaster 的簽章需要上述所有欄位皆已填入。
- 簽署 user op、填入 signature,並透過 eth_sendUserOperation 將 user op 送交 bundler
雖然開發者可以使用原生的 ethers.js 取得各個 user operation 欄位的值,但也有一些 web3 開發者工具可讓 UO 的建構更加簡便。
開發者可以使用什麼工具來建構 user operation?
像 Alchemy 的開源 AA SDK 這類 user operation 建構工具,能讓建構 user operation 比使用原生 ethers.js 更加容易。
Alchemy 的 AA SDK
Alchemy 的 AA SDK 以 viem 為基礎建構,為開發者提供輕量化的套件。GitHub 上的 aa-sdk 也透過 aa-ethers 函式庫支援 ethers.js 的 signer 及 provider。
使用 aa-sdk 建構 user operation 的主要好處之一,是它提供兩個實用的方法:
- sendUserOperation - 處理 gas 估算、請求 paymasterAndData、簽署等工作
- sendTransaction - 將交易物件資料(from、to、data 及 value)轉換為 user operation
建構 user operation 的操作順序相當複雜,而 Alchemy 的 AA-SDK 透過執行一連串操作來簡化 UO 的建構:先以 getDummyPaymasterData 取得資料,再以 estimateGas 估算 gas,接著呼叫 getFeeData,最後呼叫 getPaymasterAndData。
取得 user op 各欄位的值之後,它會利用 target、callData 及選用的 value 來建構並簽署 user operation。接著將 user op 送交 bundler,並取得該 user op 的 hash。
如果你想使用 Alchemy 的 paymaster、其他獨立的 paymaster,或計畫加入對自有 SmartAccount 的支援,請參閱 Alchemy AA SDK 文件,當中有完整說明如何輕鬆建立 UO。
user operation 如何被加入 user op mempool?
在 user op 被加入 mempool 之前,必須通過一系列檢查,以確保其行為符合 ERC-4337 規格中所定義的預期。user op 也必須通過驗證模擬檢查,以確保其有效,且能夠支付其 gas 費用(無論是由發送者的錢包支付,或透過 paymaster 的贊助方案支付)。
1. 檢查 user op 的有效性
初步的一系列檢查在 ERC-4337 規格中的「Client behavior upon receiving a UserOperation」章節有詳細說明,以下為摘要:
- sender 是既有的合約,或是用來建立合約的 initCode 不為空(但兩者不可同時成立)
- 若 initCode 不為空(因為此 user op 會建立帳戶),則需判斷該 factory 是否已 stake
- verificationGasLimit 需足夠低(小於或等於 MAX_VERIFICATION_GAS)
- preVerificationGas 需足夠高,以支付 calldata gas 及額外的 overhead gas 費用
- paymasterAndData 必須為空,或以 paymaster 地址開頭
- 若存在 paymaster,則其在鏈上必須有非空的 code、有足夠資金支付此 user op,且未被列入黑名單
- callgas 至少要等於一次非零數值 CALL 的成本
- maxFeePerGas 及 maxPriorityFeePerGas 需高於 client 所能接受的最低值
- sender 在 pool 中不能有另一個 user op(除非此 user op 是為了取代現有的項目而建構)
有許多規則可能會影響這些檢查,詳細內容可參閱規格文件。
在這份 user operation 入門介紹中,我們的目的只是傳達用來判斷 user op 有效性的高階檢查項目。
2. 模擬 user operation
一旦 user op 通過這些基本檢查,client 便需要模擬該 user operation,以驗證此 user op 是否有能力支付其執行費用,無論是使用自身資金,或透過 paymaster 支付。
要模擬一個 user op,bundler 會呼叫 simulateValidation() 方法,此方法接著會呼叫 sender 帳戶上的 validateUserOp 函式,或者若將由 paymaster 贊助此 user op 執行的 gas 費用,則呼叫 paymaster 合約帳戶上的 validatePaymasterUserOp。
呼叫 simulateValidation() 方法後,它會以 ValidationResult 回應進行 revert。此函式被 revert 是預期的行為,這被視為成功的結果。
若 ValidationResult 是以不同的錯誤進行 revert,則代表此 user op 未通過驗證模擬,不會被加入 mempool。若 user op 回傳 sigFail,則會被排除於 mempool 之外;若 validUntil 回應已過期,UO 也可能被排除於 mempool 之外。
注意: 若 user op 中存在 initCode,則會由 account factory 建立一個帳戶,接著模擬流程會以此新建立的帳戶繼續進行。
現在 user operation 已完成建構、檢查、模擬,並加入 mempool,即可送交 entry point 合約進行驗證與執行!
user operation 如何被驗證與執行?
要讓 user operation 內的交易細節發布到鏈上,entry point 合約需要驗證該 user operation,若 UO 通過驗證,entry point 合約便會執行該交易,接著償還 bundler 的 gas 費用。
user op 驗證與執行的基本步驟如下:
- bundler 透過 handleOps() 方法將 user op 送交唯一的 entry point 合約
- 對每個 op,entry point 會在該 op 的 sender 錢包上呼叫 validateOp*
- 若有任何 op 未通過驗證步驟,則會被捨棄
- 接著,在該 op 的 sender 錢包上針對每個 op 呼叫 executeOp,並追蹤所使用的 gas 量
- 從 sender 的錢包或 paymaster 轉移 ETH 給 bundler,以支付執行每個 op 所使用的 gas
*所有驗證都會先執行完畢,之後才會執行所有已通過驗證的 user op 的執行動作。
以下圖表說明 entry point 合約如何代表發送者的智慧合約錢包驗證並執行 user operation:

User operation 是一種偽交易物件,讓智慧合約錢包能夠作為使用者在 Ethereum 及相對應 L2 上的主要錢包。智慧合約錢包帶來了 web3 使用者體驗上的優勢,讓區塊鏈更易於使用,而這一切之所以能夠實現,是因為有 Ethereum 及各 L2 上的 AA 基礎設施提供者。
若你的 web3 產品支援智慧合約錢包,歡迎探索 Alchemy 的 AA 基礎設施,包括我們適用於 Ethereum、Polygon、Arbitrum、Optimism 及熱門測試網(如 Sepolia)的 Gas Manager API 與 Bundler API!
相關總覽
錢包2026年10月14日
什麼是 paymaster?
Paymaster 為 user operation 贊助 gas,或讓使用者用 ERC-20 代幣支付這筆費用。
錢包2026年9月2日
Agent 錢包:AI agent 的 session 與權限模型
AI agent 如何在不持有私鑰的情況下,取得範圍受限、可撤銷的錢包存取權限:session、委派簽署與即時撤銷。
錢包2026年7月29日
別再把私鑰貼到 Cursor:如何讓你的 coding agent 擁有錢包
讓你的 coding agent 擁有錢包,卻不用把私鑰交給它。了解 Alchemy CLI agent wallets 如何透過限定範圍的 sessions,讓 agent 不必在 .env 中存放私鑰也能交易。

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。