在 10 分钟内完成 NFT 铸造全流程:第二篇

·

如果你想快速把数字艺术品变成链上独一无二的 NFT,这篇文章带你从零开始 10 分钟内完成 NFT 铸造,并附赠实战代码与开源脚本的完整讲解。
前置条件:已完成 第一篇:部署 ERC-721 智能合约

关键词:ERC-721、Alchemy、Solidity、智能合约、初学者、NFT 铸造、Web3.js、Pinata、元数据、链上交互


准备工作:安装 Alchemy Web3 库

与 Ethers.js 类似,Web3 是连接 Ethereum 区块链的“翻译官”。本教程选用 Alchemy 增强版,自带重试机制与 WebSocket 支持,帮你省下反复调试网络请求的麻烦。

打开项目根目录终端,执行:

npm install @alch/alchemy-web3

创建 mint-nft.js 脚本

scripts/ 目录新建 mint-nft.js,先写三行代码与 Alchemy 握手:

require("dotenv").config();
const API_URL = process.env.API_URL;
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(API_URL);

获取合约 ABI

ABI(Application Binary Interface)就像 Solidity 函数的说明书,向链外应用暴露可操作接口。

Hardhat 编译后会自动生成 ABI,路径:

artifacts/contracts/MyNFT.sol/MyNFT.json

加载文件进脚本:

const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");

👉 想自由调试 ABI 输出?一行 console 即可打印完整结构。


上传 NFT 资产到 IPFS

选择 Pinata 作为网关

为保 NFT 真正去中心化,我们将图片与元数据同时托管在 IPFS 上,操作平台为 Pinata。流程如下:

  1. 注册并验证邮箱。
  2. 进入 Files 页,点击「Upload」上传主图 JPG/PNG。
  3. 上传成功后,复制 CID,生成公开链接:

    https://gateway.pinata.cloud/ipfs/<CID>

编写元数据 JSON

把下面示例保存为 nft-metadata.json修改 image 字段的 CID 为你刚上传的图片 CID。

{
  "attributes":[
    {"trait_type":"Breed","value":"Maltipoo"},
    {"trait_type":"Eye color","value":"Mocha"}
  ],
  "description":"The world's most adorable and sensitive pup.",
  "image":"ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb",
  "name":"Ramses"
}

再次用 Pinata 上传该 JSON,记录新生成的 CID,称为 metadataCID


实例化合约对象

  1. Sepolia Etherscan 找到你部署的合约地址,例如:

    0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778
  2. 把地址写入 .env
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-private-key"
PUBLIC_KEY="your-public-address"
  1. 在脚本中创建合约实例:
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
const nftContract = new web3.eth.Contract(contract.abi, contractAddress);

构造 mintNFT 交易体

变量说明

核心代码:

async function mintNFT(tokenURI) {
  const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest");
  const tx = {
    from: PUBLIC_KEY,
    to: contractAddress,
    nonce: nonce,
    gas: 500000,
    data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(),
  };

  const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY);
  signPromise
    .then((signedTx) => {
      web3.eth.sendSignedTransaction(
        signedTx.rawTransaction,
        function (err, hash) {
          if (!err) {
            console.log(
              `交易哈希:${hash}\n前往 Alchemy Mempool 查询状态!`
            );
          } else {
            console.error("交易发送失败:", err);
          }
        }
      );
    })
    .catch((err) => console.error("签名出错:", err));
}

一键铸造 NFT

metadataCID 拼成链接:

ipfs://metadataCID

在脚本末尾调用:

mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP");

终端执行:

node scripts/mint-nft.js

几秒后拿到哈希,如:

0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8

监控交易状态

打开 Alchemy MempoolSepolia Etherscan 粘贴哈希,即可看到「Pending → Confirmed」的转变。

👉 亲手铸造的记录玩家都在这儿实时蹲矿,查看主网与测试网最新 Gas 低开区!


FAQ:铸造 NFT 常见疑问

Q1:报错 insufficient funds 怎么办?

A:测试网 Sepolia 可到官方水龙头申领;主网则需提前往钱包转 ETH 并留意 Gas Price

Q2:CID 后加空格能成功?

A:不能。去掉任何多余空格,保持链接简洁 ipfs://CID

Q3:重复跑脚本会生成同一枚 NFT 吗?

A:只要 tokenURI 不同,就会生成新 ID 的新 NFT;相同 tokenURI 链上只会更新元数据或触发回滚,取决于合约逻辑。

Q4:元数据里可以支持 MP4、SVG?

A:只要 IPFS 支持的文件类型都没问题,SVG 矢量甚至会被钱包直接渲染,Gas 更低。

Q5:如何给 NFT 再版?

A:把新文件上新 URI,更新 tokenURI 指向即可。注意 智能合约升级与可修改性 已在设计时考虑。


下一步:在钱包展示 NFT

恭喜你完成链上铸造!别忘了继续阅读 第三篇:把 NFT 添加进 MetaMask/钱包,学会验证与快速分享你作品,让齐刷刷的预览图直接跳屏出现。

NFT铸造 #区块链技术 #智能合约实操