0

我对 Solidity 和 NFT 很陌生。在包括官方 IPFS 教程在内的许多教程中,我看到如下内容:

    function mintToken(address owner, string memory metadataURI)
    public
    returns (uint256)
    {
        _tokenIds.increment();

        uint256 id = _tokenIds.current();
        _safeMint(owner, id);
        _setTokenURI(id, metadataURI);

        return id;
    }

因此,如果我理解正确,任何人都可以调用 mint 函数。意味着每个人都可以将任何 url 作为第二个参数,对吧?因此,假设有人会滥用铸币功能中的任何其他图像,我会将其存储在我的智能合约中并且永远无法摆脱它?我是对的吗?有安全的方法吗?没有找到关于那个的东西。

4

2 回答 2

0

您的假设是正确的 - 任何人都可以执行此函数并传递将存储在您的合约中的任何字符串参数。

您可以限制谁可以执行该功能,例如使用ownable模式。这是 OpenZeppelin 的一篇文章,涵盖了该主题 -链接

这是一个简单的授权方案,验证发件人是否是一个特定的地址。如果是(授权地址),则函数继续执行。如果不是,则执行恢复。

modifier onlyOwner {
    // only allow requests from the `0x123` address
    // requests from other addresses revert
    require(msg.sender == address(0x123), 'Not authorized');
    _;
}

function mintToken(address owner, string memory metadataURI)
    public
    onlyOwner // added the modifier
    returns (uint256)
{
    // ...
}
于 2021-09-14T07:59:06.877 回答
0

我最终没有将 ID 传递给 mint 函数,而是将种子传递给构造函数以散列 tokenId。使用相同的种子将我上传的文件散列到 IPFS。

于 2021-09-15T11:53:38.327 回答