如果你想快速把数字艺术品变成链上独一无二的 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。流程如下:
- 注册并验证邮箱。
- 进入
Files页,点击「Upload」上传主图 JPG/PNG。 上传成功后,复制 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。
实例化合约对象
在 Sepolia Etherscan 找到你部署的合约地址,例如:
0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778- 把地址写入
.env:
API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY="your-private-key"
PUBLIC_KEY="your-public-address"- 在脚本中创建合约实例:
const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778";
const nftContract = new web3.eth.Contract(contract.abi, contractAddress);构造 mintNFT 交易体
变量说明
- from:发送方公钥
- to:你的 NFT 合约地址
- nonce:地址交易次序号,防重放攻击
- gas:预估消耗燃料
- data:调用合约函数及其参数二进制编码
核心代码:
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 Mempool 或 Sepolia 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/钱包,学会验证与快速分享你作品,让齐刷刷的预览图直接跳屏出现。