AUTH (0xf6 )—— 基于签名和 commit (提交)提出授权的外部账户。共有 4 个输入参数:commit 以及签名的 yParity 、r 和 s 。
AUTHCALL (0xf7 ) —— 代替已授权的外部账户发送调用(事务) 。共有 8 个输入参数:gas 、addr 、value 、valueExt 、argsOffset 、argsLength 、retOffset 和 retLength 。与现有的 CALL 操作码相似。
确认外部账户的授权需要来自该外部账户的签名消息。调用 AUTH 的智能合约可以通过消息签名复原出签名者,然后将其设置成 authorized EVM 环境变量。这样一来,该智能合约每次调用 AUTHCALL 时,调用者都会被设置成 authorized 地址。当被调用的智能合约调用 CALLER (例如,通过 Solidity 的 msg.sender )时,将由已授权的外部账户的地址而非调用者地址(智能合约)执行调用。 发送一个或多个事务的基本流程如下图所示: - 上图显示了 EIP 3074 的基本流程,其中调用者合约发送多个事务 - 外部账户签署授权消息; 外部账户或其他 gas 支付方将事务数据和授权消息发送给调用者合约; 调用者合约使用 AUTH 操作码执行授权,并使用 AUTHCALL 操作码发送事务。
将事务发送到合约的是谁并不重要,只要外部账户的签名是有效的即可。因此,其他人(或账户)也可以发送事务。 请注意,目前无法使用 EIP 3074 通过外部账户发送 ETH。这样做会极大地改变当前的一些重要假设,例如,检查事务是否有效。调用者需要使用自己的 ETH 余额来发送 ETH。但是,你可以将 ETH 发送给调用者,并由调用者代为发送。目前,AUTHCALL 操作码所包含的 valueExt 字段必须被硬编码成 0。将来,如果找到适当的解决方案,我们可以更改这个字段,允许调用者外部账户发送 ETH。 授权消息和 commit为了执行授权,外部账户必须签署特定格式的消息: ``` * |