UserOperation 是 ERC-4337 定义的已签名意图对象:它说明一个智能合约账户想要完成什么,以及该动作应当如何被验证与支付。与普通的 Ethereum 交易不同,它并不是由外部拥有账户签名的协议层对象:它的签名由账户合约自身校验,而且它不必支付自己的原生 Gas。bundler 是这样一个链下角色:它从专用的备用内存池收集 UserOperation,逐一进行模拟,把有效的打包进一笔普通的 Ethereum 交易,并调用规范的 EntryPoint 合约——EntryPoint 会先验证批次中的每一个操作,然后才执行其中任何一个。bundler 用自己的 EOA 垫付真实的 Gas,并在链上由发送方账户或该账户的 paymaster 予以偿付。一个可选的 paymaster 合约可以在这一验证步骤中同意承担某个操作,这正是手续费得以被代付、或可用 ERC-20 代币而非链上原生 Gas 代币支付的所在。
ERC-4337 快速回顾
ERC-4337 是 Ethereum 用于账户抽象的标准——一种在不改动基础协议的前提下,赋予智能合约账户与外部拥有账户(EOA)一样一流的、发起并支付动作能力的方式。ERC-4337 不去修改共识层,而是引入了一套由更高层对象和链下基础设施组成的并行系统,最终通过普通的 Ethereum 交易来结算。如果你想先从头开始了解,关于什么是账户抽象的解释涵盖了它的动机,什么是 ERC-4337 梳理了整个标准,而智能账户与 EOA 的对比则直接比较了这两种账户类型。本文聚焦于其中的机制:在系统中流动的对象,以及处理它们的角色。请注意,ERC-4337 是一个 EVM 标准——它适用于 Ethereum 及兼容 EVM 的链,而不适用于 Solana 或 TON 等非 EVM 链。
UserOperation 究竟是什么
ERC-4337 中的核心对象是 UserOperation。它表面上看起来像一笔交易,但更好的理解是把它看作一份签署过的意图声明:"这是我的账户想要完成的事,以及用于验证并支付它的参数。"它是作为 calldata 传给合约的一个结构体,而非协议原生对象——基础层从未听说过它。
实质上,一个 UserOperation 携带:
- sender——该操作所代表的智能合约账户。
- nonce——重放保护,由 EntryPoint 按两段式取值(一个 key 加一个序号)来跟踪,因此一个账户可以并行运行多条彼此独立的 nonce 通道,而不是只有一条严格队列。
- callData——账户应当执行的内容,常常是一次操作中打包的多个调用。
- 账户部署数据——可选;在账户的第一笔操作中部署其合约,这也是智能账户能够在尚未上链之前,就先在一个已知的、确定性推导出的地址上接收资金的原因。
- Gas 上限——验证与执行各自独立的预算,外加一项
preVerificationGas,用于就 EntryPoint 自身无法计量的 calldata 与额外开销补偿 bundler。 - 手续费参数——一个最高费用和一个最高优先费用,与 EIP-1559 相对应。
- paymaster 数据——可选;由哪个合约代付该操作,以及它所需要的上下文。
- 签名——由账户自身的验证函数来校验,而非由协议校验。
确切的编码方式在 EntryPoint 各版本之间有所变化——v0.7 把部署数据与 paymaster 数据拆分为显式字段,并把若干 Gas 数值压缩打包在一起,而 v0.6 使用的是单一的 initCode 与 paymasterAndData 字节串——但概念上的内容是一样的。如果你要做集成,请确认你的 bundler 面向的是哪个 EntryPoint 版本。
它与普通交易的关键区别在于由谁以及用什么来签名。一笔常规的 Ethereum 交易必须由某个 EOA 的私钥使用固定的 ECDSA 方案签名,并且由同一个账户支付 Gas。而一个 UserOperation 由发送方自己的智能合约账户逻辑来验证——该逻辑可以实现账户所定义的任何签名方案、多密钥规则、会话密钥或授权策略——并且它完全不必以原生 Gas 为自己付费。这种灵活性正是重点所在:是账户,而非协议,来决定什么才算一个有效的动作。
它们所栖身的备用内存池
UserOperation 不会进入常规的 Ethereum 交易内存池,因为它们还不是交易。它们会被广播到一个独立的备用内存池(通常称为 alt-mempool)——一个专门用于 ERC-4337 对象的点对点网络。实际操作中,钱包或 dApp 通过在某个 bundler 的 RPC 端点上调用 eth_sendUserOperation 来提交一个 UserOperation;该 bundler 可以把它扩散到共享的 alt-mempool,也可以留在自己的私有池中。无论哪种方式,消费这些对象的基础设施都在这里监听,而非在基础层的内存池。这种分离让账户抽象流量在被打包进一笔真实交易之前,一直远离共识关键路径。
bundler 的角色
bundler 是把意图变为链上现实的链下角色。它的工作分为四个部分。第一,它从备用内存池收集 UserOperation。第二,它对每一个进行模拟和验证——在模拟环境中运行账户的验证逻辑,以确认签名有效、nonce 正确,且该账户或其 paymaster 能够承担成本。第三,它把一个或多个有效的 UserOperation 打包进一笔普通的 Ethereum 交易。第四,它从自己的 EOA 把该交易提交到网络,预先支付基础层 Gas,并期望在链上获得补偿。
仅靠模拟并不足以构成保护,因为状态可能在模拟与最终上链之间发生变化。因此 ERC-4337 还限制了验证代码被允许做的事:在验证阶段,账户或 paymaster 不得读取区块时间戳或其他环境值——那会让它在链上的行为与模拟时不同——而且它对存储的访问在很大程度上被限制在与其自身账户相关的槽位上。对于代表众多用户行事的合约——尤其是 factory 与 paymaster——则要求其质押保证金,好让单个作恶合约无法以很低的代价一次性使内存池中很大一部分内容失效。这些规则的存在只为一个目的:让 bundler 的模拟成为对链上实际结果的可靠预测。
由于 bundler 垫付 Gas 并因打包上链而赚取手续费,它的行为很像是专门服务于账户抽象流量的区块构建者。它的模拟与验证步骤正是对它自身的保护:它不会打包一个无法向它偿付的操作。
EntryPoint 合约
一切都汇聚到一个单一、规范的智能合约上,称为 EntryPoint。它是一个单例合约,每个版本在各条 EVM 链上都部署在同一地址,并且由它保管着用于支付操作的存款。bundler 的交易是对 EntryPoint 的一次调用,带有一个 UserOperation 数组,随后 EntryPoint 会运行一个严格的两阶段循环。
在验证阶段,它针对每个操作调用发送方账户的验证函数(如果指定了 paymaster,还会调用 paymaster 的),以在链上重新核验签名、nonce 与付款安排,并从付款方那里预留可能产生的最高成本。只有在批次中的所有操作都通过验证之后,它才进入执行阶段,在该阶段把每个操作的 calldata 派发给其账户,以真正执行转账、兑换或其他动作,随后结算真实成本并退还未用完的预留。
这种拆分很重要:把验证与执行分离开,使得一个批次的付款保证在任何改变状态的工作运行之前就已确立,也让 EntryPoint 能够一次性对众多操作精确核算 Gas。它同时意味着某个操作在执行期间失败,并不会连累同批次中的其他操作。
paymaster 位于何处
paymaster 是一个可选合约,它同意代表账户为某个 UserOperation 付费。当一个 UserOperation 包含 paymaster 数据时,EntryPoint 会在验证阶段询问该 paymaster:它是否愿意代付这个操作,以及以什么条件代付;paymaster 则返回一个决定和一段上下文数据。执行完成后,EntryPoint 会在一个后置操作步骤中带着实际消耗的 Gas 回调 paymaster,以代币计费的 paymaster 正是在这一步结算确切金额。paymaster 可以无条件接受(真正的无 Gas 代付,由应用方吸收成本),也可以以换取价值为条件接受——最有用的方式是,向用户收取一种 ERC-20 代币,而非原生 Gas。要更深入地了解这一组件,请参阅什么是 paymaster。paymaster 正是流程中那个把"用户用什么支付"与"网络收到什么"解耦开的挂钩点。
Gas 与失败如何处理
ERC-4337 中的 Gas 是分层的。bundler 为外层交易支付真实的 ETH;EntryPoint 按每个 UserOperation 声明的上限计量其验证与执行 Gas;而无论谁承担付款责任——账户或其 paymaster——都必须已在 EntryPoint 中存入足够的金额来支付账单,该账单在批次结束时结算。有一点后果值得知道:一个 ERC-4337 操作会比等价的普通交易多花一些 Gas,因为在动作本身之外,你还要为合约层面的验证以及 EntryPoint 的记账付费。
失败则由"验证优先"的设计加以约束。如果某个操作在链上验证期间失败,整个批次都会回滚,因此 bundler 会把它剔除并重新组包,而不是任其发生——这正是它的链下模拟所要做的事。如果某个操作通过了验证但其执行发生回滚,则执行产生的效果会被回滚,而已经花费的 Gas 仍会被核算并支付,因此 bundler 不会因诚实的工作而得不到补偿。正是这种不对称,使得 bundler 会如此谨慎地进行模拟:它防止被恶意消耗的手段,就是拒绝纳入任何不会向它偿付的东西。
完整生命周期,按顺序
- 你的钱包构建一个 UserOperation:sender、nonce、calldata、Gas 上限、手续费参数,以及可选的 paymaster 数据。
- 如果使用 paymaster,它会在操作被广播之前先确认代付条件。
- 你账户的签名逻辑为它签名——而这不必是单一的 ECDSA 密钥。
- 钱包把它提交到某个 bundler 的 RPC,它随即进入备用内存池。
- bundler 依据标准中关于受限操作码与存储访问的规则,对它进行模拟和验证。
- bundler 把它与其他操作一起打包进一笔调用 EntryPoint 上
handleOps的 Ethereum 交易,并支付基础层 Gas。 - EntryPoint 验证每一个操作,逐个执行它们的 calldata,从存款中结算成本,退还多余部分,并偿付 bundler。
这为钱包用户带来了什么
这套机制颇为繁复,但它的用意平实而实用:把多个动作合并为一次确认(例如把 approve 与兑换放在一起)、由他人代付或用代币支付的手续费、单一 secp256k1 密钥之外的签名方案、支出策略与会话密钥,以及社交恢复或基于设备的恢复。值得一提的是,EIP-7702 让普通的 EOA 能够临时以智能账户的代码来执行,这在其中一些能力上缩小了差距,但并不取代上文所述的 ERC-4337 基础设施。
WATS 如何运用这一点
在 EVM 链上,WATS 恰恰只依赖这一流程中的一个部件:paymaster 这个位置。当你在 WATS Hot Wallet 中进行转账、兑换或质押时,你的钱包所构建的 UserOperation 会指定一个 paymaster,而正是这个 paymaster 让手续费能够以 ATS 收取,而非以链上的原生 Gas 代币收取——因此你无需为了能够动用资金,而在每条网络上都留着一点 ETH、BNB 或 POL 的零头。你不需要自己运行 bundler、挑选 EntryPoint 版本,也不需要持有 bundler 的 RPC 密钥;那些属于基础设施,而钱包的职责是构建一个有效的 UserOperation 并把它提交出去。
两点澄清可以让这件事保持诚实。第一,用 ATS 付费并不是折扣——网络照常收取它正常的手续费,由 paymaster 结清,所以改变的只是从你余额中扣走哪种代币,而不是底层成本。第二,ERC-4337 仅限 EVM,因此在 Solana 和 TON 上,扮演 paymaster 角色的是一种等效的 fee-payer 安排,而非这里描述的 EntryPoint 流程。ATS 是一个 LayerZero OFT,正因如此,单一的 ATS 余额即可覆盖 Ethereum、Arbitrum、Optimism、Base、Polygon、BNB Chain、Solana 与 TON 上的手续费;所收取的 ATS 会被销毁,使供应量从 100,000,000 降至 30,000,000 的下限。WATS 全程完全非托管:私钥由你持有,WATS 从不持有任何一把。
如果你想把这一流程当作一个真正运转的系统来看,而不是一份规范文档,具体的一步是:在一条你完全没有原生 Gas 代币的链上,试着用 WATS Hot Wallet 做一笔转账。UserOperation、bundler 与 EntryPoint 都在你看不见的地方完成各自的工作,而手续费则从你的 ATS 余额中扣除。ATS 手续费模型如何运作把这套机制从头到尾讲清楚了。
常见问题
什么是 UserOperation?它与普通 Ethereum 交易有什么区别?
UserOperation 是 ERC-4337 定义的已签名意图对象——它描述一个智能合约账户想要完成什么,以及验证并支付它所需要的 nonce、Gas 上限、手续费参数和可选的 paymaster 细节。普通交易由外部拥有账户使用固定的 ECDSA 签名,并以链上的原生代币支付自己的 Gas。而 UserOperation 由发送方账户自身的逻辑来验证,该逻辑可以使用自定义的签名方案或策略,并且它不必以原生 Gas 为自己付费,因为 paymaster 可以承担手续费。UserOperation 还通过一个独立的备用内存池传播,而非标准的交易内存池,只有当 bundler 把它们打包时,才会变成一笔真正的交易。
ERC-4337 bundler 究竟做什么?
bundler 从备用内存池收集 UserOperation,对每一个进行模拟和验证,以确认签名、nonce 以及付款能够被覆盖,然后把有效的那些打包进一笔调用 EntryPoint 合约的普通 Ethereum 交易。它从自己的账户提交该交易,垫付基础层 Gas,并期望从账户或其 paymaster 在 EntryPoint 中的存款里获得链上偿付。ERC-4337 限制了验证代码可以读取和触碰的内容,并要求 paymaster 与账户 factory 质押保证金,正是为了让 bundler 的链下模拟能够可靠地预测链上行为——谨慎的模拟正是保护它不去纳入那些不会向它偿付的操作的手段。
什么是 EntryPoint 合约?为什么要把验证与执行分开?
EntryPoint 是每一个 ERC-4337 操作都要经过的那一个规范合约;它是一个单例合约,每个版本在各条 EVM 链上都部署在同一地址,并保管着用于支付操作的存款。当 bundler 提交一个批次时,EntryPoint 会先验证其中的每一个 UserOperation——调用每个账户以及每个 paymaster 的验证函数,并预留可能产生的最高成本——之后才逐个执行它们的 calldata,结算实际成本并退还差额。把两个阶段分开,意味着在任何改变状态的工作运行之前付款就已得到保证,Gas 可以在整个批次范围内被精确计量,而且某个操作在执行期间回滚也不会影响其他操作。
我需要自己运行 bundler 或调用 EntryPoint 吗?
不需要。bundler 与 EntryPoint 都是位于钱包背后的基础设施:你的钱包构建并签署 UserOperation,把它提交到某个 bundler 的 RPC 端点,此后的一切都是自动完成的。以 WATS Hot Wallet 为例,你像平常一样确认一笔转账或兑换,ERC-4337 的这套机制在你看不见的地方运行——唯一可见的区别是网络手续费以 ATS 收取,而不是以链上的原生 Gas 代币收取。
ERC-4337 是否允许我用 ETH 以外的代币支付 Gas 费?
在使用 paymaster 时可以,而 WATS 就是一个具体的例子:在 EVM 链上,WATS Hot Wallet 使用一个 ERC-4337 paymaster,因此网络手续费以 ATS 收取,而不是 ETH、BNB、POL 或其他原生 Gas 代币。就机制而言,paymaster 是一个可选合约,它在验证期间告诉 EntryPoint 自己会承担某个操作,随后结算真实成本,并以另一种方式向用户收费——通常是收取某种 ERC-20 代币。这并不是折扣:链上照样收到它以自身币种计价的正常手续费,改变的只是从你余额中扣走哪种代币。ERC-4337 及其 paymaster 仅限 EVM;Solana 和 TON 等非 EVM 链则用一个等效的 fee-payer 或中继器实现类似的结果。

