# Eip4337分析（一）

本文是VB的文章学习笔记：https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a
### Why

如果你关注Crypto，会发现，私钥泄露造成的损失，不计其数，最近的Harmony跨链桥Horizon，据分析可能是因为私钥泄露，链上资产被席卷一空。过往的个人、组织因为私钥泄露或者助记词丢失造成的损失，也很常见。

如果有一种钱包，跨越EOA(Externally-Owned Account)类别的标准钱包，例如Metamask等，以Smart Contract方式来存储和管理资产，具备多个私钥共同管理的特性，丢失某个私钥，可以通过Social Recovery方式恢复，那是否能够避免那么大的资产损失呢？或许有可能。

如同一个人原来具备很多社会关系：家庭、朋友或者几个有深度链接的社会组织，然后某日突然失踪，归来后无法证明自己是自己了，但是，自己拥有的社会链接有两端：一端是自身（过往的经历、信息掌握、技能、情感共鸣场景等等），一端是共同经历这些社会场景的社会关系。那这些社会关系，是可以完成**我是我**的证明的。究其根源，因为这些积累需要时间沉淀，并且具备多维度的复杂度，别人要仿冒，非常难完成在社会关系端的仿冒，因为你无法欺骗或者植入虚假信息给那么多社会关系，需要巨大成本也不一定能够完成。

EIP4337就是尝试完成这一目标（当然还有其他提升），我们来分析下具体的原理和可能的应用场景。

### How

事实上，当下的EOA钱包为Crypto的推广和安全，立下了汗马功劳，但是，随着场景的展开，复杂度的提升，资产数额的增加，对EOA提出了很多挑战，不仅仅是需要Social Recovery一个场景提升。
我们分析和研究了如下资料：

1. ERC4337概述
   https://medium.com/infinitism/erc-4337-account-abstraction-without-ethereum-protocol-changes-d75c9d94dc4a
2. https://github.com/ethereum/EIPs/blob/3fd65b1a782912bfc18cb975c62c55f733c7c96e/EIPS/eip-4337.md
3. The road to account abstraction https://notes.ethereum.org/@vbuterin/account_abstraction_roadmap
4. https://www.youtube.com/watch?v=r3ZSk4PeqxQ 
5. https://www.youtube.com/watch?v=r3ZSk4PeqxQ&ab_channel=BlockExplorer

#### Background

VB（Vitalik Buterin）总结了几个能够解决当下问题的[抽象账户](https://docs.ethhub.io/ethereum-roadmap/ethereum-2.0/account-abstraction/)的新特性：

1. 多签和[社会化恢复](https://vitalik.ca/general/2021/01/11/recovery.html)
2. 更高效简单的签名算法(例如Schnorr, BLS)
3. 超量(Post-quantum)安全算法(例如Lamport, Winternitz)
4. 可升级

对于抽象账户方案选择上，其实有很多种，完全另起炉灶的建设我们设计的对EOA不足之处的迭代产品，也是一个思路。但考虑到客户交互的兼容性、时间成本，我们选择了4337的协议实现逻辑为基础。事实上，在此之前已经有了[EIP2938](https://eips.ethereum.org/EIPS/eip-2938),不过是基于对于合约的较大改动。

先叙述下原来场景：EOA通过ECDSA椭圆曲线加密算法，对transaction进行打包后发送到区块链节点上链，需要最低21000 gas。折旧需要EOA提供gas或者第三方提供gas来完成。如果基于EOA构建，就会需要两个钱包（更复杂），或者依赖Relay中继来帮助（更中心化）。

EIP2938修改了底层协议，允许交易从一个合约发起，合约完成认证和payfee的工作，minner完成校验。EIP4337完成同样目标，但不会引起共识层的变动。

#### Smart contract wallet logic flow

EIP4337在更高层实现了transaction mempool的功能复制。用户发送`UserOperation`+签名和需要验证的data。

Miners or bundlers都可以用类似Flashbots的服务，对`UserOperation`进行打包，进入一个bundle transaction，然后进入一个以太坊区块。

敏感的读者会看到，原来新钱包思路通过合约方式复制mempool对交易的处理，从而达到可以发起独立交易、支付gas的功能，当然，还实现了上面的几个算法改进、可升级功能，听起来很不错。


![wallet1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1656336580707/kcbShS6Uj.png align="left")

Bundler会支付gas fee，通过批量的individual `UserOperation`gasfee得到补偿（有差价）。Bundler会基于gasfee优先的基本原则，和miners选择进入mempool的逻辑类似。UserOperation结构如下：

```
{
sender: the wallet making the operation
nonce and signature: parameters passed into the wallet’s verification function so the wallet can verify an operation
initCode: the init code to create the wallet with if the wallet does not exist yet
callData: what data to call the wallet with for the actual execution step
}
```

详细的参考这里[github-4337](https://github.com/ethereum/EIPs/blob/3fd65b1a782912bfc18cb975c62c55f733c7c96e/EIPS/eip-4337.md)，核心是sender发起人，nonce随机数，initcode，初始化创建参数，calldata。



#### Entry point

Smart contract 有两个功能：

1. `validateUserOp`,输入UserOperation，验证signature and nonce，然后payfee，交易成功increment the nonce，交易失败抛错误。
2. 解析`calldata`为钱包指令，并执行钱包指令，例如存入、支付、抵押、授权等等。这些动作是末端开放的，例如可以发起更多的calls，和其他组件交互。

类似多数的复杂合约，相比于用钱包合约自身保障安全性，更好的方式在一个global contract下，可以命名为`entry point`，`validateUserOp`的动作，可以通过`require(msg.sender == ENTRY_POINT)`，即只相信通过一个特定网关来发起，然后钱包再执行指令、支付gas以及成功后的nonce increment等。`entry point`本质上完成对钱包的安全保障。通过受信任的`entry point`发起，合约钱包可以完成任何指令动作、gas支付。VB的观点是这些已经足够保护钱包不会被攻击了。

如果钱包不存在，`entry point`还负责创建这个钱包，根据`initCode`.


![wallet2.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1656336595608/Yt3hbMGv_.png align="left")
**Entry point control flow when running `handleOps`**

当解析validateUserOp时，对于mempool nodes and bundlers有一些约束，需要强制执行：

1. 不能read or write storage of other contracts，你不能读写其他合约的storage。
2. 不能使用  environment opcodes such as `TIMESTAMP`
3. 不能调用其他合约，除非证明被调用合约是无法自毁的。

以上需要validateUserOp操作进行模拟，需要bundlers and `UserOperation` mempool nodes，对UserOperation进行验证。

如果被模拟执行成功，则UserOperation被保障包含进打包，直到sender有了其他internal state的变动。

其他的变动可能是同一个sender发出另外一个UserOperation，或者another contract calling the sender。出发这些需要额外的7500gas。

另外，UserOperation如果限定了validateUserOp步骤的gas limit，mempool nodes and bundlers 会拒绝，出发非常小，例如小于200000（这里没太懂）。

这些约束重复了以太坊交易用来防止DoS攻击的核心属性。Bundlers and mempool nodes 可以用此类似逻辑来确认是否include UserOperation。



#### Trade off

相比于常规的以太坊交易mempool而言，此协议增加、改变或者牺牲了什么属性？

上面叙述了EIP4337的工作流程，这里来做一些权衡对比。

##### 维护的属性

- **无中心化参与者**; 所有的都是 peer-to-peer mempool。
- **DoS safety** ，这个上面已经分析了。
- **用户端无复杂设置**: 用户不用关注钱包是否创建等细节， 钱包会以确定性的 CREATE2 addresses方式存在, 没有会自动重建。
- **付费可覆盖前步交易**, 可以发送一个新的`UserOperation`，用更高的gas来覆盖或者加速交易。

##### 新增的属性

- **灵活的验证属性**: the `validateUserOp` 验证功能可以添加 arbitrary signature 和once 验证逻辑 (新签名格式, 多签…)

- **重复实现执行层的 quantum-safe**: 如果本协议普遍适用, 就不用在执行层再为量子安全做额外工作. 可独立升级钱包到本协议.

  尽管包装（wrapper）交易是安全的, minde可以用新创建的wallet， 因此hash保护的 EOA ，为每个交易bundle在打包进入一个区块前不会发布交易.

- **Wallet 可升级**: wallet 认证逻辑可以是稳定的, 因此 wallets 可更改自己的publick keys，如果使用了代理调用)，则可升级整体代码.

- **灵活的执行逻辑**: wallets 可以为执行步骤添加自定义逻辑 , 例如自动的原子多操作 (a key goal of [EIP 3074](https://eips.ethereum.org/EIPS/eip-3074))。

##### 带来的缺点

- **轻微提升了DoS易攻击性** 不考虑协议的好的影响, 因为验证逻辑允许比单一椭圆曲线加密更复杂的算法。
- **Gas 超量**: 有的时候会比当下多一些的gas (尽管一些场景已经使用了multi-call).
- **一次一个交易**: 帐户不能队列话并将多个交易发送到内存池。不过执行原子多操作的能力让它变得不重要了。


