ERC-4337
2021年,vitalik提出一种新的账户抽象模型,主要目标是让智能合约账户具有 EOA 主动发起交易的特性,完整的账户抽象包括身份验证、授权、重放保护、gas支付和执行,同时不牺牲去中心化和审查抵抗性。最终ERC-4337 成为以太坊账户抽象的最终实现方案。 EIP4337的工作原理简述: 1.角色:
首先,智能合约钱包本身,会通过打包器触发入口合约来间接触发,在链下验证交易,然后在链上执行。
其次,打包器(Bundler),用于批量验证和执行用户操作(UserOperation,即ERC 4337定义的智能合约钱包的交易类型)。
第三,入口合约(Entry Point Contract)是在以太坊只存在一份的全局合约,用于标准化交易执行并防止打包器受到恶意交易的DoS攻击。
第四,代付合约(Paymaster),用于代表钱包用户处理gas支付。
第五,合约工厂(Wallet Factory),用于标准化钱包创建的参数和流程。
第六,签名聚合器(Signature Aggregator),用于将多个交易的签名聚合为字节,以便更快地验证和执行交易。
2.工作流程:
用户向Bundler发送UserOperation
如果UserOperation填写了initCode参数,Bundler会触发Wallet Factory来创建有确定地址的新钱包
如果UserOperation填写了paymasterAndData参数,Bundler会收取Paymaster在入口点合约上质押的以太坊来支付gas。如果没有填写paymasterAndData,Bundler会收取智能合约钱包在入口点合约上质押的以太坊来支付gas
Bundler可以选择性地使用签名聚合器
Bundler会使用validateOp、validatePaymasterOp和validateSignatures函数在链下模拟验证UserOperation,确保签名正确且UserOperation有足够的gas
如果链下模拟验证通过,Bundler将使用上述函数在链上验证UserOperation
如果链上验证通过,Bundler将在链上执行UserOperation,无论执行是否成功,都会扣除gas
优点:
无需硬分叉:ERC-4337 不需要通过硬分叉来实现,不需要对以太坊的协议进行任何修改。
兼容性:这种方法与现有的 EOA 系统兼容,使得过渡更为平滑。
缺点:
用户无法在不迁移所有资产和活动的情况下升级现有账户。
额外的gas开销(基本用户操作约42k gas,而基本交易约21k gas)。
相比协议内审查抵抗技术,用户操作可能被遗漏。
EIP-3074
EIP-3074 的核心是允许外部拥有账户(EOA)像智能合约钱包一样运作,无需部署额外合约或手动迁移。
EIP-3074 引入了两个新的以太坊虚拟机指令:AUTH 和 AUTHCALL,使 EOA 连接起一个智能合约,并将交易的控制权交给智能合约。 -
AUTH:EOA 可以调用 AUTH 来授权给定的智能合约代表其 EOA 执行操作。
-AUTHCALL:获得授权的智能合约可以使用 AUTHCALL 为 EOA 执行交易。
EIP-3074 主要流程为:
首先,用户用私钥签署一条消息,其中包含他们希望将钱包委托给的合约,并将其发送给中继者。
中继器将此签名转发给称为调用者合约,调用者使用 AUTH 操作码验证签名。此过程完成后,Invoker 合约将获得用户钱包的权限,并可以代表用户发送交易。
当 Invoker 合约使用 AUTHCALL 操作码发送交易时,交易的发送者被设置为授予权限的用户钱包的地址。
与ERC-4337的关系
共同点:EIP-3074要实现的目标跟ERC-4337是一样的。但方式不同。
不同点:EIP-3074的交易的’from’是你的EOA,而不是某个合约。EIP-3074的账户所有者还是EOA,但ERC-4337的账户所有者是智能合约;EIP-3074无需手动迁移,避免的L2和诸多web3应用程序的适配。委托机制可能导致安全问题,因为如果授权给恶意合约,可能会导致资金被盗。[解决这个问题的方法是钱包服务提供商甚至不允许用户对任何合约进行授权,他们可能会保留一份用户可以委托授权的智能合约白名单列表,并且此列表之外的任何合约都不会显示给用户。]
EIP-5003
EIP-5003是对EIP-3074的扩展,引入了新的AUTHUSURP
操作码,允许在 EIP-3074 授权的合约地址上部署代码,从而为 EOAs 提供迁移路径,摆脱对 ECDSA 的依赖。主要解决采用EIP-3074的一个问题,即EIP-3074 是对智能合约的临时委托,可撤销。
而EIP-5003 是从 EOA 永久迁移并从 EOA “转换” 到智能合约账户。****可以将EIP-3074 + EIP-5003当作是另一种与ERC-4337完全不同的一套账户抽象实现方案。 问题:以太坊上出现了两种类型的账户抽象系统.ERC-4337已经上线主网,EIP-3074也纳入接下来进行的主网升级,一旦升级完成,两种不兼容的账户抽象系统并存。
EIP-7702
EIP-7702 提出了一种同时接受 contract_code 和签名字段的新交易类型,在开始执行交易时,它将签名者账户的合约代码设置为 contract_code。在交易结束时,它会将代码重新设置为空。 -
具体来说,它:
检查你的账户合约代码是否为空;
如果为空,则设置为提供的合约代码;
根据提供的智能合约处理交易的方式执行交易;
将账户合约代码设置恢复为空;
与EIP-3074的核心区别:
1.无需引入新操作码不需要引入新指令,服用已有的指令,但它在交易中临时应用智能合约代码,不需要永久改变以太坊虚拟机。
AUTH -> 调用「verify」(验证)
AUTHCALL -> 调用「execute」(执行)
高度兼容
EIP-7702 与 ERC-4337 的智能合约钱包代码高度兼容,可以直接利用已经为 ERC-4337 编写和部署的智能合约代码,使得现有的账户抽象化工作可以被重用,避免分裂现有的账户体系。
方便未来永久迁移至智能合约账户EIP-7702通过在【在交易结束后不将代码设置为空】来实现临时代理。EIP-7702 的基础上实施 EIP-5003(允许 EOA 永久转变为智能合约账户)变得相对简单,通过设置不在交易结束后清除代码,可以实现 EOA 到智能合约的永久转变。4.EIP-7702 不仅解决了当前的问题,还通过与未来可能的账户模型的兼容性设计,确保了长期的有效性和实用性。
EIP-7851
EIP7851 通过引入一种新的预编译合约,允许给智能合约代理控制的EOA 去激活或使私钥无效。
激活状态:
0xef0100 || address
无效状态:
0xef0100 || address || 0x00
在无效状态,EOA 账户无法使用其它私钥。
参考
https://eips.ethereum.org/EIPS/eip-4337
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-3074.md
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-7851.md