Tokens

在 ERC1155 中處理同一集合的多個 NFT 的最佳方法是什麼?

  • November 10, 2021

我正在學習ERC1155,我有點困惑。

這是 OpenZeppelin 的 ERC1155 合約範例:

打開 Zeppelin ERC1155 範例

他們說雷神之鎚是 NFT(因為只鑄造了 1 個),而黃金是可替代的。

因此,此範例包含幾個 Fungible Tokens:

  • 金子

只有一個不可替代的代幣:

  • 雷神之鎚

但是,如果我希望我的 ERC1155 合約擁有多個不可替代代幣集合怎麼辦?

例如,假設我想創建一個足球比賽:

  • 2 種可替代代幣:

    • 金子
  • 4 個 NFT 集合:

    • 球員
    • 教練員
    • 球衣
    • 體育場館

範常式式碼:

//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.7.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.7/contracts/token/ERC1155/ERC1155.sol";

contract FootballGame is ERC1155 {
   
   address public admin;
   
   // Non-Fungibles
   uint8 public constant PLAYER = 1;
   uint8 public constant COACH = 2;
   uint8 public constant JERSEY = 3;
   uint8 public constant STADIUM = 4;
   
   // Fungibles
   uint8 public constant GOLD = 5;
   uint8 public constant SILVER = 6;
   
   constructor() ERC1155("https://example.json") {
       admin = msg.sender;
   }
   
   modifier onlyAdmin() {
       require(msg.sender == admin, "This operation is only for Admins");
       _;
   }
   
   function mintCoins(uint _coinId, uint _amount) onlyAdmin external {
       require(_coinId == GOLD || _coinId == SILVER, "Invalid Coin ID");
       _mint(msg.sender, _coinId, _amount, "");
   }
   
   function mintNFT(uint _tokenId) onlyAdmin external {
       require(_tokenId == PLAYER || _tokenId == COACH || _tokenId == JERSEY || _tokenId == STADIUM, "Invalid Token ID");
       _mint(msg.sender, _tokenId, 1, "");
   }
}

這是正確的嗎?

常量變數應該是代表每種令牌的 ID,對吧?還是錯了?

例如,如果我想創建多個體育場,我可以只用體育場集合的 ID 鑄造多個 NFT 嗎?

還是我必須鑄造 ID 為 22 的體育場 A、ID 為 23 的體育場 B、ID 為 24 的體育場 C,等等?

對於 ERC1155 中的 NFT,每個 NFT 是否都有一個 ID?還是針對每個 NFT 集合?

簡短的回答是,它看起來像後者,每個 NFT 的唯一 ID,不管分組(例如體育場)。但是要進行類似 NFT 的分組,有幾個考慮因素:

nft範例實現使用一個 IS_NFT 位來表示具有單電源的 id。請注意,mint 使用 packId。也許這可以為您的案例更簡單地完成,或者您可以只使用範常式式碼。

而且,從規範的元數據部分……

此 JSON 模式大致基於“ERC721 元數據 JSON 模式”,但包含可選格式以允許客戶端替換 ID。如果字元串 {id} 存在於任何 JSON 值中,則必須由遵循此標準的所有客戶端軟體替換為實際的令牌 ID。

這可能是一種與沒有大而笨重的 id 不同的化妝品。

你可以做的是有一個跟踪 NFT 所屬的映射,如下所示:

mapping(uint256=> string) public nftsCollections;
//whenever you mint an nft require the admin to pass the collection name and  //add it to this collection
nftsCollections[id]=collectionName;

引用自:https://ethereum.stackexchange.com/questions/98422