ERC 4337引入了以太坊的账户抽象,允许更灵活和用户友好的账户模型。
作者 | 徐煜伦、刘力勋、王伟诚、蔡育呈、郑传嶷
你曾经在以太坊上进行交易或是使用 Dapp 时,遇到 ETH 不够付手续费的窘境吗?无论是刚刚加入加密货币圈的新手们,还是在币圈打滚多年的老韭菜,遇到这种情况都会相当头痛。然而,支付手续费的流程是当前区块链网络中必不可少的一部分,但当它成为 web3 普及化的障碍时,我们该如何解决这个问题呢?
在 Ethereum 上两种账户 : EOA (Externally Owned Account) 和 Contract 的区别。
在以太坊上有 外部拥有账户 (EOA) 和 合约账户 (Contract) 两种账户类型,其中只有 EOA 能够发起一个交易 (Tx);而合约账户仅能被 EOA 调用,与其他账户进行互动,可见外部拥有账户是驱动以太坊所有交易的主体。
传统的以太坊账户会由使用者自己的 private key 进行签名,并送至 Transaction Pool,由矿工来验证并且决定是否要纳入当前区块。 ( source)
但是,外部拥有账户拥有诸多的限制:
有鉴于上述的限制,于是开始就有人想:
有没有可能做出一种解耦所有者 (Owner)、手续费支付者 (gas payer)、签名者 (signer) 的可自订逻辑账户呢?
账户抽象 (Account Abstraction) 的目标是将三个功能从现有的架构解 耦出来。 Owner 是账户的所有者,是资产的持有者,拥有更改、转移资产等能力; Signer 是签署者,是发起交易的实体,使用密码学算法对交易进行签名,并且有方法能验证签名的合法性。Gas Payer 是手续费支付者,负责以原生代币支付燃料费用。
在过去,有人提出一些方法来试图达到以上的目标。
Relayer & Meta Transaction | source
Relayer 允许用户送出签名后的元交易 (Meta Transaction) 至链下中心化的服务器,再交由 Relayer 的私钥再次进行签名后送给矿工。
这样的模式可以允许第三方为用户的操作支付手续费,并且能够保护用户的隐私,在链上可以隐匿资产转移的关系。Tornado Cash 就是使用者这种方法在 Withdraw 的时候从提领的金额中扣除手续费。
然而,这个方法必须要全权相信中心化的 Relayer 服务,并不理想。
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 phase
、 execution phase
。
verification phase
限制交易不能调用其他合约、不能使用全局变量、不能更改任何状态 (state),如果这个阶段没有通过,则矿工 (miners) 会将这笔交易排除。execution phase
,因为账户已经由 PAYGAS
支付了手续费,若交易在这个阶段失败,矿工仍然可以选择要不要在区块内纳入这笔交易。由于这个提案改动幅度过大,新形态的交易与以太坊过去的形式大不相同,需要更多的时间去深入分析,目前尚未被采纳。
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) 等问题。
有鑑於过去的 EIP 2938 和 EIP 3074 都会导致共识层面的改动,于是 Vitalik 等人提出了 EIP 4337,在最大兼容性下完成账户抽象的任务。
以下是一些会出现的角色名称与职责 :
首先,让我们来看看 User Operation 的定义,与重要栏位的介绍。
这是 solidity 内实际定义的 User Operation
initCode
( Contract factory 的地址还有相应的参数 )callData
是实际要调用的合约、函数与参数 ( e.g. swap token, transfer)paymasterAndData
可以指定手续费支付者与相应的参数。signature
是将 UserOperation 的其他栏位和 chainId
还有 EntryPoint Contract address
进行签名。签名算法可以自行选择,不必使用以太坊标准的 ECDSA 签名方法。这是 ERC4337 的流程图总览。ERC 4337 加入了新的交易对象 User Operation 与新的角色 Bundler。
这是 User Operation 在链上执行的流程图,其中黄色为外部合约的调用,蓝色是 EntryPoint 合约内部的函数。虚线部分为 EntryPoint 里面实际调用的外部函数。
initCode
则部署一个新的接下来,我们来看看 eth-infinitism 实作的 Account Abstraction 示例。
这个实作允许 User 事先在 Paymaster 中存入 ERC20,支付手续费时,会参考用掉的 gas 与 token oracle 的价格来抵用 Paymaster 代垫的原生代币。
成为 Deposit Paymaster 的流程
Deposit Paymaster 的储值与付款流程
4. 用户必须要先将 ERC 20 储值进 Deposit Paymaster
5. EntryPoint 在执行 PostOP 时,会调用 Deposit Paymaster 并扣减 User 先前存入的 ERC 20 ,补偿 Deposit Paymaster 先前支付的燃料费用。
综上所述,我们在这里做一个简单的比较,看 EOA 与新的 AA Wallet 之间的各项优劣。
比较 AA Wallet 和普通 EOA 的差异。
以太坊的 EOA 遗失私钥就等于失去所有资产,并且没有任何方式可以复原。
不过在 ERC 4337 ,由于 Signature 不再仅限于以太坊传统的 ECDSA,可以自行使用想要的签名算法。所以本质上 AA Wallet 是可以支援原生的多签钱包 (MultiSig Wallet),能更灵活的由多方共管账户;此外,也能够通过社交恢复来重置合约账户的所有权,使用如 gmail 邮箱验证来取回合约账户的存取权限 ( 参考 UniPass Wallet )。
由于以太坊传统的签名算法 ECDSA 在量子时代并不安全,我们可以自行采用后量子签名算法 (quantum safe signatures),以确保资产的安全性。
由于引入了 Paymaster 作为手续费支付者的角色,AA Wallet 可以不用自己付手续费。Dapp 可以协助用户支付他们操作的手续费,改善用户体验。用户也可以使用 ERC20 支付手续费,这是过去 EOA 无法做到的事情。
过去一个 EOA 一次只能进行一笔交易,然而通过 ERC 4337 ,我们可以将不同的交易都放在 User Operation 中 callData
的栏目里,可以原子性地 (atomic) 一次执行多种不同的交易。
ERC 4337 温和地解决了以太坊 EOA 灵活性不足的问题,然而,他本身也存在一些问题。
过去 EOA 和 EOA 之间的转账只需要消耗 21000 Gwei ,然而使用了 ERC 4337 之后,因为一定会发生合约调用,所以也额外产生了一些费用,导致 User Operation 的成本相对比较高。 详情可以参考这篇文章
目前最好的解决办法是利用 Layer 2 来进行交易,能显著降低手续费成本。
前面有提到,Paymaster 之所以要向 EntryPoint质押原生代币,是为了避免恶意的 Paymaster 进行 DoS 攻击。
由于 Paymaster 为第三方实现的合约,按照下面的流程,它可以让 Bundler 送出无效的交易,让 Bundler 白白浪费交易手续费 :
true
postOP
取得补偿的原生代币所以当 Paymaster 发生恶意行为时,可以借助 reputation, throttling and banning section 这段描述的机制来惩罚 Paymaster。
我们在这个链接有更详尽的代码解释与分析笔记,欢迎大家参考。
https://dog-tip-98e.notion.site/EIP-4337-Account-Abstraction-46f4f94e265043ed91167d9de78ae48c?pvs=4
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!