财产所有权 ERC721 代币的 NFT 元数据

问题描述 投票:0回答:1

大家好

我是 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:如果有任何其他建议或建议,我将不胜感激。

json solidity smartcontracts nft erc721
1个回答
0
投票

我应该在元数据中包含我的属性规格吗?

可以,但一般 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 库将相应地序列化它。

© www.soinside.com 2019 - 2024. All rights reserved.