ERC-7681: 双重性质多代币协议
结合同质化代币 ERC-20 和多代币 ERC-1155
Authors | Sennett Lau (@sennett-lau) |
---|---|
Created | 2024-04-08 |
Discussion Link | https://ethereum-magicians.org/t/erc-7681-dual-nature-multi-token-protocol/19590 |
Requires | EIP-20, EIP-1155 |
Table of Contents
摘要
本提案 ERC-7681 阐述了同质化 ERC-20 代币合约与半同质化 ERC-1155 多代币标准的集成,从而在单个合约框架内实现两种标准之间的协同操作。它定义了一种结合两种代币合约并同步它们之间操作的机制。
动机
受 ERC-7631 双重性质代币对的启发,该提案引入了 ERC-20 和 ERC-721 之间可互联代币的概念,但由于重复的 Transfer(address, address, uint256)
事件,出现了一个挑战,使得完全兼容具有挑战性。然而,结合 ERC-20 和 ERC-1155 提供了类似的非同质化代币 (NFT) 原生碎片化的好处。在这里,获取 ERC-20 代币可以自动按比例发行 ERC-1155 代币,从而完全符合两种标准。
此外,类似于 ERC-7631,该提案允许用户在 ERC-20 到 ERC-1155 的同步过程中选择不参与 ERC-1155 的铸造和转移。
规范
本文档中的关键词“必须 (MUST)”,“禁止 (MUST NOT)”,“必需 (REQUIRED)”,“应该 (SHALL)”,“不应该 (SHALL NOT)”,“应当 (SHOULD)”,“不应当 (SHOULD NOT)”,“推荐 (RECOMMENDED)”,“不推荐 (NOT RECOMMENDED)”,“可以 (MAY)”和“可选 (OPTIONAL)”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
概述
每个 ERC-7681
必须实现 ERC20
和 ERC1155
接口。
ERC-7681 接口
ERC-20 合约必须实现以下接口。
interface IERC7681 /* is IERC20, IERC1155 */ {
/// 合约必须包含以下事件
/// ERC20 相关事件
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
/// 合约必须包含以下事件
/// ERC1155 相关事件
event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);
event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);
event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
event URI(string _value, uint256 indexed _id);
/// 合约可以包含以下函数
/// ERC20 相关函数
function name() public view returns (string);
function symbol() public view returns (string);
function decimals() public view returns (uint8);
/// 合约必须包含以下函数
/// ERC20 相关函数
function totalSupply() public view returns (uint256);
function balanceOf(address _owner) public view returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool);
function approve(address _spender, uint256 _value) public returns (bool);
function allowance(address _owner, address _spender) public view returns (uint256);
/// 合约必须包含以下函数
/// ERC1155 相关函数
function balanceOf(address _owner, uint256 _id) external view returns (uint256);
function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);
function setApprovalForAll(address _operator, bool _approved) external;
function isApprovedForAll(address _owner, address _operator) external view returns (bool);
function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _value, bytes calldata _data) external;
function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _values, bytes calldata _data) external;
}
ERC-7681 可跳过接口
ERC-7681 合约可以实现以下接口。
interface IERC7681Skippable {
/// @dev 当 `owner` 的跳过 ERC1155 代币状态通过任何机制更改时发出。
///
/// `owner` 的初始跳过 ERC1155 代币状态可以动态地选择为 true 或 false,
/// 但对其进行的任何更改必须发出此事件。
event SkipTokenSet(address indexed owner, bool status);
/// @dev 如果在 ERC-20 到 ERC-1155 同步期间,
/// 应该跳过对 `owner` 的 ERC-1155 铸造和转移,则返回 true。否则返回 false。
///
/// 此方法可能会回退
///
/// 如果此方法回退:
/// - 交互代码应将 `setSkipToken` 功能解释为不可用(并隐藏任何调用 `setSkipToken` 的功能)。
/// - `owner` 的跳过 ERC1155 代币状态应解释为未定义。
///
/// 一旦为给定的 `owner` 返回了 true 或 false 值,
/// 此方法不得针对给定的 `owner` 回退。
function getSkipToken(address owner) external view returns (bool);
/// @dev 设置调用者的跳过 ERC1155 代币状态。
///
/// 此方法可能会回退
/// (例如,权限不足,不支持该方法)。
///
/// 发出 {SkipTokenSet} 事件。
function setSkipToken(bool status) external;
}
理由
实现灵活性
该提案有意不规定特定的代币同步逻辑,以允许不同的实现策略和新颖的用例,例如基于 ERC-20 持有量的一对一同步或 ERC-1155 代币的碎片化。开发者可以灵活地确定他们的同步方法,前提是它仍然完全符合这两种代币标准的规范。
ERC-1155 代币跳过
对于 owner
是智能合约的情况,默认将跳过状态设置为 true
可以防止与 DEX 和借贷协议等合约交互时进行不必要的 ERC-1155 铸造,从而可能降低 gas 成本。
向后兼容性
该提案与现有的 ERC-20 和 ERC-1155 标准完全向后兼容,确保依赖这些标准的合约将继续无缝运行。
安全考虑
耗尽 gas 拒绝服务
当用户转移 ERC-20 代币时,它可以触发各种 ERC-1155 代币的自动铸造、转移或销毁。此过程可能导致 gas 费用随着操作数量呈线性增长 O(n),而不是通常在 ERC-20 代币交易中看到的固定成本 O(1)。此外,用于选择 ERC-1155 代币 ID 的机制可能会进一步增加 gas 费用。因此,任何同步策略都需要考虑 ERC-1155 相关 gas 成本的潜在上升,以避免耗尽 gas,这可能导致拒绝服务的情况。
版权
版权和相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Sennett Lau (@sennett-lau), "ERC-7681: 双重性质多代币协议 [DRAFT]," Ethereum Improvement Proposals, no. 7681, April 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7681.