繁体   English   中英

如何将我的 IPFS 内容链接到 ERC721 合约?

[英]How to link my IPFS content to ERC721 contract?

我正在尝试制作一个简单的 ERC721 NFT 铸币合约。 我创建了一个图像及其相应的元数据,并将它们上传到 ipfs。 此图像和元数据何时与智能合约中创建的令牌链接? 我试图使用 Openzeppelin 合约向导生成的这段代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MyToken is ERC721, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;

    constructor() ERC721("MyToken", "MTK") {}

    function safeMint(address to) public onlyOwner {
        uint256 tokenId = _tokenIdCounter.current();
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
    }
}

但是我看不到在哪里可以将我的 nft 图像和元数据链接到合同。 我已经看到,在 openzeppelin 的 ERC721 标准中,您可以使用函数tokenURI和 _baseURI 设置基本 URI 和_baseURI ,但我不知道如何使用它们。 我计划创建一个多项目集合(在 ipfs 中),所以我不知道在我的情况下使用什么。

你写的函数不够用。 当你使用 NFT 时,你必须设置一些状态变量。 您必须跟踪列出的项目、令牌 ID、使用的令牌 URL。 (您的合约逻辑可能不同)。 此外,在铸造令牌之前,您必须添加一些验证语句。 首先定义你的状态变量:

 using Counters for Counters.Counter;
  // initially 0
  Counters.Counter private _listedItems;
  Counters.Counter private _tokenIds;
  uint public listingPrice=0.025 ether;

  // mapping is similar to object in javascript
  mapping(string=>bool) private _usedTokenURIs;

然后编写铸币逻辑:

function mintToken(string memory tokenURI,uint price) public payable returns (uint){
    // make sure you do not mint same uri
    require( _usedTokenURIs[tokenURI]==false,"Token URI already exists");
    // since this function is payable, the amount that you sent is stored in msg.value by ethereum evm
    require(msg.value==listingPrice,"Price must be equal to listing fee");
    _tokenIds.increment();
    _listedItems.increment();
    uint newTokenId=_tokenIds.current();
    // this is a wrapper for _mint
    _safeMint(msg.sender,newTokenId);
    _setTokenURI(newTokenId, tokenURI);
    _createNftItem(newTokenId,price);
    // update _usedTokenURIs mapping
    _usedTokenURIs[tokenURI]=true;
    return newTokenId;
  }

现在要将 ipfs 链接存储在区块链中,您必须在前端调用mintToken函数。 您创建一个表单,添加与元数据相关的输入,并将 json 元数据和图像发布到 ipfs。 当您发布数据时,您将获得 nft uri。 将 nft uri 存储在状态中。 然后你在前端写一个 createNft 函数。 成功调用contract.mintToken函数后,您的 ipfs 链接将存储在区块链上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM