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自定义错误解码继续定位。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。