gpt4 book ai didi

ethereum - 哪些信息持有 NFT?

转载 作者:行者123 更新时间:2023-12-04 07:50:25 24 4
gpt4 key购买 nike

我正在使用 Solidity 开发 NFT 市场,特别是我正在 OpenZeppelin 的 ERC-721 智能合约之上创建我自己的智能合约。我的 NFT 目前有 5 个图像属性(id、图像、描述、集合和图像),我保存了 ipfs 在上传时开发的哈希值。
我的问题是在哪里保存所有这些属性,因为我有具有上述属性的 Image 结构,我将它添加到一个数组中,并使用数组中 Image 对象的 id 和创建者的地址创建 NFT。我的意思是,我保存了 ERC-721 合约之外的所有信息,所以我不太明白 NFT 是什么,因为属性不是来自 NFT,但 NFT 是我的结构的一个属性。
我是否正确实现了它并且 ERC-721 标准只是 NFT 的必要功能,还是我将信息保存在它不接触的地方?
我的代码目前如下:

pragma solidity ^0.5.0;

import "./ERC721Full.sol";

contract NftShop is ERC721Full {
string public name;
Image[] public nft;
uint public imageId = 0;
mapping(uint => bool) public _nftExists;
mapping(uint => Image) public images;

struct Image {
uint id; //id of the nft
string hash; //hash of the ipfs
string description; //nft description
string collection; //what collection the nft bellongs
address payable author; //creator of the nft
}

//Event used when new Token is created
event TokenCreated(
uint id,
string hash,
string description,
string collection,
address payable author
);

constructor() public payable ERC721Full("NftShop", "NFTSHOP") {
name = "NftShop";
}

//uploadImage to the blockchain and mint the nft.
function uploadImage(string memory _imgHash, string memory _description, string memory _collection) public {
// Make sure the image hash exists
require(bytes(_imgHash).length > 0);
// Make sure image description exists
require(bytes(_description).length > 0);
// Make sure collectionage exists
require(bytes(_collection).length > 0);
// Make sure uploader address exists
require(msg.sender!=address(0));

// Increment image id
imageId ++;

// Add Image to the contract
images[imageId] = Image(imageId, _imgHash, _description, _collection, msg.sender);

//Mint the token
require(!_nftExists[imageId]);
uint _id = nft.push(images[imageId]);
_mint(msg.sender, _id);
_nftExists[imageId] = true;

// Trigger an event
emit TokenCreated(imageId, _imgHash, _description, _collection, msg.sender);
}
}
如果有什么奇怪的东西,关于如何改进代码的任何建议都是受欢迎的。
我希望这不是一个荒谬的问题,我是从以太坊的世界开始的。
非常感谢。

最佳答案

是的,图片地址等信息存储在继承自ERC721的合约中。 ERC721 主要跟踪代币的所有权、类型转换和转移。
您可能要考虑的一件事是 token 的唯一性。在您的示例中,可以存在许多具有相同图像和描述的标记。
您可能希望通过存储 _imgHash、_description、_collection 的散列并要求它是唯一的来防止这种情况发生,这样任何用户都不能创建现有 token 的“副本”。
就像是:

keccak256(abi.encodePacked(_imgHash, _description, _collection))
另一个常用的标准是 Opensea 元数据标准,其中 tokenURI 存储在链上,元数据位于区块链之外。 https://docs.opensea.io/docs/metadata-standards

关于ethereum - 哪些信息持有 NFT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67018238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com