Solidity
防止更新 ERC721 元數據
我有一個 ERC721 令牌,並且 TokenURI 被設置為 IPFS JSON 連結。JSON 包含有關 NFT 的元數據,例如名稱、顏色、圖像等。
問題是我有一個允許更新 TokenURI 的功能,但是如何防止“名稱”欄位被編輯?
還有另一種方法來儲存“名稱”元數據嗎?也許在 ERC721 契約的某個地方?
這是我的契約:
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v3.4/contracts/token/ERC721/ERC721.sol"; contract SampleNFTContract is ERC721 { constructor () public ERC721 ("NFTTest1", "NFT1"){ } // mint nft function createNFT(uint256 tokenID, string memory ipfsLink) external { _safeMint(msg.sender, tokenID); _setTokenURI(tokenID, ipfsLink); } // update ipfsLink function updateURL(uint256 tokenID, string memory ipfsLink) external { // check if owner require(_isApprovedOrOwner(_msgSender(), tokenID), "Only owner can update"); _setTokenURI(tokenID, ipfsLink); } }
見:https ://eips.ethereum.org/EIPS/eip-721#simple-summary
/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://eips.ethereum.org/EIPS/eip-721 /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface ERC721Metadata /* is ERC721 */ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string); }
您可以為名稱和符號使用額外的欄位。
我了解您正在尋求一種契約強制的方式來指定元數據將包含某個名稱。
當然,如果合約允許任意 URL 連結到可以具有任意
name
集合的任意 JSON,那麼您將無法實現此目標。這裡有一些選項。
- **放棄。**不要將名稱放在 中
ERC721Metadata
,而是創建一個tokenName(uint256)
您單獨管理的專有功能。- **使用ERC2477(草案)。**這使您可以對元數據進行一些控制,以確保名稱符合您的要求。請注意,這將要求您實施零知識證明或鏈上 JSON 解析器來驗證新元數據。
- **使用 0xcert 框架。**0xcert 框架專門設計用於為 ERC-721 令牌提供元數據完整性,它使用與您的案例兼容的不同雜湊技術(Merkle 樹)。但它要求您跨元數據版本使用相同的架構。