Alert Source Discuss
Standards Track: ERC

ERC-5606: 多元宇宙 NFT

一种通用的多重相关 NFT 表示方式,将其作为跨各种平台的单个数字资产

Authors Gaurang Torvekar (@gaurangtorvekar), Khemraj Adhawade (@akhemraj), Nikhil Asrani (@nikhilasrani)
Created 2022-09-06
Requires EIP-721, EIP-1155

摘要

本规范定义了一个最小接口来创建一个多元宇宙 NFT 标准,用于数字资产,例如穿着式装备和游戏内物品,这些资产反过来索引每个平台上的委托 NFT。这些平台可以是元宇宙、边玩边赚游戏或 NFT 市场。本提案依赖并扩展了 ERC-721ERC-1155。该标准还允许在多元宇宙 NFT 中“捆绑”和“解绑”这些委托 NFT,因此持有者可以单独或作为一个包进行交易。

动机

存在几个元宇宙和区块链游戏(“平台”),它们使用 NFT 标准(例如 ERC-721 和 ERC-1155)来创建宇宙内资产,如头像穿戴、游戏内物品(包括武器、盾牌、药水等)。使用这些标准的最大缺点是这些平台之间没有互操作性。作为发布者,您必须在各种平台上以单独的 ERC-721 或 ERC-1155 代币发布相同的数字资产(例如,一件衬衫)。此外,它们之间没有任何关系,尽管它们在现实中代表的是相同的数字资产。因此,很难在链上证明这些物品的稀缺性。

自问世以来,NFT 旨在实现互操作性并证明数字资产的稀缺性。虽然 NFT 可以说是证明了物品的稀缺性,但互操作性方面尚未得到解决。创建一个多元宇宙 NFT 标准,允许跨各种平台索引和拥有数字资产,这将是实现跨平台互操作性和真正所有权的第一步。

在 web3 生态系统中,NFT 已经发展到代表多种类型的独特和非同质化资产。一种类型的资产包括一组彼此相关的 NFT。例如,如果一个品牌在各个元宇宙中发布一款新运动鞋,它将在每个平台上作为单独的 NFT 进行铸造。然而,实际上,它是同一款运动鞋。 随着元宇宙和区块链游戏获得更多主流采用,需要表示这些类型的 NFT 的关系和可转移性。生态系统需要一个更好的框架来解决这个问题,而不是依赖于应用程序级别。这个框架应该定义这些资产之间的关系以及它们关联的性质。组合的认可、使用和这些单独 NFT 作为包的可转移性比它们本身更有价值。

规范

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

多元宇宙 NFT 合约代表跨多个平台的数字资产。该合约可以通过捆绑或解绑来拥有数字资产在各种平台上的一个或多个委托 NFT 代币。

/**
* @dev EIP 中定义的 Multiverse NFT 标准的接口。
*/
interface IMultiverseNFT {

   /**
    * @dev 用于存储委托代币详细信息的结构体
    *
    */
   struct DelegateData {
       address contractAddress;
       uint256 tokenId;
       uint256 quantity;
   }

   /**
    * @dev 当一个或多个新的委托 NFT 添加到 Multiverse NFT 时发出
    */
   event Bundled(uint256 multiverseTokenID, DelegateData[] delegateData, address ownerAddress);


   /**
    * @dev 当从 Multiverse NFT 中删除一个或多个委托 NFT 时发出
    */
   event Unbundled(uint256 multiverseTokenID, DelegateData[] delegateData);

   /**
    * @dev 接受 Multiverse NFT 的 tokenId 并返回委托代币数据的数组
    */
   function delegateTokens(uint256 multiverseTokenID) external view returns (DelegateData[] memory);

   /**
    * @dev 从 Multiverse NFT 中删除一个或多个委托 NFT
    * 此函数接受委托 NFT 详细信息并将这些 NFT 从 Multiverse NFT 合约转移到所有者的钱包
    */
   function unbundle(DelegateData[] memory delegateData, uint256 multiverseTokenID) external;

   /**
    * @dev 将一个或多个委托 NFT 添加到 Multiverse NFT
    * 此函数接受委托 NFT 详细信息并将这些 NFT 转移到 Multiverse NFT 合约
    * 需要确保已为此 Multiverse NFT 合约授予委托 NFT 的批准,以便可以以编程方式转移它们
    */
   function bundle(DelegateData[] memory delegateData, uint256 multiverseTokenID) external;

   /**
    * @dev 初始化一个新的包,铸造一个 Multiverse NFT 并将其分配给 msg.sender
    * 返回新的 Multiverse NFT 的代币 ID
    * 注意 - 当初始化一个新的 Multiverse NFT 时,它是空的;它不包含任何委托 NFT
    */
   function initBundle(DelegateData[] memory delegateData) external;
}

任何实现此标准的 dapp 都会通过调用函数 initBundle 来初始化一个包。这将铸造一个新的多元宇宙 NFT 并将其分配给 msg.sender。在创建包时,委托代币合约地址和代币 ID 在初始化期间设置,之后无法更改。这避免了可能错误地将不相关的 NFT 捆绑在一起的意外情况。

一旦初始化了一个包,就可以通过调用函数 bundle 并传递多元宇宙 NFT 的代币 ID,将委托 NFT 代币转移到此 Multiverse NFT 合约。对于 dapp 来说,在调用 bundle 函数之前,从所有者处获得对此 Multiverse NFT 合约的委托 NFT 的“批准”至关重要。之后,Multiverse NFT 拥有此数字资产在各个平台上的一个或多个版本。

如果多元宇宙 NFT 的所有者想要出售或使用各个平台上的各个委托 NFT,他们可以通过调用函数 unbundle 来实现。此函数将特定的委托 NFT 代币转移到 msg.sender(仅当 msg.sender 是多元宇宙 NFT 的所有者时)。

理由

delegateData 结构体包含有关每个平台上的委托 NFT 代币的信息。它包含诸如 contractAddresstokenIdquantity 等变量来区分 NFT。这些 NFT 可以遵循 ERC-721 标准或 ERC-1155 标准。

bundleunbundle 函数接受 DelegateData 结构体数组,因为需要满足部分捆绑和解绑的需求。例如,用户可以使用三个委托 NFT 初始化一个包,但他们应该能够在任何时候捆绑和解绑少于三个。他们永远不能捆绑或解绑超过三个。他们还需要委托 NFT 的各个代币 ID 来选择性地捆绑和解绑。

向后兼容性

此标准与 ERC-721 和 ERC-1155 完全兼容。不支持此 EIP 的第三方应用程序仍然可以毫无问题地使用原始 NFT 标准。

参考实现

MultiverseNFT.sol

安全考虑

bundle 函数涉及调用外部合约。因此,在实现此函数时应采取重入预防措施。

版权

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

Citation

Please cite this document as:

Gaurang Torvekar (@gaurangtorvekar), Khemraj Adhawade (@akhemraj), Nikhil Asrani (@nikhilasrani), "ERC-5606: 多元宇宙 NFT," Ethereum Improvement Proposals, no. 5606, September 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-5606.