Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7632: 命名 Token 的接口

允许 token 拥有字符串名称,并能够在名称和 ID 之间进行转换。

Authors Zainan Victor Zhou (@xinbenlv)
Created 2024-02-08
Discussion Link https://ethereum-magicians.org/t/erc-tbd-named-nfts-extending-erc-721/18550
Requires EIP-165

摘要

扩展使用 uint256 tokenId 的 token,以支持类型为 stringtokenName,并能够反向转换为 tokenId

动机

为了让市场、浏览器、钱包、DeFi 和 dApp 能够更好地展示和操作带有名称的 NFT。

规范

本文档中使用的关键词“必须 (MUST)”,“禁止 (MUST NOT)”,“需要 (REQUIRED)”,“应该 (SHALL)”,“不应该 (SHALL NOT)”,“推荐 (RECOMMENDED)”,“不推荐 (NOT RECOMMENDED)”,“可以 (MAY)”和“可选 (OPTIONAL)”按照 RFC 2119 和 RFC 8174 中的描述进行解释。

  1. 兼容的合约必须 (MUST) 支持 tokenName,并且必须 (MUST) 通过以下方式之一在 tokenNametokenId 之间进行映射:
    • 1a 所有兼容的合约都推荐 (RECOMMENDED) 实现以下接口:IERC_NamedTokenCore
      interface IERC_NamedTokenCore {
        function idToName(uint256 _tokenId) external view returns (string);
        function nameToId(string memory _tokenName) external returns (uint256);
      }
      

并且它应该满足以下行为规则: - 1a.1. 当引入新名称时,推荐 (RECOMMENDED) 发出事件 newName(uint256 indexed tokenId, string tokenName)。 - 1a.2. tokenId 和 tokenName 必须 (MUST) 是双向单映射,这意味着如果 tokenId 存在,则 tokenName 必须 (MUST) 存在,反之亦然,并且 tokenId = nameToId(idToName(tokenId))tokenName = idToName(nameToId(tokenName)) 必须 (MUST) 成立。

  • 1b. 如果兼容的合约未实现 IERC_NamedTokenCore, 它可以 (MAY) 遵循 tokenIdtokenName 之间的默认映射规则 uint256 tokenId = uint256(keccak256(tokenName))
  1. 对于兼容的合约,所有涉及 tokenId 的方法都推荐 (RECOMMENDED) 有一个以 ByName 结尾的对应方法,该方法将所有 uint256 tokenId 的参数替换为 string memory tokenName, 并且对应方法的行为必须 (MUST) 与原始方法一致。

  2. 兼容的合约可以 (MAY) 实现以下一个或多个额外的接口

interface IERC_NamedTokenExtension {
  function isValidTokenName(string memory _tokenName) external view returns (string);
  function normalizeTokenName(string memory _tokenName) external view returns (string memory);
}

理由

  1. 为了方便起见,我们允许默认方式来映射 tokenIdtokenName,但是 我们也允许合约实现他们自己的方式来映射 tokenIdtokenName 以获得灵活性。

  2. 我们考虑提供一个接口用于

向后兼容性

此提案与使用 uint256 tokenId 作为唯一标识符的 token 合约完全向后兼容。

安全考虑

此提案假设 tokenNametokenId 在所有 token 中都是唯一的。

如果 tokenName 未被规范化,则两个不同的 tokenName 可能会因它们看起来相似而混淆用户。如果允许使用非唯一的 tokenName,则合约开发者应声明规范化机制,使用 IERC_NamedTokenExtension

版权

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

Citation

Please cite this document as:

Zainan Victor Zhou (@xinbenlv), "ERC-7632: 命名 Token 的接口 [DRAFT]," Ethereum Improvement Proposals, no. 7632, February 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7632.