科普 | EIP-3074:提升以太坊用户体验
摘要: 便利与风险并存
如果你是以太坊上的活跃用户,那么你大概率会持有一些 (ERC 20)代币,用来与以太坊生态中的各种 DeFi 项目进行交互。但是,这么做的前提是你必须持有 ETH,因为 ERC 20 代币无法用来支付以太坊的手续费。另外,在向智能合约发送代币时,你通常需要执行两个事务:一个用来许可 目标合约使用你的代币,另一个用来将代币转移 到目标合约中。
EIP-3074 可以让智能合约 代表 外部账户(就是普通的以太坊地址)发送事务,从而解决了上述乃至更多问题。
EIP 3074 引入了 AUTH
和 AUTHCALL
这两个 EVM 指令。第一个指令基于 ECDSA 签名设置环境变量authorized
,第二个指令则作为 authorized
发送调用。这本质上就是向智能合约授予外部账户的控制权。
通过 AUTH
和 AUTHCALL
EVM 指令(又称操作码),智能合约可以基于已签署消息获得一个外部账户的授权,并代替该外部账户发送事务。这带来了很多可能性,如:
-
赞助事务(又称元事务):支付来自另一个账户的交易的 gas。这样一来,不持有 ETH 的地址也能发送代币。 -
批量事务:通过单个调用发送多个事务。这样可以确保两个或以上的事务在同一个区块中执行,还可以降低交易费。 -
提升用户体验:例如,你可以在单个事务中调用 approve
和transferFrom
。
AUTH 和 AUTHCALL 操作码
-
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
操作码发送事务。
AUTHCALL
操作码所包含的 valueExt
字段必须被硬编码成 0。将来,如果找到适当的解决方案,我们可以更改这个字段,允许调用者外部账户发送 ETH。授权消息和 commit
0x03 || <Padded invoker address> || <Commit>
(注:||
用作字节连接运算符。)
0x03
)、填充成 32 字节的调用者地址(执行authorize的智能合约的地址)以及一个 32 字节的 commit。- 授权消息格式,包含一个 commit 示例 -
[
{
"to": "0x6b175474e89094c44da98b954eedeac495271d0f",
"value": 123,
"nonce": 0
},
{
"to": "0x4bbeEB066eD09B7AEd07bF39EEe0460DFa261520",
"value: 123,
"nonce": 1
}
]
我们可以对这些字段进行哈希计算(例如,用确定性的方式将它们连接起来,或使用 EIP 712 之类的规范),并将得到的哈希值用作 commit。
function sendTransactions(Transaction[] calldata transactions, Signature calldata signature) external;
transactions
重新计算 commit,并将这个 commit(连同签名一起)提供给 AUTH
调用。此举的目的是找回签名者的地址,如果计算得到的 commit 无效,根据签名找回的地址将是错误的,也就是说事务将失败。0x0
作为 commit 来签署消息,并授予智能合约对外部账户的完整访问权。前几版 EIP-3074 对 commit 的格式要求更为严格,包括重放保护等,但是后面为了提高灵活性已经将其移除。这就要求你在与调用者进行交互时必须信任对方。局限性和安全隐患
CALLER
,EIP 3074 极大地改变了 EVM 的运作方式。这会为新合约和现有合约引入潜在漏洞。因此,EIP 3074 已经经过正式审计。弱 commit 和重放攻击
可升级调用者
重入攻击
require(tx.origin == msg.sender)
来验证事务是否来自外部账户(而非另一个合约)。这样可以在一定程度上防止重入攻击,因为它可以防止合约调用该函数。tx.origin
成为授权消息的签名者。调用者执行的任何 AUTHCALL
都会导致 tx.origin == msg.sender
成真,即使这个调用是由智能合约执行的,因此很有可能遭到重入攻击。EIP 3074 指出:“……本 EIP 的作者并未找到任何有关这种重入攻击的例子,尽管没有进行详尽的搜索。”结论
AUTH
和 AUTHCALL
使得外部账户能够将账户的控制权授予智能合约调用者,从而实现批量事务和赞助事务等新的事务类型。然而,该 EIP 也极大地改变了事务在以太坊上的运作方式,因此在主网上激活该 EIP 之前,我们需要更深入地思考其安全性。联系我们
-
Twitter -
Telegram -
Discord -
GitHub -
Help & Support -
Press Inquiries
(完)
原文链接:
https://blog.mycrypto.com/eip-3074/
作者: Maarten Zuidhoorn
作者:以太坊爱好者;来自链得得内容开放平台“得得号”,本文仅代表作者观点,不代表链得得官方立场凡“得得号”文章,原创性和内容的真实性由投稿人保证,如果稿件因抄袭、作假等行为导致的法律后果,由投稿人本人负责得得号平台发布文章,如有侵权、违规及其他不当言论内容,请广大读者监督,一经证实,平台会立即下线。如遇文章内容问题,请联系微信:chaindd123。
评论(0)
Oh! no
您是否确认要删除该条评论吗?