前提注:本文旨在记录所学知识,文中内容都是个人的思考与看法,不一定正确,大概率也不完善,望各位见谅,同时也欢迎各位补充和纠正。Vitalik很早就提到过,以太坊在很长一段时间里的升级改进,都将朝着这三个方面努力:1.通过账户抽象实现安全性与便利性2.通过Layer2实现可扩展性3.隐匿地址
注:本文旨在记录所学知识,文中内容都是个人的思考与看法,不一定正确,大概率也不完善,望各位见谅,同时也欢迎各位补充和纠正。
Vitalik很早就提到过,以太坊在很长一段时间里的升级改进,都将朝着这三个方面努力: 1.通过账户抽象实现安全性与便利性 2.通过Layer2实现可扩展性 3.隐匿地址和各种加密协议实现隐私 而本文将要介绍的EIP-7702,据说是实现以太坊账户抽象的关键步骤之一。
在介绍具体的EIP协议之前,需要先明白以太坊账户抽象是什么以及为啥要进行账户抽象。
我个人对于账户抽象的理解就是实现账户无差,至少是在用户看起来和用起来时,以太坊上所有的账户都是一样的,毕竟以太坊上的EOA与SC在技术实现上肯定还是存在不同的。根据V神的叙事,这样的账户抽象是为了让用户在链上的体验,更流畅、更智能、更易于访问,其实就是优化用户的体验感。
体验感的优化体现在这几个方面: 1.多操作:想想现在的erc20 token转账,EOA账户要先授权某个SC,然后才能transfer,明明这样的操作应该在一次交易中完成,但是偏偏需要两次,多操作就是为了让EOA账户同样具备和SC一样的在一笔交易中执行多个动作的能力。 2.多签名:不知道各位有没有遇到过忘记私钥,导致钱包丢失的情况,我本人就遇到过这样的情况,结合V神的演讲,我个人认为多签名可以从两个方面理解。一是对于一个账户,支持多个私钥控制权限的能力,以后可能需要根据具体行为的重要性程度,使用这个账户的不同私钥个数进行签名;二是对于一个账户,你可以授权给其他的账户一种能力或是一个签名,当你的私钥丢失的时候,你可以基于此来恢复你的账户。 3.自定义签名方案:这个更多的是从安全性的角度出发,根据V神的演讲,虽然现在的ECDSA算法足够安全,但在即将到来的量子计算机时代,这样的安全保证显然是不够的,后续以太坊可能支持多种签名算法。 4.Gas成本灵活:现在想要在链上发送交易,都得使用eth支付gas,如果你足够的eth将无法发送当前交易,Gas成本灵活是指你可以不用支付eth,可以使用其他的链上资产,例如erc20token来支付交易上链的费用,当然这肯定不会是gas使用erc20token支付,应该是委托其他用户发送交易,然后支付对方erc20 token达到交易上链不使用eth的效果。
上述账户抽象给用户带来的体验感升级的总体大纲是ERC-4337所描绘的,这也说明在ERC-4337与ERC-3074的竞争中,包括V神在内的以太坊核心人员更偏向于ERC-4337。
EIP-7702的到来,并不是为了解决上述所有问题,实现所有的用户体验优化,而是主要针对“EOA账户和SC账户在使用上没有差别”这个点来做的,再具体一点来说是让EOA账户和SC账户一样具备可执行的代码从而减少使用体验上EOA账户和SC账户的差异。
为了达到上述目标,7702主要从两个方面入手。账户数据结构上和交易内容上。
在账户数据结构上,想想EOA账户和SC账户有什么不同,其实主要就是EOA账户的Storage字段与Code字段为空,导致他没有SC账户的能力,所以7702让EOA账户在其Code字段加入了一个索引值:
0xef0100 || address
其中0xef0100作为标识符,区分SC与升级后的EOA账户(智能钱包)同时指示当前版本,address作为索引,指向当前EOA账户可执行代码在链上的存储位置(所以本质上他的代码仍然是来自SC)。当遇到执行当前EOA账户代码的交易,当前交易同样会使用类似与delegatecall的方式在EOA的上下文环境中执行对应地址合约的代码。所以在以前很多dapp中,通过检查账户的code字段是否为0判断账户是EOA还是SC的逻辑将不再有效。
注: 这个地方的Storage到底是怎样使用,我其实没有想清楚,如果使用EOA账户Storage的话,可能在交易执行前还需要进一步的设置,这种方式符合delegatecall调用方式。
7702定义了一种新的交易类型,0x04,他具体的交易内容如下:
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], ...]
authorization_list作为一个列表是为了在一笔交易中允许多个EOA设置他们的contract_code
相比于之前的交易类型,7702提出的新交易类型TransactionPayLoad多了一个authorization_list字段,这个字段是用来存放EOA账户委托对应合约的信息,以此实现EOA账户可执行改合约的代码。这种授权是永久性的,直到用户明确撤销,这意味着用户信任他们授权的代码不会是恶意的。
如下图所示:
1.根据签名信息恢复用户身份
2.验证Chain ID,防止重放攻击
3.检查nonce值,判断当前交易是否有效
4.判断用户是否已经设置code,根据revm源码来看,目前的逻辑已经是如果已经设置,则更换当前新地址code,如果是空,则设置code执行改合约地址
5.交易成功/失败
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!