【问题标题】:Using IPFS to mint an NFT the safe way使用 IPFS 以安全的方式铸造 NFT
【发布时间】:2021-11-09 06:29:34
【问题描述】:

我对 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 作为第二个参数,对吧?因此,假设有人会滥用铸币功能中的任何其他图像,我会将其存储在我的智能合约中并且永远无法摆脱它?我是对的吗?有安全的方法吗?没找到相关内容。

【问题讨论】:

    标签: solidity smartcontracts ipfs nft


    【解决方案1】:

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

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

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

    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)
    {
        // ...
    }
    

    【讨论】:

    • 但这只有在所有者是唯一铸币者的情况下才有效?
    • @ccc1da70-5e63-4879-a4cb-adb604 没错。您可以修改授权以使用多个允许的地址。或者你可以添加一个只允许某个域的条件......这一切都取决于你的需要。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2022-07-15
      • 2022-08-12
      • 1970-01-01
      • 2022-08-12
      • 2022-01-17
      相关资源
      最近更新 更多