大家好
我是 NFT 开发的新手,我正在尝试使用 ERC721 代币标准开发一个简单的财产所有权和市场。因为我对 json 很不熟悉,所以我对元数据有一些问题。
我在此结构中保存属性属性:
struct PropSpec {
uint256 height;
uint256 width;
uint256 x;
uint256 y;
}
我想在元数据中包含这些属性(我应该吗??) 我尝试使用下面的函数,但输出中的值没有正确显示,因为我猜我没有正确编写 json。
function tokenURI(
uint256 tokenId
) public view override returns (string memory) {
uint256 height = tokenIdtoSpec[tokenId].height;
uint256 width = tokenIdtoSpec[tokenId].width;
uint256 x = tokenIdtoSpec[tokenId].x;
uint256 y = tokenIdtoSpec[tokenId].y;
return
string(
abi.encodePacked(
_baseURI(),
Base64.encode(
bytes(
abi.encodePacked(
'{"name":"',
name(),
'","describtion":"EProp is a decentralized property ownership system.","attributes":[{"height":"',
height,
'","width":"',
width,
'","x":"',
x,
'","y":"',
y,
'",}],"image":"',
s_imageUri,
'"}'
)
)
)
)
);
}
tokenURI() 的输出:
data:application/json;base64,eyJuYW1lIjoiZVByb3AiLCJkZXNjcmlidGlvbiI6IkVQcm9wIGlzIGEgZGVjZW50cmFsaXplZCBwcm9wZXJ0eSBvd25lcnNoaXAgc3lzdGVtLiIsImF0dHJpYnV0ZXMiOlt7ImhlaWdodCI6IgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsIiwid2lkdGgiOiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQSIsIngiOiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASIsInkiOiIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASIsfV0sImltYWdlIjoiaXBmczovL1FtVlFmcXY1WU5YTDczeXBHMTI1QkJzb29XUmlWdWJGNW5tMmc5dFJ0UHR5eDgifQ==
我的问题是
第一:我应该在元数据中包含我的属性规格吗?
第二:如果我应该的话,在这种情况下json应该如何?
ps:如果有任何其他建议或建议,我将不胜感激。
我应该在元数据中包含我的属性规格吗?
可以,但一般 NFT 不会将其存储在智能合约中,因为存储成本昂贵。
它们将元数据作为 JSON 字符串存储在 IPFS 中。这将为您提供一个名为 CID 的唯一标识符。这只是一个 base62 编码的字符串,然后存储在智能合约中。
你可以这样做:
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract DecentralisedNFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("NFTName", "ANFT") {}
// Allows minting of a new NFT
function mintNFT(address collector, string memory metadataURI) public onlyOwner() {
_tokenIds.increment(); // NFT IDs start at 1
uint256 tokenId = _tokenIds.current();
_safeMint(collector, tokenId);
_setTokenURI(tokenId, metadataURI);
}
}
因此,一旦上传到 IPFS,您就可以调用
mintNFT()
,并传递 ipfs url。
您还可以使用nft.storage,它构建在IPFS之上。
如果应该的话,在这种情况下 json 应该如何?
不。从您的 Solidity 代码中可以看出,将其编码为 JSON 字符串并不容易。
您可以返回整个对象,例如:
function tokenURI(
uint256 tokenId
) public view override returns (PropSpec memory) {
return tokenIdtoSpec[tokenId]
}
您在前端使用的 web3 库将相应地序列化它。