📢 Gate广场 #MBG任务挑战# 发帖赢大奖活动火热开启!
想要瓜分1,000枚MBG?现在就来参与,展示你的洞察与实操,成为MBG推广达人!
💰️ 本期将评选出20位优质发帖用户,每人可轻松获得50枚MBG!
如何参与:
1️⃣ 调研MBG项目
对MBG的基本面、社区治理、发展目标、代币经济模型等方面进行研究,分享你对项目的深度研究。
2️⃣ 参与并分享真实体验
参与MBG相关活动(包括CandyDrop、Launchpool或现货交易),并晒出你的参与截图、收益图或实用教程。可以是收益展示、简明易懂的新手攻略、小窍门,也可以是现货行情点位分析,内容详实优先。
3️⃣ 鼓励带新互动
如果你的帖子吸引到他人参与活动,或者有好友评论“已参与/已交易”,将大幅提升你的获奖概率!
MBG热门活动(帖文需附下列活动链接):
Gate第287期Launchpool:MBG — 质押ETH、MBG即可免费瓜分112,500 MBG,每小时领取奖励!参与攻略见公告:https://www.gate.com/announcements/article/46230
Gate CandyDrop第55期:CandyDrop x MBG — 通过首次交易、交易MBG、邀请好友注册交易即可分187,500 MBG!参与攻略见公告:https://www.gate.com/announcements
EIP-7702解析:账户抽象的新纪元与EOA能力升级
深入解读以太坊账号抽象赛道的过去与未来
本文分为两大部分:
首先,从2015年的第一个AA提案开始,系统梳理目前为止的EIP提案主要内容,回顾AA历史提案的历程,并综合评价各方案优缺点。
其次,重点对比EIP4337提出后面临的市场低迷反馈,深入分析即将纳入以太坊下次升级的EIP7702,这一提案一旦合并将全面改变链上应用形态。
EIP-7702具有划时代的意义,让我们详细了解一下。
1. 账号抽象的背景
1.1 账号抽象的意义定位
以太坊创始人Vitalik在2023年底再次更新ETH发展路线图,但对账号抽象的定位没有改变。当前主流模式正从EIP-4337过渡到下一阶段的自愿转换EOA账号。
在EIP4337推出一年多以来(2023年3月1日在丹佛的WalletCon上正式发布),一直得到用户广泛认可但未被广泛使用。在这种矛盾的市场环境下,EIP-7702的进度大幅提前,已确定将在下次升级中合并。
1.2 账号抽象的市场现状
经过一年半发展,EIP4337在主流链上仅有1200万地址,其中以太坊主网上活跃地址仅6,764个,远低于EOA和CA地址数量。以太坊主网独立地址数已达2.7亿,可以说EIP4337在主网上几乎没有实质性发展。
不过这并不影响AA的本质价值。EIP4337设计之初就注定难以很好解决主网的向前兼容问题。随着各类L2原生嵌入AA,EIP4337地址数在L2上获得爆发,如Base和Polygon链7月活跃用户分别达到100万和300万,还是相当可观的。
因此,并非EIP4337设计有误,它有很多优点。当前现状源于主网与L2之间的差异,它们需要各自适合的方案。
2. 什么是账号抽象?
账户抽象本质上是解决产权分离的问题。
以太坊虚拟机(EVM)中有两种账户:外部账户(EOA)和合约账户(CA)。EOA的所有权和签名权实际上由同一主体持有。持有私钥的人不仅拥有账户"所有权",还有权"签名转移所有资产"。
这是由以太坊账号交易结构决定的。标准交易结构中没有From字段,资金转账是通过VRS参数(用户签名)反解析出From地址。这造成了当前EOA地址产权合并的困境。
EIP4337的核心效果是在交易字段中增加Sender Address,从而将私钥与操作地址分离。
产权分离的重要性在于:
私钥难以保护:丢失私钥意味着失去所有资产。
签名算法单一:原生协议验证交易只能使用ECDSA算法。
签名权限过高:无原生多签,单签即可执行任意操作。
交易手续费只能用ETH支付,不支持批量交易。
交易隐私泄露:一对一交易容易分析账户持有者信息。
这些约束使普通用户难以使用以太坊:
因此,破局之道在于实现账户抽象,将所有权(Owner)和签名权(Signer)解耦,从而逐步解决上述问题。
历史上有多种方案,最终汇聚到两种路线。
3. AA历史提案脉络梳理
问题的解法看似有很多EIP提案,但归根结底就是两种核心思路。每个未通过的EIP考虑的问题最终都汇聚到了现有方案中。
3.1 第一种路线:将EOA地址转为CA地址
2015年11月15日,Vitalik在EIP-101中就提出以合约作为账户的新结构。将地址改为只有代码和存储空间,支持用ERC20支付手续费,通过预编译合约将原生代币改为类ERC20来存余额,将交易字段精简到只有to、startgas、data和code。
这是一种大跃进式变革,会大幅改动底层设计,让每个账户地址都拥有自己的"代码"逻辑(也正是现在EIP-7702要实现的效果)。
还能衍生出其他功能:
未继续推进的原因也很简单,显然步伐太大,对当前交易哈希冲突问题、安全性隐患考虑不周,所以一直搁置。但每个优点的理念都成为后续EIP4337和EIP7702的核心功能之一。
后来还有一系列EIP试图完善这种逻辑:
EIP-859:主链账户抽象(2018-01-30)
试图解决Code部署问题。如果交易方合约未部署,则使用交易附带code参数执行合约钱包部署。还提出新的PAYGAS操作码,除支付gas外,也作为交易参数中验证部分与执行部分的分隔符。
虽然当时无疾而终,但成为现在EIP7702的核心逻辑之一。EIP7702的每笔交易结合特殊交易结构,可附带一定代码,让EOA地址在本次交易中拥有合约能力。
EIP-7702:设置EOA账户代码(2024-05-07)
这是本文后续讨论的核心EIP,由Vitalik发表作为EIP-3074的替代方案。EIP-3074被弃用,EIP-7702确定将在即将到来的ETH Prague/Electra硬分叉中纳入。
3.2 第二种路线:让EOA地址驱动CA地址
EIP-3074:增加AUTH和AUTHCALL操作码(2020-10-15)
在EVM中加入两个新OpCodes:AUTH和AUTHCALL,让EOA能通过这两个opcode授权合约代替EOA身份调用其他合约。
概括来说,EOA可将已签名的消息(交易)发送到自己信任的合约(称作Invoker),Invoker合约可利用AUTH和AUTHCALL代替EOA发出交易。
EIP-4337:用交易内存池实现账户抽象(2021-09-29)
受MEV启发设计,核心价值是完全避免共识层协议更改。
EIP4337提出新的事务对象UserOperation,用户将此对象发送到内存池,由bundlers从矿工维度批量打包交付合约执行交易事务,本质上是将底层交易与账户运作拉到合约层面执行。
EIP-5189:通过背书人操作抽象账户(2022-06-29)
优化了EIP4337逻辑,通过建立资金罚款背书(endorser)机制来防止恶意Bundler的DoS攻击。
3.3 其他支持AA的提案
EIP-2718:新交易类型的包装信封(2020-06-13)
已经Final的提案,定义新的交易类型作为未来新增交易类型的信封。
引入新交易类型时,通过特定编码区分,只需向后兼容而无需向前兼容。最常见例子是EIP1559,区分了交易手续费,使用新的交易类型编码,又不影响最初的legacy交易类型。
EIP-3607:禁止EOA地址部署合约(2021-06-10)
AA路径上的补充方案,防止合约部署地址与EOA地址冲突。控制合约生成方法,不允许将代码部署到已是EOA的地址上。这个风险很小,以太坊地址有160位长,虽然存在用私钥碰撞出指定合约地址私钥的方法,但以比特币全算力投入估计也需要一年时间。
3.4 如何理解账号抽象发展历程?
首先需要理解转为CA后的价值。
基本上就是EIP-4337的实际效果,可以实现:
但EIP-4337的核心缺点是违背人性动机原则。
看起来更好,但陷入市场发展死循环:很多Dapp还不兼容,用户不愿使用CA地址,使用CA反而有更高交易成本(普通转账场景交易费用翻倍),太依赖Dapp本身的兼容性。
所以在以太坊主网上迄今为止始终没有普及。
成本是用户最重要衡量标准,必须降低成本。
要真正降低GAS,就必须以太坊本身做软分叉升级,修改GAS计算或操作码GAS消耗等模块。既然要软分叉,不如直接考虑EIP-7702。
4. 全面解析EIP-7702
4.1 EIP-7702是什么
通过新的交易类型,允许EOA在单笔交易中临时具备智能合约功能,支持批量交易、无Gas交易和自定义权限管理等,且无需引入新的EVM opCode(影响向前兼容性)。
让用户无需部署智能合约就能获得大部分AA能力,甚至可以提供第三方代用户发起交易的能力,不需要用户提供私钥,只需签名授权信息。
4.2 数据结构
定义新的交易类型0x04,TransactionPayload是以下内容的RLP编码序列化结果:
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对象,存储签名者希望在其EOA中执行的代码。用户签署交易的同时也签署要执行的合约代码,作为二维列表存在,可以批量存放多个操作信息,执行批量操作。
authorization_list = [[chain_id, address, nonce, y_parity, r, s], ...]
4.3 交易生命周期
4.3.1 验证阶段
执行交易开始阶段,对每个authorization_list的[chain_id, address, nonce, y_parity, r, s]元组:
从签名r、s中用ecrecover恢复出签名者地址。
验证链ID(防分叉链重放)。
验证authority签名者代码是否为空或已委托(验证交易是否为有效7702交易)。
验证authority签名者nonce(防authority签名重放)。
设置authority签名者代码为0xef0100 || address(绕过EIP3607防碰撞策略)。
增加authority签名者nonce(防局部签名重放)。
将authority签名者账户添加到已访问地址列表(转热地址,降低查询存储gas费)。
4.3.2 执行操作阶段
"新"版本仅更改代码部署行为。
不再将账户代码设为contract_code,而是从authorization_list中检索代码address并设为账户代码。
执行授权代码时,从authorization_list的address字段指定地址加载代码,在签名者账户上下文中执行。
用户合约代码实际存储在链上特定地址,不直接包含在交易中。
操作指令和相关参数存储在交易负载的data字段。
4.4 EIP-7702的价值
对Web3钱包全链路都有变化,用户体验