首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在tokenURI实现中设置ERC721?

如何在tokenURI实现中设置ERC721?
EN

Ethereum用户
提问于 2022-09-20 21:06:44
回答 1查看 1.2K关注 0票数 1

最近,我正在研究ERC721智能合同,发现了一些我无法理解的东西。

看下面的代码-

代码语言:javascript
复制
    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())) : "";
    }

它描述了tokenURI()方法在ERC721令牌中的实现。

另外,看看在ERC721 721中编写的_baseURI实现-

代码语言:javascript
复制
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

现在,在tokenURI()方法中,_baseURI()返回"",从而将变量baseURI设置为""

如果对bytes(baseURI).length执行baseURI="",则得到0,因此条件bytes(baseURI).length > 0总是计算为false,而对于任何tokenIdtokenURI(tokenId)总是返回""

还有,看看这个-

现在,我怀疑tokenURI ( baseURI和tokenId的连接)是如何设置和返回的。

请让我把它理解错在哪里。提前感谢!

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-09-20 21:50:48

这是因为_baseURI()函数是virtual,应该从派生的契约中重写,实际上返回一个字符串值,由开发人员重写它考虑的字符串值。

例如:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";

contract MyERC721 is ERC721("Abc", "ABC") {

    function doSomething(uint256 tokenId) public view returns(string memory) {
        return tokenURI(tokenId);
    }

    function _baseURI() internal view override returns (string memory) {
        return "myBaseUrl";
    }

    // more logic

}

注意我是如何从ERC721合同继承的。

我重写了_baseURI()函数。然后,我在doSomething函数上调用tokenURI,它反过来将调用_baseURI(),而不是包含空字符串的_baseURI(),而是使用"myBaseUrl“字符串重写的_baseURI()函数。

因此,ERC721为您提供了基本功能,因此您可以覆盖添加所需的逻辑/数据所需的任何virtual函数。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/136047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档