2021-06-27 00:11 | 出处: EthFans
如果你是以太坊上的活跃用户,那么你大概率会持有一些 (ERC 20)代币,用来与以太坊生态中的各种 DeFi 项目进行交互。但是,这么做的前提是你必须持有 ETH,因为 ERC 20 代币无法用来支付以太坊的手续费。另外,在向智能合约发送代币时,你通常需要执行两个事务:一个用来许可 目标合约使用你的代币,另一个用来将代币转移 到目标合约中。
EIP-3074 可以让智能合约 代表 外部账户(就是普通的以太坊地址)发送事务,从而解决了上述乃至更多问题。
EIP 3074 引入了 AUTH 和 AUTHCALL 这两个 EVM 指令。第一个指令基于 ECDSA 签名设置环境变量authorized,第二个指令则作为 authorized 发送调用。这本质上就是向智能合约授予外部账户的控制权。
通过 AUTH 和 AUTHCALL EVM 指令(又称操作码),智能合约可以基于已签署消息获得一个外部账户的授权,并代替该外部账户发送事务。这带来了很多可能性,如:
approve 和 transferFrom。AUTH(0 xf6)—— 基于签名和 commit(提交)提出授权的外部账户。共有 4 个输入参数:commit以及签名的 yParity、r 和 s。AUTHCALL(0 xf7) —— 代替已授权的外部账户发送调用(事务) 。共有 8 个输入参数:gas、addr、value、valueExt、argsOffset、argsLength、retOffset和retLength。与现有的CALL 操作码相似。AUTH 的智能合约可以通过消息签名复原出签名者,然后将其设置成 authorized EVM 环境变量。这样一来,该智能合约每次调用 AUTHCALL 时,调用者都会被设置成authorized地址。当被调用的智能合约调用 CALLER(例如,通过 Solidity 的 msg.sender)时,将由已授权的外部账户的地址而非调用者地址(智能合约)执行调用。- 上图显示了 EIP 3074 的基本流程,其中调用者合约发送多个事务 -
AUTH 操作码执行授权,并使用 AUTHCALL 操作码发送事务。AUTHCALL 操作码所包含的 valueExt 字段必须被硬编码成 0。将来,如果找到适当的解决方案,我们可以更改这个字段,允许调用者外部账户发送 ETH。0 x03 || <Padded invoker address> || <Commit>(注:||用作字节连接运算符。)
0 x03)、填充成 32 字节的调用者地址(执行authorize的智能合约的地址)以及一个 32 字节的 commit。- 授权消息格式,包含一个 commit 示例 -
[{"to": "0 x6b175474e89094c44da98b954eedeac495271d0f","value": 123,"nonce": 0},{"to": "0 x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520","value: 123,"nonce": 1}]我们可以对这些字段进行哈希计算(例如,用确定性的方式将它们连接起来,或使用 EIP 712 之类的规范),并将得到的哈希值用作 commit。
function sendTransactions(Transaction[] calldata transactions, Signature calldata signature) external;
transactions 重新计算 commit,并将这个 commit(连同签名一起)提供给 AUTH 调用。此举的目的是找回签名者的地址,如果计算得到的 commit 无效,根据签名找回的地址将是错误的,也就是说事务将失败。0 x0 作为 commit 来签署消息,并授予智能合约对外部账户的完整访问权。前几版 EIP-3074 对 commit 的格式要求更为严格,包括重放保护等,但是后面为了提高灵活性已经将其移除。这就要求你在与调用者进行交互时必须信任对方。CALLER,EIP 3074 极大地改变了 EVM 的运作方式。这会为新合约和现有合约引入潜在漏洞。因此,EIP 3074 已经经过正式审计。require(tx.origin == msg.sender) 来验证事务是否来自外部账户(而非另一个合约)。这样可以在一定程度上防止重入攻击,因为它可以防止合约调用该函数。tx.origin 成为授权消息的签名者。调用者执行的任何 AUTHCALL 都会导致 tx.origin == msg.sender 成真,即使这个调用是由智能合约执行的,因此很有可能遭到重入攻击。EIP 3074 指出:“……本 EIP 的作者并未找到任何有关这种重入攻击的例子,尽管没有进行详尽的搜索。”AUTH 和 AUTHCALL 使得外部账户能够将账户的控制权授予智能合约调用者,从而实现批量事务和赞助事务等新的事务类型。然而,该 EIP 也极大地改变了事务在以太坊上的运作方式,因此在主网上激活该 EIP 之前,我们需要更深入地思考其安全性。原文链接:
https://blog.mycrypto.com/eip-3074/
作者: Maarten Zuidhoorn