Home EIP-7702 浅析
Post
Cancel

EIP-7702 浅析

概述

随着以太坊Pectra升级的临近,EIP-7702也将随之到来。作为一个重要的更新,它将影响智能合约钱包和账户抽象领域。然而,在中文社区中关于这一议题的讨论相对较少。本文旨在简要介绍EIP-7702及其带来的一些思考。如果你对EIP-7702已经非常了解,可以跳过背景部分,直接查看我对这一提案的思考

背景

以太坊在面向大众使用(Mass Adoption)过程中面临一个挑战——账户问题。普通的EOA(外部拥有账户)功能相对较弱,且EOA账户与私钥绑定。私钥的存储和使用对用户来说具有一定的挑战性,尤其是对于新手用户来说,如何安全地存储和使用私钥是一个需要解决的问题。为了解决这些问题,以太坊提出了智能合约账户(Smart Contract Account)。与EOA相比,智能合约账户具有更强的编程能力,可以实现更多复杂的逻辑(例如批量转账、替换授权Key、账户恢复等)。EIP-4337的提出和推广正是为了推动智能合约账户的落地和普及。

EIP-7702

虽然智能合约账户的开发进展较快,但目前EOA账户仍然占据主流地位。EIP-7702的提出旨在加速用户从EOA账户向智能合约账户的迁移,甚至可以预见,在未来某个时刻,以太坊可能会“淘汰”EOA账户,完全转向智能合约账户。那么,EIP-7702到底是什么呢?

EIP-7702交易结构

EIP-7702是Vitalik提出的一项以太坊改进提案,它引入了一种全新的交易类型。通过这种交易,EOA地址可以将自己委托给某个智能合约账户,从而拥有智能合约账户的高级功能。接下来,让我们具体看看交易的内容。

EIP-7702引入了一种新的交易类型SET_CODE_TX_TYPE(0x04),其交易Payload格式如下:

1
2
3
4
5
rlp([chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit,
destination, value, data, access_list, authorization_list, signature_y_parity,
signature_r, signature_s])

authorization_list = [[chain_id, address, nonce, y_parity, r, s], ...]

与常规交易相比,需要注意的是authorization_list。它是一个二维数组,数组中的每个元素都是一个包含六个元素的数组,分别是chain_idaddressnoncey_parityrs。其中chain_id是链ID,address是被授权的合约地址,nonce是EOA的nonce值,y_parityrs是EOA地址的签名信息。

从上述交易结构可以看出,在一笔EIP-7702的交易中,可以包含多个EOA地址的授权信息。需要指出的是,一笔EIP-7702交易不一定需要由授权的EOA地址发送,任何地址都可以发送此交易。更有趣的是,交易负载中并未明确包含EOA地址信息,那么这个交易是如何与EOA账户关联起来的呢?

答案很简单:通过authorization_list中的签名信息,可以恢复出EOA账户的地址信息。

1
EOA = ecrecover(msg, y_parity, r, s)

由于任何地址都可以发送EIP-7702交易,我们可以预见,在EIP-7702生效后,智能合约钱包的开发者可以主动帮助用户通过EIP-7702交易,将他们的EOA账户升级为智能合约钱包。

EIP-7702交易的执行过程

当一笔EIP-7702交易被发送后,首先会经过交易验证过程,验证内容包括:

  • 验证chainId是否有效
  • 验证nonce是否有效
  • 验证authorization_list中每个元素的签名是否有效
  • 通过签名恢复EOA地址,并验证其有效性

这些验证通过后,交易将继续执行。我们来回顾一下以太坊的账户状态模型。账户模型

在EIP-7702之前,EOA账户的Code hash并不重要,因为EOA账户没有代码。然而,在EIP-7702之后,如果EOA账户授权某个智能合约账户,其EOA账户的code hash将被设置为0xef0100 || address,其中0xef0100是DelegationPrefix,address是被授权的智能合约账户的地址。

值得注意的是,EOA的代理关系是可以改变的。用户可以重新授权给其他智能合约地址,或者完全取消代理关系。

EIP-7702后的EOA账户

当一个EOA账户被设置代理关系后,若交易发送至该EOA账户,首先会检查该账户是否存在代理关系。如果存在代理关系,交易将会被转发至被授权的智能合约账户进行执行。这样会带来一些变化:首先,EOA账户的余额不仅会因为自己发出的交易而发生变化,也可能因其他交易而变化。同时,EOA账户的nonce机制也会变得更加复杂,新增了更多的场景。

思考

以上就是EIP-7702的一个大致介绍。如果你想了解更多细节,可以参考EIP-7702。那么,EIP-7702到底意味着什么?会带来哪些变化呢?以下是我的一些简单思考。

  1. EIP-7702无疑是以太坊迈向账户抽象的又一重要一步。它为智能合约钱包的推广和普及提供了更多的方法。如果未来以太坊真的想“淘汰”EOA账户,我也不会感到惊讶。
  2. EIP-7702为EOA账户赋予了更多功能的可能性。通过将EOA账户委托给智能合约账户,EOA账户可以实现更多的功能。

不过,这也带来了一些潜在风险。作为普通用户,我们应该注意什么呢?一个显著的风险是,目前缺乏对授权签名过程的明确流程定义。EIP-7702中并未详细定义授权签名的流程,同时任何人都可以发送EIP-7702交易。如果黑客通过钓鱼等手段骗取签名,授权到恶意合约地址,那么EOA账户的控制权可能完全落入黑客手中。这与最近的Bybit攻击方式类似,实际上也是通过盗取签名来转移账户控制权。

那么,我们该如何应对呢?

  1. 社区应该为授权签名过程提供明确的流程规范,比如如何组织签名请求、如何显示关键信息、如何提示用户风险。
  2. 钱包开发者应建立智能合约白名单,对可以被授权的合约地址进行限制,防止授权到恶意合约地址。
  3. 钱包开发者应持续提示用户是否已授权某个合约地址,并清晰展示相关信息。
  4. 用户应特别注意每一次签名信息,避免盲签。

总之,希望以太坊的账户功能越来越强大,越来越安全。

This post is licensed under CC BY 4.0 by the author.

BitBox02固件代码浅析

-

Comments powered by Disqus.