ERC-4337 UserOperation怎么执行? 图 1
ERC-4337 UserOperation怎么执行? · 图 1

ERC-4337没有把智能账户变成一种新的共识层交易。用户构造的是UserOperation,它先进入专用内存池,再由Bundler放进一笔普通以太坊交易,调用统一EntryPoint处理。理解这条“交易里的交易”路径,比背字段名更有用。

四个角色各自负责什么

智能账户保存授权规则和业务执行逻辑;Bundler收集UserOperation、模拟并打包;EntryPoint统一验证、计费和调用账户;Paymaster可选择为符合条件的操作赞助Gas。任何一方都不能替代其他角色:Bundler接受不代表账户验签通过,Paymaster愿意赞助也不代表目标调用会成功。

UserOperation的三个阶段

1. 预验证与模拟

Bundler检查字段、签名封装、nonce和费用报价,并模拟EntryPoint验证路径。发送方地址可能已经部署,也可能通过factory与factoryData在本次操作中创建。模拟失败的操作通常不会进入Bundle,因为Bundler不愿承担必然回滚的Gas。

2. validateUserOp与Paymaster验证

EntryPoint调用账户的validateUserOp,账户核对签名、nonce与缺少的预付款。若指定Paymaster,EntryPoint还执行其验证逻辑。Paymaster可以检查会员资格、代币余额或服务端凭证,但必须在EntryPoint有足够deposit,且验证过程受Gas字段约束。

3. 账户执行与费用结算

验证通过后,EntryPoint让账户执行callData。目标合约revert与账户验证失败是不同阶段:前者可能产生一条已上链但业务失败的UserOperation事件,后者通常在打包前就被拒绝。费用最终从账户预付款或Paymaster存款结算,未使用部分按规则退回。

现象优先检查不要先做什么
AA nonce错误EntryPoint对应nonce空间盲目把nonce加一
validation gas不足签名与Paymaster验证路径只提高callGasLimit
Paymaster拒绝paymasterData、期限、deposit更换Bundler后重复广播
执行revert目标callData与账户余额把错误归因于验签

费用字段要按阶段理解

callGasLimit用于账户实际执行,verificationGasLimit覆盖账户与部署验证,preVerificationGas补偿calldata、Bundle开销等成本。费用出价仍受maxFeePerGas和maxPriorityFeePerGas影响。字段估低会在对应阶段失败,估得过高则可能扩大预留或报价,并不等于实际全部花完。

产品接入时应保存UserOperation hash、EntryPoint地址、chainId、Bundler响应与最终事件,不能只存一条Bundle交易哈希。智能账户的签名可能依赖ERC-1271;费用历史可参考eth_feeHistory字段,目标调用的revert数据可用Solidity自定义错误解码继续定位。