You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript上传元数据JSON到IPFS并在前端程序化Mint NFT

基于React+Web3程序化实现Polygon Mumbai链NFT铸造全流程指南

前置环境准备

首先初始化React项目并安装所需依赖:

  • 项目基础:用create-react-app初始化React前端项目
  • web3相关:ethers.js(也可替换为web3.js)、@metamask/detect-provider用于检测浏览器钱包
  • IPFS相关:ipfs-http-client用于调用IPFS节点上传文件
  • 工具依赖:buffer用于处理文件格式转换

步骤1:实现钱包连接与网络切换

首先完成MetaMask钱包连接,自动切换到Polygon Mumbai测试网,示例代码如下:

import { ethers } from "ethers";
import detectEthereumProvider from '@metamask/detect-provider';

const connectWallet = async () => {
  const provider = await detectEthereumProvider();
  if (!provider) {
    alert("请先安装MetaMask钱包");
    return;
  }
  // 请求账号授权
  const accounts = await provider.request({ method: 'eth_requestAccounts' });
  // 切换到Mumbai测试网
  try {
    await provider.request({
      method: 'wallet_switchEthereumChain',
      params: [{ chainId: '0x13881' }],
    });
  } catch (switchError) {
    // 未添加Mumbai网络时自动添加
    if (switchError.code === 4902) {
      await provider.request({
        method: 'wallet_addEthereumChain',
        params: [
          {
            chainId: '0x13881',
            chainName: 'Polygon Mumbai Testnet',
            rpcUrls: ['https://rpc-mumbai.maticvigil.com/'],
            nativeCurrency: {
              name: 'MATIC',
              symbol: 'MATIC',
              decimals: 18
            },
            blockExplorerUrls: ['https://mumbai.polygonscan.com/']
          },
        ],
      });
    }
  }
  const ethersProvider = new ethers.providers.Web3Provider(provider);
  const signer = ethersProvider.getSigner();
  return { signer, account: accounts[0] };
}

步骤2:实现资源文件上传IPFS

无需本地安装IPFS节点,直接调用公共IPFS节点完成文件上传,示例代码如下:

import { create } from 'ipfs-http-client';

// 初始化IPFS客户端,也可替换为本地节点、自建节点
const ipfs = create({
  host: 'ipfs.infura.io',
  port: 5001,
  protocol: 'https'
});

// 上传NFT图片到IPFS
const uploadImageToIPFS = async (file) => {
  const result = await ipfs.add(file);
  return `https://ipfs.io/ipfs/${result.path}`;
}

// 生成metadata并上传到IPFS
const uploadMetadataToIPFS = async (imageUrl, nftName, nftDesc) => {
  const metadata = {
    name: nftName,
    description: nftDesc,
    image: imageUrl
  };
  const result = await ipfs.add(JSON.stringify(metadata));
  return `https://ipfs.io/ipfs/${result.path}`;
}

步骤3:调用智能合约完成铸造

提前准备好已部署的合约地址、合约ABI,调用mint方法完成NFT铸造,示例代码如下:

// 替换为你部署的合约ABI,可直接从Remix、Hardhat编译结果中复制
const NFT_CONTRACT_ABI = [
  "function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner"
];
// 替换为你部署的合约地址
const NFT_CONTRACT_ADDRESS = "你的合约实际部署地址";

const mintNFT = async (signer, receiverAddress, tokenId, metadataUri) => {
  const nftContract = new ethers.Contract(NFT_CONTRACT_ADDRESS, NFT_CONTRACT_ABI, signer);
  // 发起铸造交易
  const tx = await nftContract.mint(receiverAddress, tokenId, metadataUri);
  // 等待交易上链确认
  await tx.wait();
  return tx.hash;
}

步骤4:结果验证

交易确认后,即可前往OpenSea测试网选择Mumbai网络,输入持有者地址查看铸造完成的NFT。也可在前端调用合约的tokenURI方法,验证元数据是否成功上链。

注意事项

  • 提前准备Mumbai测试网MATIC代币支付gas费
  • tokenId需要保证全局唯一,不可重复使用,可提前调用合约totalSupply方法获取当前总供应量作为新tokenId
  • 如果你部署的合约设置了onlyOwner修饰符,只有合约部署者账号可以调用mint方法,如需开放给所有用户铸造可删除该修饰符
  • 公共IPFS网关可能存在访问延迟,可替换为自建IPFS网关提升稳定性

内容的提问来源于stack exchange,提问作者user16945874

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:54:04