m mybian.xyz
mybian.xyz · 话题 · EIP4337实战教程

EIP4337实战教程:在 BNB Smart Chain 跑通一笔账户抽象转账

以一笔在 BNB Smart Chain 上完成的 EIP-4337 转账为主线,串起 Smart Account 部署、签名构造、Bundler 提交与失败排查全过程。

1844 关注 · 36 2026-05-24T16:47:27.361166+00:00

回答共 1 条

默认排序 ▾
m
mybian.xyz 主编
EIP4337实战教程 领域深度内容
优秀回答者
EIP4337实战教程 - EIP4337实战教程:在 BNB Smart Chain 跑通一笔账户抽象转账

EIP4337实战教程:在 BNB Smart Chain 跑通一笔账户抽象转账

看了概念和指南,下一步就是把 EIP-4337 真正跑起来。这篇文章用一笔在 BNB Smart Chain 上完成的转账作为主线,让你按部就班地体验账户抽象的完整链路。

一、准备环境

清单:

  1. 一个有少量 BNB 的 EOA 用于支付部署 Gas;
  2. Node.js 20 与最新版 ethers.js;
  3. 一份 Bundler RPC,例如来自 Pimlico 或 Stackup;
  4. 一份 Paymaster RPC(可选);
  5. Smart Account 合约源码,可使用官方 SimpleAccount。

概念回顾可读 EIP4337是什么

二、部署 Smart Account

使用 SimpleAccountFactory 的 createAccount 函数:

  1. 准备 owner 地址;
  2. 选择 salt;
  3. 调用 createAccount(owner, salt);
  4. 记录合约地址。

或者直接构造首个 UserOperation 时让 EntryPoint 通过 initCode 帮你部署。

三、构造 UserOperation

字段重点:

  • sender:Smart Account 地址;
  • nonce:通过 EntryPoint.getNonce 获取;
  • callData:执行的具体逻辑,例如 transfer USDT;
  • callGasLimit、verificationGasLimit、preVerificationGas:先粗估再用 Bundler 接口校正;
  • maxFeePerGas、maxPriorityFeePerGas:参考链上当时 Gas;
  • signature:先用 0xdummy 占位用于估算。

四、估算 Gas

调用 Bundler 的 eth_estimateUserOperationGas:

let est = await bundler.estimateUserOperationGas(userOp, entryPoint);
userOp.callGasLimit = est.callGasLimit;
userOp.verificationGasLimit = est.verificationGasLimit;
userOp.preVerificationGas = est.preVerificationGas;

这一步避免上链时被 EntryPoint 拒绝。可对照 EIP4337开发教程 中的更深入解释。

五、签名

用 owner 的 EOA 对 EntryPoint.getUserOpHash 的返回值做 personal_sign 或更安全的 EIP-712 签名:

let hash = entryPoint.getUserOpHash(userOp);
userOp.signature = await owner.signMessage(ethers.utils.arrayify(hash));

如果 Smart Account 自定义了多签,需要按合约要求把多个签名拼接。

六、提交 UserOperation

调用 Bundler 的 eth_sendUserOperation:

let userOpHash = await bundler.sendUserOperation(userOp, entryPoint);
console.log(`已提交 ${userOpHash}`);

然后用 eth_getUserOperationReceipt 轮询结果。

七、从币安账户充值

首笔实战转账通常是从币安提币到 Smart Account:

  1. 在币安提 5 USDT,网络选 BSC;
  2. 地址粘贴 Smart Account;
  3. 等待两次区块确认;
  4. 在 Smart Account 内发起 transfer USDT 给另一个测试地址。

八、常见失败排查

  • AA13:initCode 不正确,部署失败;
  • AA23:签名校验失败,检查 owner 与签名格式;
  • AA24:Paymaster 拒绝代付;
  • AA40:nonce 不正确;
  • AA51:preVerificationGas 不足。

对照 EIP4337最佳实践 中的对照表可以快速定位。

九、把流程模板化

实战之后,请把代码封装成模板,包含:

  • Gas 估算重试机制;
  • 失败重发与回滚;
  • 监控 UserOperation 状态的轮询;
  • HD钱包代码示例 中的 BIP44 派生模块协同的工具函数。

十、上线后的演练

上线不是终点。建议每月在测试网做一次完整链路演练,每季度在主网做一次小额演练,确保 Bundler、Paymaster 与 EntryPoint 版本仍然兼容。把这条「实战 - 模板 - 演练」的闭环固定下来,你的 EIP-4337 钱包就能在币安生态稳健长跑。

184 赞同
发布于 2026-05-24T06:12:22.061404+00:00 · 更新于 2026-05-24T16:47:27.361166+00:00