Alert Source Discuss
⚠️ Review Standards Track: ERC

ERC-5568: 必要操作的知名格式

通过一个知名的函数和回滚原因向钱包发出需要执行操作的信号

Authors Gavin John (@Pandapip1)
Created 2022-08-31
Requires EIP-140

摘要

本 ERC 引入了一种极简的机器可读(二进制)格式,用于通过一个知名的函数和回滚原因向钱包发出用户需要采取操作的信号。它提供了足够的数据,可以通过未来的 ERC 进行扩展,并接受任意参数(高达 64 kB 的数据)。示例用例可能包括批准交易所的 token、发送 HTTP 请求,或请求用户在一段时间后轮换其密钥,以强制执行良好的习惯。

动机

通常,智能合约需要向钱包发出需要采取操作的信号,例如签署交易或向 URL 发送 HTTP 请求。传统上,这是通过将逻辑硬编码到前端来完成的,但本 ERC 允许智能合约本身请求该操作。

这意味着,例如,交易所或市场可以直接告诉钱包批准智能合约花费 token,从而大大简化前端代码。

规范

本文档中的关键词“必须”,“禁止”,“必需”,“应”,“不应”,“应该”,“不应该”,“推荐”,“可以”和“可选”应按照 RFC 2119 中的描述进行解释。

操作检测

interface IERC5568 {
    function walletSignal24(bytes32 selector, bytes function_data) view returns (uint24 instruction_id, bytes instruction_data);
}

由 ERC 定义的指令的 instruction_id 必须是其 ERC 编号,除非有特殊情况(合理即可)。一个 ERC 必须准确地定义零个或一个 instruction_id。任何 instruction_id 的指令数据的结构必须由定义该 instruction_id 的 ERC 定义。

要指示需要采取操作,请返回 instruction_idinstruction_data。要指示不需要采取任何操作,请将 instruction_id 设置为 0,并将 instruction_data 设置为任何值。

自定义回滚原因

为了表明未采取操作,符合标准的智能合约必须使用以下错误回滚:

error WalletSignal24(uint24 instruction_id, bytes instruction_data)

由 ERC 定义的指令的 instruction_id 必须是其 ERC 编号,除非有特殊情况(合理即可)。一个 ERC 必须准确地定义零个或一个 instruction_id。任何 instruction_id 的指令数据的结构必须由定义该 instruction_id 的 ERC 定义。

响应回滚

在将交易提交到 mempool 之前,必须在本地模拟 walletSignal24 函数。它必须被视为能够进行状态更改的非 view 函数(例如,允许对非 view 函数进行 CALLS)。如果生成的 instruction_id 非零,则需要采取操作。

instruction_idinstruction_data 必须从 walletSignal24 模拟中获取。该指令应按照相关的 ERC 进行评估。如果钱包不支持该指令,则必须向用户显示错误,表明情况如此。然后,钱包必须重新评估交易,除非指令明确说明不得重新评估交易。

如果指令无效,或者无法解析 instruction_idinstruction_data,则必须向用户显示错误,表明情况如此。不得重新评估交易。

理由

本 ERC 经过专门优化,以降低部署 Gas 成本和简化性。预计最终将开发库,使其对开发者更加友好。

不使用 ERC-165,因为接口足够简单,只需调用该函数即可检测到。

向后兼容性

人工可读的回滚消息

请参阅 回滚原因冲突

ERC-3668

ERC-3668 可以与本 ERC 一起使用,但它使用与本 ERC 不同的机制。

安全注意事项

回滚原因冲突

自定义错误的签名不太可能与任何实际的自定义错误匹配。如果确实匹配,除非数据恰好是有效的指令,否则不会造成任何损害,而这甚至不太可能。

版权

版权和相关权利已通过 CC0 放弃。

Citation

Please cite this document as:

Gavin John (@Pandapip1), "ERC-5568: 必要操作的知名格式 [DRAFT]," Ethereum Improvement Proposals, no. 5568, August 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5568.