Eip4337分析(一)
本文是VB的文章学习笔记:medium.com/infinitism/erc-4337-account-abst..
Why
如果你关注Crypto,会发现,私钥泄露造成的损失,不计其数,最近的Harmony跨链桥Horizon,据分析可能是因为私钥泄露,链上资产被席卷一空。过往的个人、组织因为私钥泄露或者助记词丢失造成的损失,也很常见。
如果有一种钱包,跨越EOA(Externally-Owned Account)类别的标准钱包,例如Metamask等,以Smart Contract方式来存储和管理资产,具备多个私钥共同管理的特性,丢失某个私钥,可以通过Social Recovery方式恢复,那是否能够避免那么大的资产损失呢?或许有可能。
如同一个人原来具备很多社会关系:家庭、朋友或者几个有深度链接的社会组织,然后某日突然失踪,归来后无法证明自己是自己了,但是,自己拥有的社会链接有两端:一端是自身(过往的经历、信息掌握、技能、情感共鸣场景等等),一端是共同经历这些社会场景的社会关系。那这些社会关系,是可以完成我是我的证明的。究其根源,因为这些积累需要时间沉淀,并且具备多维度的复杂度,别人要仿冒,非常难完成在社会关系端的仿冒,因为你无法欺骗或者植入虚假信息给那么多社会关系,需要巨大成本也不一定能够完成。
EIP4337就是尝试完成这一目标(当然还有其他提升),我们来分析下具体的原理和可能的应用场景。
How
事实上,当下的EOA钱包为Crypto的推广和安全,立下了汗马功劳,但是,随着场景的展开,复杂度的提升,资产数额的增加,对EOA提出了很多挑战,不仅仅是需要Social Recovery一个场景提升。 我们分析和研究了如下资料:
- ERC4337概述 medium.com/infinitism/erc-4337-account-abst..
- github.com/ethereum/EIPs/blob/3fd65b1a78291..
- The road to account abstraction notes.ethereum.org/@vbuterin/account_abstra..
- youtube.com/watch?v=r3ZSk4PeqxQ
- youtube.com/watch?v=r3ZSk4PeqxQ&ab_chan..
Background
VB(Vitalik Buterin)总结了几个能够解决当下问题的抽象账户的新特性:
- 多签和社会化恢复
- 更高效简单的签名算法(例如Schnorr, BLS)
- 超量(Post-quantum)安全算法(例如Lamport, Winternitz)
- 可升级
对于抽象账户方案选择上,其实有很多种,完全另起炉灶的建设我们设计的对EOA不足之处的迭代产品,也是一个思路。但考虑到客户交互的兼容性、时间成本,我们选择了4337的协议实现逻辑为基础。事实上,在此之前已经有了EIP2938,不过是基于对于合约的较大改动。
先叙述下原来场景: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的功能,当然,还实现了上面的几个算法改进、可升级功能,听起来很不错。
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,核心是sender发起人,nonce随机数,initcode,初始化创建参数,calldata。
Entry point
Smart contract 有两个功能:
validateUserOp
,输入UserOperation,验证signature and nonce,然后payfee,交易成功increment the nonce,交易失败抛错误。- 解析
calldata
为钱包指令,并执行钱包指令,例如存入、支付、抵押、授权等等。这些动作是末端开放的,例如可以发起更多的calls,和其他组件交互。
类似多数的复杂合约,相比于用钱包合约自身保障安全性,更好的方式在一个global contract下,可以命名为entry point
,validateUserOp
的动作,可以通过require(msg.sender == ENTRY_POINT)
,即只相信通过一个特定网关来发起,然后钱包再执行指令、支付gas以及成功后的nonce increment等。entry point
本质上完成对钱包的安全保障。通过受信任的entry point
发起,合约钱包可以完成任何指令动作、gas支付。VB的观点是这些已经足够保护钱包不会被攻击了。
如果钱包不存在,entry point
还负责创建这个钱包,根据initCode
.
Entry point control flow when running
handleOps
当解析validateUserOp时,对于mempool nodes and bundlers有一些约束,需要强制执行:
- 不能read or write storage of other contracts,你不能读写其他合约的storage。
- 不能使用 environment opcodes such as
TIMESTAMP
- 不能调用其他合约,除非证明被调用合约是无法自毁的。
以上需要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)。
带来的缺点
- 轻微提升了DoS易攻击性 不考虑协议的好的影响, 因为验证逻辑允许比单一椭圆曲线加密更复杂的算法。
- Gas 超量: 有的时候会比当下多一些的gas (尽管一些场景已经使用了multi-call).
- 一次一个交易: 帐户不能队列话并将多个交易发送到内存池。不过执行原子多操作的能力让它变得不重要了。