Tokens
在 ERC1155 中處理同一集合的多個 NFT 的最佳方法是什麼?
我正在學習ERC1155,我有點困惑。
這是 OpenZeppelin 的 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;