使用者操作
使用者操作(常簡稱 UserOp)是 ERC-4337 中相當於交易的東西,但專為智能合約錢包而設。它是一個結構化物件,使用者在其中表達他們希望帳戶做什麼、依帳戶規則所要求的方式簽署它,並提交它——不是送進一般的交易記憶池,而是送進一個由打包者撿取的、獨立的高層記憶池。它是意圖;真正的鏈上交易要等到打包者把它包起來才會出現。
它的欄位遠超過一筆單純的交易。除了 sender(智能合約帳戶)、nonce 與 callData(要執行的動作)之外,一個 UserOperation 還帶著驗證階段與執行階段各自獨立的 gas 上限、EIP-1559 風格的費用欄位、一個選用的 initCode(在帳戶首次使用時部署它,使錢包能在尚未上鏈存在前就以一個反事實地址收款)、一個選用的 paymasterAndData(用以請求 gas 贊助),以及一個其意義完全由帳戶合約定義的 signature——它可以是一個 ECDSA 簽章、一組多重簽章、一則通行金鑰斷言,或任何其他東西。
把驗證 gas 上限與呼叫 gas 上限分開,是其關鍵的結構性構想,也呼應了 EntryPoint 分兩階段處理該操作的方式:先呼叫帳戶的 validateUserOp 來檢查簽章並支付 gas,再執行所請求的 callData。正是這道分離,讓打包者能安全地模擬驗證、確認該操作會付款,並只打包那些不會浪費它們 gas 的操作——把一個靈活、可程式化的帳戶,化為在共享記憶池中仍能被高效且抗騷擾地處理的東西。
UserOperation {
sender, // the smart-contract account
nonce, // 2D nonce: 192-bit key + 64-bit sequence
initCode, // deploy account on first use (else empty)
callData, // the action(s) the account should perform
callGasLimit, // gas for execution phase
verificationGasLimit, // gas for validation phase
preVerificationGas, // overhead paid to the bundler
maxFeePerGas, maxPriorityFeePerGas, // EIP-1559 style
paymasterAndData, // optional gas sponsor (else empty)
signature // meaning defined by the account contract
}ERC-4337 的 UserOperation:一個意圖物件,帶有分離的驗證與執行 gas、選用的帳戶部署,以及由帳戶定義的簽章。
由於 UserOperation 還不是一筆交易,它有自己的雜湊,且能在替代記憶池中以更高費用重新簽署來替換——但它最終的鏈上交易雜湊是打包者的,而非使用者的。以鏈上交易雜湊去搜尋某個 UserOp 的工具,必須顧及這層間接性。