AA Link to heading
EVM 交易工作流 Link to heading
-
交易只能由 EOA (没有代码的账户)发起 EIP3607
-
但 EOA 和合约账户在 EVM 上是一样的,有同样的属性:balance、nonce、code、 state
EOA 特点 Link to heading
-
EOA (Externally Owned Account 外部账号)
-
用私钥控制的账号(MetaMask / ImToken … )
-
EOA特点:链下生产、所有账号一致
-
-
问题:
-
私钥、助记词、支付 Gas(普通用户太不友好)
-
一次只能签一笔交易
-
无法 Social Recovery、无法替换 Key
-
交易体验不佳 Link to heading
// ERC20
function approve(address _spender, uint256 _value) {
allowance[msg.sender][_spender] = _value;
return true;
}
// DEX
function swap( ) {
token.transferFrom(msg.sender, address(this), amount)
}
合约账户(CA) Link to heading
-
由合约代码控制的账户
-
辑灵活:其他签名方式(如 Passkey secp256r1)、多签、Social Recovery、Gas 代付
-
但是只能被动执行
先驱EIP-86 / EIP-2938 Link to heading
-
EIP-86:抽象验证证签名逻辑,创建“合约”来验证证交易签名
-
EIP-2938:让合约成为一等公民(可支付 Gas 及发起交易)对核心协议修改太大,暂时搁置
ERC- 4337 Link to heading
-
不改变协议(不影响共识)
-
合约作为账户(Smart Account),引入 Bundler 打包发送交易
-
带来了前所未有的灵活性:
-
多种签名逻辑 (在合约中验证签名)
-
批量交易
-
社交恢复
-
用其他 Token 代付手续费,Paymaster 作为付款人
-
在一些 layer2 上原生支持 AA(RIP-7560):Starknet、zkSync 等
ERC-4337 案例 Link to heading
先理解传统 Web3 痛点(对比 Web2) Link to heading
- Web2:用指纹 / 人脸(Passkey)、密码直接登录,无需关心 “私钥 / 助记词”,体验顺滑。
- 传统 Web3:必须管理助记词 / 私钥,对普通用户不友好(丢私钥 = 丢资产),是大规模 adoption 的障碍。
目标:把 Web2 的 “无密码登录体验” 搬进 Web3,让用户用 Passkey(指纹 / 人脸)直接控制链上账户,同时保留 Web3 的 “去中心化、智能合约” 能力。
利用 Passkey 迁移传统 Web2 用户到链上
- 基于 Passkey 方案为用户创建账户,让用户不用关注助记词和私钥。
- Passkey 是基于FIDO2/WebAuthn标准的无密码登录标准,使用 secp256r1 (P‐256) 曲线在用>户设备上签名(表现为指纹、faceID 等),服务端验证证登录,主流的Web服务均支持.
- 在合约中对验证 secp256r1 签名(RIP‐7212 已经引入 P‐256预编译),即可实现合约钱包,该钱包有 >Passkey 签名控制
ERC-4337 交易工作流 Link to heading
1. 先明确角色职责 Link to heading
- Bundler:
是一个链下节点,职责是收集
UserOperation
、模拟验证(调用EntryPoint.simulateValidation
),然后把合法的UserOperation
打包成以太坊交易,提交到链上。 - EntryPoint:
是链上的核心合约,负责接收 Bundler 提交的
UserOperation
,执行validateOp
(验证)和executeOp
(执行)。 - Smart Account(Bob 的合约账户):
是用户的智能合约钱包,需要实现
IAccount
接口(包含validateUserOp
方法),在validateOp
阶段验证签名、权限等逻辑。 - PayMaster(可选):帮用户支付手续费(比如用其他代币支付 Gas)。
2. 流程拆解(对应图中步骤) Link to heading
- Bob 构造 UserOperation:
Bob 想调用合约 B/C,但不用私钥签名 “传统交易”,而是构造一个
UserOperation
(包含to
、data
、gas
等信息),并用 Passkey(基于 P-256 曲线)签名。 - Bundler 提交交易:
Bundler 收集
UserOperation
,模拟验证后提交给EntryPoint
。 - EntryPoint 验证 & 执行:
- ValidateOp:检查签名是否合法(Passkey 签名是否通过验证)、账户是否有足够 Gas 等。
- executeOp:如果验证通过,执行
UserOperation
,让 Bob 的合约账户调用合约 B/C(此时msg.sender = Bob 的合约账户
)。
3. validateOp
和 executeOp
的完整流程(与 Bundler 的关系)
Link to heading
为了说清楚,我们把流程拆成 “链下模拟验证” 和 “链上实际执行” 两个阶段:
阶段 1:链下 - Bundler 模拟验证(调用 simulateValidation
)
Link to heading
- Bundler 收集 UserOperation:
Bob 构造
UserOperation
(包含调用合约 B 的指令、签名等),发送给 Bundler。 - Bundler 调用
EntryPoint.simulateValidation
: Bundler 会模拟在链上执行validateOp
的过程,但不会真正改变链上状态。这一步的作用是:- 检查
UserOperation
是否合法(提前筛掉无效操作,避免上链后失败浪费 Gas)。 - 预估执行这个
UserOperation
需要多少 Gas。
- 检查
simulateValidation
内部触发validateOp
: 在模拟执行中,EntryPoint
会调用 Bob 的智能合约账户的validateUserOp
方法(这就是validateOp
的核心逻辑),验证:- 签名是否正确(比如 Passkey 签名是否合法)。
- 账户是否有足够余额支付 Gas(或 Paymaster 是否愿意代付)。
- 是否有其他自定义规则(比如每天只能调用一次合约 B)。
- Bundler 决定是否打包:
如果模拟验证通过,Bundler 会把这个
UserOperation
打包成以太坊交易;如果验证失败,Bundler 会拒绝打包,这个UserOperation
就不会上链。
4:链上 - 实际执行 validateOp
和 executeOp
Link to heading
- Bundler 提交交易到链上:
Bundler 把包含
UserOperation
的交易提交到以太坊网络,这个交易的目标合约是EntryPoint
。 - 链上执行
EntryPoint.handleOps
: 当交易被矿工打包上链后,EntryPoint
会执行handleOps
函数,处理 Bundler 提交的UserOperation
。 - 第一步:
validateOp
(真正链上验证):EntryPoint
会再次调用 Bob 的智能合约账户的validateUserOp
方法(和模拟验证逻辑一样),确保:- 签名、权限等规则仍然有效(防止模拟验证后,链上状态变化导致规则失效)。
- 如果验证失败,整个交易回滚,不会执行后续操作。
- 第二步:
executeOp
(执行交易): 验证通过后,EntryPoint
会调用 Bob 的智能合约账户的execute
方法(或类似逻辑),实际执行UserOperation
中的指令(比如调用合约 B 铸造 NFT),此时msg.sender = Bob 的智能合约账户地址
。
简单说:
validateOp
和executeOp
是链上的 “验证 + 执行” 流程,由EntryPoint
和Smart Account
协作完成。- Bundler 是链下的 “搬运工 + 质检员”,负责收集
UserOperation
,并通过模拟验证确保它们有资格上链执行。
ERC-4337 主要组件 Link to heading
-
Smart Contract Wallet: ḵ证和执行 UserOp 中的 callData , 可以有自定义的ḵ证᭦辑
- 通常由 Account Factory 创建
-
Bundler : 将用户的 UserOp 发ᭆ到᱾上 EntryPoint
-
EntryPoint : 单例智能合约, 用来ḵ证(Validation)和执行(Execution)UserOp(对应着原来客户端的实施)
-
PayMaster (可选): 代付手续费
ERC-4337 基础设施(服务商) Link to heading
• SDK:Zerodev 、 Safe Wallet 、Pimlico、biconomy、etherspot、Alchemy AccountKit 、thirdweb
• 使用这些 SDK 方便在自己的应用里集成钱包
• 理解 ERC4337 实现参考文章:
• https://learnblockchain.cn/article/5426
• https://learnblockchain.cn/article/5432