上半段,将从2015年起的首个AA提案出发,系统整理目前为止的Eip提案主要内容,期望由史出发挖掘AA历史提案的历程,并综合性评价各方案优缺点。
下半段,着重对比EIP4337提出之后面临的市场低迷反馈,再深入分析如今即将被纳入下个版本以太坊升级的EIP7702,此提案一旦合并,将全方位改变链上应用形态。
EIP-7702 具有划时代的改变,且听十四君细细讲来
1、账号抽象的背景
https://x.com/VitalikButerin/status/1741190491578810445
在EIP4337推出一年多以来(在2023.3.1号丹佛的 WalletCon 上,官宣由以太坊基金会开发人员设计实现的ERC-4337 的核心合约已经通过了 OpenZeppelin 的审计,被认为是正式推出的历史节点)。
始终是只得到用户的广泛认可,但并不被广泛使用,如此矛盾的市场环境下,让EIP-7702的进度被大幅提前,乃至已经被确认将在下一次升级被合并其中。
1.2 账号抽象的市场现状
(图表数据来源:https://dune.com/niftytable/account-abstraction)
那为什么产权分离这么重要呢?
私钥难保护:用户失去私钥(遗失、黑客攻击、密码学上的被破解)意味着地失去所有资产。 签名算法少:原生协议在验证交易上只能使用 ECDSA 签名和验签算法。 签名权限高:无原生多签(多签只能通过智能合约实现协作),单签即可执行任意操作。 交易手续费只能通过 ETH 支付,并不支持批量交易。 交易隐私泄露:一对一交易容易分析账户持有者的隐私信息。
3.1 第一种路线是让EOA地址变为CA地址
让交易使用更多加密算法,可以由各地址内部Code来指定验签鉴权方法 具备抗量子攻击特性,因为代码具备升级特性。 让以太币具备与ERC20合约一致的功能特性,核心效果有了代扣授权,从而无需原生币的损耗 提升账户的自定义空间,兼容社交恢复、sbt支持、密钥找回等
EIP-859:主链账户抽象--2018-01-30
EIP-7702:设置 EOA 账户代码 2024-05-07
3.2 第二种路线是让EOA地址驱动CA地址
EIP-3074:增加AUTH
和AUTHCALL
操作码--2020-10-15
AUTH
和 AUTHCALL
,让EOA 能透过这两个opcode 授权合约代替EOA 的身份去呼叫其他合约。Invoker
)上,此Invoker
合约可以利用 AUTH
和 AUTHCALL
操作码来代替这个EOA 送出这笔交易。EIP-4337:用交易内存池实现账户抽象--2021-09-29
https://research.web3caff.com/zh/archives/3212, 以太坊账号抽象ERC4337的过审方案解读(上)
UserOperation
,用户将此对象发送到内存池中,由bundlers
从矿工维度批量打包交付合约执行交易事务,本质上是把底层的交易与帐户运作拉到合约层面执行。EIP-5189:通过背书人来操作抽象账户—2022-06-29
Bundler
通过建立资金罚款背书endorser的机制来防止Dos阻塞攻击。3.3 其他用于支持AA的提案
EIP-2718:新交易类型的包装信封--2020-06-13
EIP-3607:让EOA
地址不可部署合约--2021-06-10
3.4 如何理解账号抽象发展历程?
4、全面解析EIP-7702
4.1 EIP-7702是什么
4.2 数据结构
rlp([
chain_id, //链ID,用于防止重放攻击。
nonce, // 交易计数器,确保交易唯一性。
max_priority_fee_per_gas, //1559交易费用
max_fee_per_gas, //1559交易费用
gas_limit,
destination, //交易目标地址
value,
data,
access_list, //访问列表,用于EIP-2929中的Gas优化。
authorization_list,
signature_y_parity, // 3个签名参数,用于验证交易签名。
signature_r,
signature_s
])
authorization_list = [[chain_id, address, nonce, y_parity, r, s], ...]
4.3 交易生命周期
4.3.1 验证阶段
[chain_id, address, nonce, y_parity, r, s]
元组:从签名r、s中采用ecrecover恢复出签名者地址(注意这是以太坊本身的机制,所以该EIP没有改变签名算法)。 authority = ecrecover(keccak(MAGIC || rlp([chain_id, address, nonce])), y_parity, r, s]
(与之前解签名得出from地址类似,这里得出的是针对这个list的局部签名地址)验证链ID(防分叉链重放)。 验证 authority
签名者的代码是否为空或已经委托(验证交易是否属于有效7702交易,后续会通过delegation机制去代理执行交易)。验证 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有什么价值?
打破了账户余额只能因源自该账户的交易而减少的不变量。 打破了交易执行开始后 EOA nonce 增加1的不变量(可能同时增加多个)。 打破了tx.origin和msg.sender两个比对的防护逻辑,很多过往的合约有风险了。 打破了EOA本身无法发出事件的现状,对部分链上事件识别监听可能需要注意。 打破了EOA地址接受ERC20、721、1155等资产必然成功的现状(因为回调机制,可能失败)
4.5 对比EIP-7702和EIP-4337
1. EIP-7702的优势
gas更低,因为无需经过entrypoint模块,减少链上操作。 用户迁移成本更低,无需提前部署链上合约做为主体 与Eip4337相比,同样会有代码委托执行,也同样会有两种方式:
完全委托是指将某个操作的全部权限委托给一个特定地址。例如,用户可以将所有ERC-20代币的管理权限委托给一个智能合约地址,从而使得这个智能合约可以代表用户执行所有相关操作。
受保护的委托是指在委托的过程中增加一些限制和保护措施,确保委托操作的安全性和可控性。 例如,用户可以仅将部分ERC-20代币的管理权限委托给一个智能合约,或者设置一些限制条件(如每天最多花费总余额的1%)。
2. EIP-7702的缺点
自由度极高,难以被审计,用户会更需求靠谱的钱包承担安全防护的保护。 对原架构变化过大,虽然用不同交易类型区分,但是很多基建尤其链上不可改合约都无法直接适配。 对EOA地址提供了合约能力,但对应的存储空间无法留存。 单独交易的成本稍微提高,因为会大量增加Calldata的部分,估算调用的总成本将是 16(gas) * 15(字节) = 240
(gas)calldata 成本,加上EIP-3860的成本2 * 15 = 30
,再加上大约 的运行时成本150
。因此,仅仅准备账户哪怕什么都不做,就要增加500的Gas了。“如果接收者签署了没有接收功能的代码,发送者在尝试发送资产时可能会面临 DoS。” 见案例。这个问题其实是 EOA A 签署了它不应该签署的东西——一个设置了错误实现(没有 receive()
)的可重放文件。链上 冲提逻辑可能不一致,比如当转移 ERC-20 代币时,如果接收方账户有代码,则代币合约将调用 onERC20Received
接收方账户。如果onERC20Received
还原或返回错误的值,则令牌传输将还原。另外如果 EOA 可以发出事件,会不会有什么问题?一些基础设施可能需要注意。
https://eips.ethereum.org/EIPS/eip-7702
https://ethereum-magicians.org/t/eip-set-eoa-account-code-for-one-transaction/19923
https://github.com/ethereum/EIPs/pull/8527