ERC 4337 | 账户抽象

ERC 4337引入了以太坊的账户抽象,允许更灵活和用户友好的账户模型。

作者 | 徐煜伦、刘力勋、王伟诚、蔡育呈、郑传嶷

你曾经在以太坊上进行交易或是使用 Dapp 时,遇到 ETH 不够付手续费的窘境吗?无论是刚刚加入加密货币圈的新手们,还是在币圈打滚多年的老韭菜,遇到这种情况都会相当头痛。然而,支付手续费的流程是当前区块链网络中必不可少的一部分,但当它成为 web3 普及化的障碍时,我们该如何解决这个问题呢?

Introduction

在 Ethereum 上两种账户 : EOA (Externally Owned Account) 和 Contract 的区别。

在以太坊上有 外部拥有账户 (EOA) 和 合约账户 (Contract) 两种账户类型,其中只有 EOA 能够发起一个交易 (Tx);而合约账户仅能被 EOA 调用,与其他账户进行互动,可见外部拥有账户是驱动以太坊所有交易的主体。

传统的以太坊账户会由使用者自己的 private key 进行签名,并送至 Transaction Pool,由矿工来验证并且决定是否要纳入当前区块。 ( source)

但是,外部拥有账户拥有诸多的限制:

  1. 需要 自行维护私钥或助记词,遗失或是被黑就等于失去所有资产
  2. 外部拥有账户 无法定义函数与逻辑 (例如想要设置黑名单、每日交易限额),欠缺灵活性。
  3. 只能够使用 Ether 付手续费
  4. 不支持原生的多签钱包,要通过智能合约实现

有鉴于上述的限制,于是开始就有人想:

有没有可能做出一种解耦所有者 (Owner)、手续费支付者 (gas payer)、签名者 (signer) 的可自订逻辑账户呢?

账户抽象 (Account Abstraction) 的目标是将三个功能从现有的架构解 耦出来。 Owner 是账户的所有者,是资产的持有者,拥有更改、转移资产等能力; Signer 是签署者,是发起交易的实体,使用密码学算法对交易进行签名,并且有方法能验证签名的合法性。Gas Payer 是手续费支付者,负责以原生代币支付燃料费用。

Background

在过去,有人提出一些方法来试图达到以上的目标。

  • Relayer 试图通过链下服务器来解决问题,不过这个方法是一个中心化的解决方法。
  • EIP 2938 和 EIP 3074 都试图引入新的 OpCode 来达到目标,不过两者提出的方法都会导致共识协议的更改,由于需要实施硬分叉,他们的成效尚难以评估。

Relayer

Relayer & Meta Transaction | source

Relayer 允许用户送出签名后的元交易 (Meta Transaction) 至链下中心化的服务器,再交由 Relayer 的私钥再次进行签名后送给矿工。

这样的模式可以允许第三方为用户的操作支付手续费,并且能够保护用户的隐私,在链上可以隐匿资产转移的关系。Tornado Cash 就是使用者这种方法在 Withdraw 的时候从提领的金额中扣除手续费。

然而,这个方法必须要全权相信中心化的 Relayer 服务,并不理想。

EIP 2938

https://ethereum-magicians.org/t/implementing-account-abstraction-as-part-of-eth1-x/4020

这个提案首先提出了 Account Abstraction (AA) 的概念,有一种新形态的 Contract Account 可以发送交易、支付手续费、定义交易的验证方法与使用程序代码定义 maximum gas。

该提案主要引入了新的 OpCode PAYGAS (0x49) ,以 PAYGAS 为分野将节点验证分成两个主要部分 verification phaseexecution phase

  • verification phase 限制交易不能调用其他合约、不能使用全局变量、不能更改任何状态 (state),如果这个阶段没有通过,则矿工 (miners) 会将这笔交易排除。
  • execution phase,因为账户已经由 PAYGAS 支付了手续费,若交易在这个阶段失败,矿工仍然可以选择要不要在区块内纳入这笔交易。

由于这个提案改动幅度过大,新形态的交易与以太坊过去的形式大不相同,需要更多的时间去深入分析,目前尚未被采纳。

EIP 3074

EIP 3074 Transaction Flow | source

在 EIP 3074 中,提出了一个授权智能合约代表 EOA 进行操作的新的 OpCode AUTH (0xf6)AUTHCALL(0xf7)

  • AUTH 和签名消息可以允许智能合约控制用户的账户
  • AUTHCALL 可以让智能合约代表 EOA 进行操作。

由于签名消息并不一定要用原本 EOA 账户发送,这允许用户可以通过第三方支付手续费,甚至能以 ERC 20 支付燃料费用。这个机制相当于是对现有 EOA 的一个升级,不过由于它赋予了调用者拥有授权者的所有权力,可能会 导致治理劫持 (Governance hijacking) 或是跨链重放 (Cross Chain Replay) 等问题

Proposed Method

有鑑於过去的 EIP 2938 和 EIP 3074 都会导致共识层面的改动,于是 Vitalik 等人提出了 EIP 4337,在最大兼容性下完成账户抽象的任务。

以下是一些会出现的角色名称与职责 :

  • AA Wallet 或是 Sender 都是合约账户的意思
  • EntryPoint Contract 是用户互动的入口,可以想成 gateway
  • Paymaster 是手续费支付者,必须向 EntryPoint 质押足够数量的原生代币才能够成为 Paymaster,避免恶意的 Paymaster 进行 DoS (详见最后一段的 Security )。在质押之后,还需要进行储值 (Deposit),Paymaster 会利用这些 Deposit 来为 User Operation 进行付款。

spec

首先,让我们来看看 User Operation 的定义,与重要栏位的介绍。

这是 solidity 内实际定义的 User Operation

  1. sender 是合约账户的地址,是由 EIP 1014 计算出来的,如果需要部署一个新的合约账户,则要填写 initCode ( Contract factory 的地址还有相应的参数 )
  2. callData 是实际要调用的合约、函数与参数 ( e.g. swap token, transfer)
  3. paymasterAndData 可以指定手续费支付者与相应的参数。
  4. signature 是将 UserOperation 的其他栏位和 chainId 还有 EntryPoint Contract address 进行签名。签名算法可以自行选择,不必使用以太坊标准的 ECDSA 签名方法。

Flow

这是 ERC4337 的流程图总览。ERC 4337 加入了新的交易对象 User Operation 与新的角色 Bundler。

  1. 用户创建一个 User Operation
  2. 用户使用 任何签名算法 对 User Operation 签名 ( 过去以太坊的交易只能使用 ECDSA )
  3. 用户将 UserOperation 送至链下的 User Operation mempool
  4. Bundler 会从 mempool 中挑选出一些 User Operation 进行打包
  5. 打包完后会送给矿工并上链

这是 User Operation 在链上执行的流程图,其中黄色为外部合约的调用,蓝色是 EntryPoint 合约内部的函数。虚线部分为 EntryPoint 里面实际调用的外部函数。

Invocation Flow

  1. 会先去检查 User Operation 的 AA Wallet 是否存在,如果不存在且有提供 initCode 则部署一个新的
  2. 执行1 : 调用 AA Wallet 里面的函数来检查签名是否合法
  3. 检查指定的 Paymaster 是否有抵押,并且检查 Paymaster的存款是否足够
  4. 执行 2 : 调用 Paymaster 里面的函数来进行支付相关的检查 (e.g. AA Wallet 是否有在 Paymaster 存入足够的 ERC20 来抵用手续费)
  5. 执行 3 : 执行 User Operation 中的主要逻辑 (e.g. Swap token)
  6. 执行 4 : 偿还 Paymaster 帮忙垫付的手续费,还有给 Bundler 打包费用

Case Study

接下来,我们来看看 eth-infinitism 实作的 Account Abstraction 示例

Deposit Paymaster

这个实作允许 User 事先在 Paymaster 中存入 ERC20,支付手续费时,会参考用掉的 gas 与 token oracle 的价格来抵用 Paymaster 代垫的原生代币。

成为 Deposit Paymaster 的流程

  1. Deposit Paymaster 会需要先向 EntryPoint 抵押足够数量的原生代币
  2. 存入未来要替用户支付的原生代币
  3. 在 Deposit Paymaster 里添加 Token 的白名单与相应的价格预言机地址

Deposit Paymaster 的储值与付款流程

4. 用户必须要先将 ERC 20 储值进 Deposit Paymaster

5. EntryPoint 在执行 PostOP 时,会调用 Deposit Paymaster 并扣减 User 先前存入的 ERC 20 ,补偿 Deposit Paymaster 先前支付的燃料费用。

Comparison

综上所述,我们在这里做一个简单的比较,看 EOA 与新的 AA Wallet 之间的各项优劣。

比较 AA Wallet 和普通 EOA 的差异。

Private Key Management

以太坊的 EOA 遗失私钥就等于失去所有资产,并且没有任何方式可以复原。

不过在 ERC 4337 ,由于 Signature 不再仅限于以太坊传统的 ECDSA,可以自行使用想要的签名算法。所以本质上 AA Wallet 是可以支援原生的多签钱包 (MultiSig Wallet),能更灵活的由多方共管账户;此外,也能够通过社交恢复来重置合约账户的所有权,使用如 gmail 邮箱验证来取回合约账户的存取权限 ( 参考 UniPass Wallet )。

Verification Mechanism

由于以太坊传统的签名算法 ECDSA 在量子时代并不安全,我们可以自行采用后量子签名算法 (quantum safe signatures),以确保资产的安全性。

Pay Tx Fee

由于引入了 Paymaster 作为手续费支付者的角色,AA Wallet 可以不用自己付手续费。Dapp 可以协助用户支付他们操作的手续费,改善用户体验。用户也可以使用 ERC20 支付手续费,这是过去 EOA 无法做到的事情。

Multi-Call

过去一个 EOA 一次只能进行一笔交易,然而通过 ERC 4337 ,我们可以将不同的交易都放在 User Operation 中 callData 的栏目里,可以原子性地 (atomic) 一次执行多种不同的交易。

Problems

ERC 4337 温和地解决了以太坊 EOA 灵活性不足的问题,然而,他本身也存在一些问题。

Higher Gas Fee

过去 EOA 和 EOA 之间的转账只需要消耗 21000 Gwei ,然而使用了 ERC 4337 之后,因为一定会发生合约调用,所以也额外产生了一些费用,导致 User Operation 的成本相对比较高。 详情可以参考这篇文章

目前最好的解决办法是利用 Layer 2 来进行交易,能显著降低手续费成本。

Security

前面有提到,Paymaster 之所以要向 EntryPoint质押原生代币,是为了避免恶意的 Paymaster 进行 DoS 攻击。

由于 Paymaster 为第三方实现的合约,按照下面的流程,它可以让 Bundler 送出无效的交易,让 Bundler 白白浪费交易手续费 :

  1. 建立恶意的 Paymaster contract,检查函数都返回 true
  2. 当 UserOperation 进 mempool 的时候,所有的模拟和检查都会通过
  3. 当 Bundler 打包交给矿工时,Paymaster 可以从合约提出所有的原生代币并且 frontrun Bundler 的上链请求
  4. 最终当 Bundler 的交易被执行时,就会发生 revert ,导致 Bundler 无法从 postOP 取得补偿的原生代币

所以当 Paymaster 发生恶意行为时,可以借助 reputation, throttling and banning section 这段描述的机制来惩罚 Paymaster。

Code Explanation

我们在这个链接有更详尽的代码解释与分析笔记,欢迎大家参考。

https://dog-tip-98e.notion.site/EIP-4337-Account-Abstraction-46f4f94e265043ed91167d9de78ae48c?pvs=4

References

  1. EIP 4337 | Ethereum Improvement Proposals, no. 4337
  2. EIP 3074 | Ethereum Improvement Proposals, no. 3074
  3. ERC 4337 | account abstraction without Ethereum protocol changes
  4. Amber Group | Account Abstraction Will Evolve Wallets
  5. Stackup | Introduction to Account Abstraction
  6. Unipass | Email Recovery
  7. imToken | ETH Taipei AA Workshop
  8. Medium | Account Abstraction 抽象账户:EIP-3074 与 EIP-4337 简介
  9. Medium | Account Abstraction 抽象账户:EIP-2938 简介
  10. Medium | Ethereum wallets today and tomorrow
  11. BDAF | Account Abstraction Presentation Slide
  12. BDAF | Account Abstraction Notion Site
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
alan890104
alan890104
江湖只有他的大名,没有他的介绍。