Alert Source Discuss
Standards Track: ERC

ERC-5679: 代币铸造和销毁

用于铸造和销毁 EIP-20、EIP-721 和 EIP-1155 代币的扩展

Authors Zainan Victor Zhou (@xinbenlv)
Created 2022-09-17
Requires EIP-20, EIP-165, EIP-721, EIP-1155

摘要

本 EIP 引入了一种一致的方式来扩展代币标准的铸造和销毁功能。

动机

铸造和销毁是创建和销毁代币的典型操作。 通过建立一种一致的代币铸造和销毁方式,我们完成了基本的生命周期。

EIP-721EIP-1155 的一些实现 已经能够使用 transfer 方法或类似方法 来铸造和销毁代币。但是,铸造和销毁会改变代币的供应量。铸造和销毁的访问控制 通常也遵循与转移不同的规则。 因此,为销毁和铸造创建单独的方法简化了实现 并减少了安全错误。

规范

本文档中使用的关键词“MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“MAY”和“OPTIONAL”应按照 RFC 2119 中的描述进行解释。

  1. 任何符合 EIP-20 的合约,当使用此 EIP 扩展时, 必须 实现以下接口:
// The EIP-165 identifier of this interface is 0xd0017968
interface IERC5679Ext20 {
   function mint(address _to, uint256 _amount, bytes calldata _data) external;
   function burn(address _from, uint256 _amount, bytes calldata _data) external;
}
  1. 任何符合 EIP-721 的合约,当使用此 EIP 扩展时, 必须 实现以下接口:
// The EIP-165 identifier of this interface is 0xcce39764
interface IERC5679Ext721 {
   function safeMint(address _to, uint256 _id, bytes calldata _data) external;
   function burn(address _from, uint256 _id, bytes calldata _data) external;
}
  1. 任何符合 EIP-1155 的合约,当使用此 EIP 扩展时, 必须 实现以下接口:
// The EIP-165 identifier of this interface is 0xf4cedd5a
interface IERC5679Ext1155 {
   function safeMint(address _to, uint256 _id, uint256 _amount, bytes calldata _data) external;
   function safeMintBatch(address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
   function burn(address _from, uint256 _id, uint256 _amount, bytes[] calldata _data) external;
   function burnBatch(address _from, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata _data) external;
}
  1. 当代币被铸造时,转移事件 必须 被发出,就好像 EIP-20 和 EIP-1155 中的 _amount 数量的代币以及 EIP-721 和 EIP-1155 中的代币 id _id 是从地址 0x0转移到由 _to 标识的接收者地址。 总供应量 必须 相应增加。

  2. 当代币被销毁时,转移事件 必须 被发出,就好像 EIP-20 和 EIP-1155 中的 _amount 数量的代币以及 EIP-721 和 EIP-1155 中的代币 id _id 是从由 _to 标识的接收者地址转移到地址 0x0。 总供应量 必须 相应减少。

  3. safeMint 必须实现与 EIP-721EIP-1155 中定义的 safeTransferFrom 相同的接收者限制。

  4. 建议客户端实现如上所述的 EIP-165 标识符。

理由

  1. 接口有可能被整合到与 EIP-1155 相同的形式,即始终带有 _amount 字段, 无论它是 EIP-20、EIP-721 还是 EIP-1155。但我们选择每个 ERC 代币都应该有自己 表示代币数量的标准方式,以遵循其原始代币标准中 _id_amount 的相同方式。

  2. 我们选择分别使用 EIP-165 标识符来标识接口, 而不是使用单个标识符,因为接口的签名不同。

  3. 我们选择不创建新事件,而是要求使用 EIP-20、EIP-721 和 EIP-1155 所需的现有转移事件,以实现最大的兼容性。

  4. 我们选择为 EIP-1155 添加 safeMintBatchburnBatch 方法,但不为 EIP-721 添加,以分别遵循 EIP-721 和 EIP-1155 的约定。

  5. 我们没有为 EIP-777 添加扩展,因为它已经处理了铸造和销毁。

向后兼容性

此 EIP 旨在分别与 EIP-20、EIP-721 和 EIP-1155 兼容。

安全注意事项

此 EIP 取决于底层代币实现的账簿记录行为的安全性。 特别是,代币合约应仔细设计访问控制,以确定哪个角色被授予铸造新代币的权限。未能安全地保护这种行为可能导致欺诈性发行和总供应量的增加。

销毁也应仔细设计访问控制。通常只有以下两个角色有权销毁代币:

  • 角色 1. 当前代币持有者
  • 角色 2. 具有特殊权限的角色。

角色 1 或角色 2 中的任何一个或两者之间的共识都有权进行销毁操作。 但是,作为此 EIP 的作者,我们认识到可能存在第三种角色有权进行销毁的其他用例。 我们在此 EIP 中对此类限制保持较少的观点,但实施者应谨慎设计 限制。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Zainan Victor Zhou (@xinbenlv), "ERC-5679: 代币铸造和销毁," Ethereum Improvement Proposals, no. 5679, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5679.