做数字藏品最重要的function是tokenURI(tokenId)。

实现1 根本途径+tokenID ERC721


function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}

没有装备根本途径(baseURI)时,tokenURI返回空,假如装备根本途径,则返回根本途径+tokenID的组合。

假如根本途径是 demo.com/meta/ 则能够返回 demo.com/meta/1 这样的tokenURI

注:若咱们想返回带 .json 的 tokenURI ,咱们能够重载这个函数


function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
}

实现2 给每一个tokenID配上独立的tokenURI ERC721URIStorage


function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);
    string memory _tokenURI = _tokenURIs[tokenId];
    string memory base = _baseURI();
    // If there is no base URI, return the token URI.
    if (bytes(base).length == 0) {
        return _tokenURI;
    }
    // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
    if (bytes(_tokenURI).length > 0) {
        return string(abi.encodePacked(base, _tokenURI));
    }
    return super.tokenURI(tokenId);
}

咱们用了一个变量 _tokenURIs 单独保存每一个token的uri

假如没有运用_baseURI装备,则函数返回悉数tokenURI

假如运用了_baseURI装备,则拼接根本途径+tokenURI

在运用_baseURI的情况下,只要把每一个tokenURI装备成 {id}.json 也可获得 demo.com/meta/1.json 的格局

不过都需求_setTokenURI了,就不差装备悉数url地址

相对比下,假如不想在铸造的时分装备URI,选第一种方式仍是比较简单的