最近,我正在研究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())) : "";
}它描述了tokenURI()方法在ERC721令牌中的实现。
另外,看看在ERC721 721中编写的_baseURI实现-
function _baseURI() internal view virtual returns (string memory) {
return "";
}现在,在tokenURI()方法中,_baseURI()返回"",从而将变量baseURI设置为""。
如果对bytes(baseURI).length执行baseURI="",则得到0,因此条件bytes(baseURI).length > 0总是计算为false,而对于任何tokenId,tokenURI(tokenId)总是返回""
还有,看看这个-

现在,我怀疑tokenURI ( baseURI和tokenId的连接)是如何设置和返回的。
请让我把它理解错在哪里。提前感谢!
发布于 2022-09-20 21:50:48
这是因为_baseURI()函数是virtual,应该从派生的契约中重写,实际上返回一个字符串值,由开发人员重写它考虑的字符串值。
例如:
// 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函数。
https://ethereum.stackexchange.com/questions/136047
复制相似问题