快速导读
NFT(非同质化代币)让数字艺术品、音乐、游戏道具实现链上确权。本文手把手示范使用 Ropsten 测试网、MetaMask 钱包、Hardhat 开发环境、Alchemy 节点和 Pinata IPFS,从 0 到 1 完成 NFT 合约编写、部署与铸造。阅读完成后,你将能重复此流程并把作品迁移到以太坊主网上线。下文已移除广告、外链,仅保留必需操作步骤与关键概念解析,助你专注实战。
Part 1 编写并部署 ERC-721 NFT 合约
1. 连接以太坊网络
我们要把合约部署到 Ropsten 测试网 而非主网,因此需要先向区块链发出 RPC 请求。注册 Alchemy 免费账号后,新建 App,网络选择 Ropsten,即可获得专属 API 密钥。
👉 用最短时间获得可靠的以太坊节点服务,立即开启 NFT 创作流程
2. 配置 MetaMask
- 安装 MetaMask 浏览器插件
- 创建或导入钱包
- 网络切换到 Ropsten 测试网
⚠️ 谨记:主网与测试网地址相同但资产分离,测试网使用假 ETH,可避免误花真钱。
3. 领取测试网以太币
访问公共 Faucet,把测试地址粘进去,稍等几分钟即可在 MetaMask 看到余额 1–2 ETH。
4. 初始化 Hardhat 项目
mkdir my-nft && cd my-nft
npm init -y
npm install --save-dev hardhat
npx hardhat # 选择 “Create an empty hardhat.config.js”
mkdir contracts scripts5. 安装依赖与工具库
npm install @openzeppelin/contracts
npm install --save-dev @nomiclabs/hardhat-ethers ethers
npm install dotenv6. 编写 NFT 智能合约
文件:contracts/MyNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyNFT is ERC721URIStorage, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("MyFirstNFT", "MFN") {}
function mintNFT(address recipient, string memory tokenURI)
public onlyOwner
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
}关键词:ERC-721、mintNFT、tokenURI、智能合约、tokenId
7. 配置私钥与环境变量
在项目根目录新建 .env:
API_URL=https://eth-ropsten.alchemyapi.io/v2/<key>
PRIVATE_KEY=<MetaMask私钥>注意:把 .env 加入 .gitignore,切勿泄露。
更新 hardhat.config.js:
require("@nomiclabs/hardhat-ethers");
require("dotenv").config();
module.exports = {
solidity: "0.8.1",
defaultNetwork: "ropsten",
networks: {
ropsten: {
url: process.env.API_URL,
accounts: [`0x${process.env.PRIVATE_KEY}`]
}
}
};8. 编译与部署
npx hardhat compile # 生成编译产物新建 scripts/deploy.js:
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT");
const myNFT = await MyNFT.deploy();
await myNFT.deployed();
console.log("合约地址:", myNFT.address);
}
main();运行:
npx hardhat --network ropsten run scripts/deploy.js看到输出 合约地址 即部署成功。复制该地址,稍后铸造要用。
Part 2 铸造自己的 NFT
铸造 = 调用合约的 mintNFT 函数,把 tokenURI 指向存储在 IPFS 的 JSON 元数据。
1. 安装 Alchemy Web3
npm install @alch/alchemy-web32. 上传 NFT 图片与元数据
使用 Pinata(无需绑定信用卡,注册即用)。
- 上传一张图片 → 复制 CID
新建
nft-metadata.json,填入:{ "name": "火星小橘猫", "description": "移居火星的第一只橘猫,限量铸造。", "image": "https://gateway.pinata.cloud/ipfs/<图片-CID>", "attributes": [ { "trait_type": "颜色", "value": "橘色" }, { "trait_type": "稀有度", "value": "传说" } ] }- 再把该 JSON 文件上传 Pinata → 获取 metadata-CID 作为 tokenURI
3. 编写铸造脚本
scripts/mint-nft.js
require("dotenv").config();
const { createAlchemyWeb3 } = require("@alch/alchemy-web3");
const web3 = createAlchemyWeb3(process.env.API_URL);
const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json");
const contractAddress = "<部署出的合约地址>";
const nftContract = new web3.eth.Contract(contract.abi, contractAddress);
async function mintNFT(tokenURI) {
const nonce = await web3.eth.getTransactionCount(process.env.PUBLIC_KEY, 'latest');
const tx = {
from: process.env.PUBLIC_KEY,
to: contractAddress,
nonce,
gas: 500000,
data: nftContract.methods.mintNFT(process.env.PUBLIC_KEY, tokenURI).encodeABI()
};
const signed = await web3.eth.accounts.signTransaction(tx, process.env.PRIVATE_KEY);
const receipt = await web3.eth.sendSignedTransaction(signed.rawTransaction);
console.log("交易哈希:", receipt.transactionHash);
}
mintNFT("https://gateway.pinata.cloud/ipfs/<metadata-CID>");执行:
node scripts/mint-nft.js如出现交易哈希,即铸造完成!
Part 3 在手机钱包中查看 NFT
- 打开 MetaMask App
- 切网络到 Ropsten
进入「收藏品」→「导入 NFT」
- 合约地址:Part 1 部署地址
- 代币 ID:到 Ropsten Etherscan 查
Mint事件 log 中的tokenId
- 强制刷新钱包页面,几秒钟即可看到新铸造的「火星小橘猫」。
常见问答 FAQ
Q1:一定要用 Alchemy 吗?是否可换成其他节点服务商?
A:教程以 Alchemy 为例,因为其免费额度大、调试面板直观。你也可使用 Infura、Moralis 或自建节点替换 API_URL,核心步骤不变。
Q2:OpenSea 上没显示我铸造的 NFT,怎么办?
A:Ropsten 属于测试网,OpenSea 默认只展示主网 NFT。如要到 OpenSea 测试站,可访问 https://testnets.opensea.io/<你的地址>,如果仍不可见,多半 tokenURI 元数据配置有误,请检查 JSON 与图片链接能否在浏览器直接打开。
Q3:引用 OpenZeppelin 合约会不会很贵?
A:OpenZeppelin 的 ERC-721 模板已广泛应用于主流项目,不但安全可靠,还能节省大量自行编写和审计费用。
Q4:如何降低主网铸造时的 gas 费用?
A:可在 Gas Station 查询低峰时段,或用 EIP-1559 动态费率将 maxFeePerGas 设在市场均值以下并耐心等待;亦可将 NFT 部署到 Layer2 如 Polygon、Arbitrum,交易费用分分钟降到几毛钱。
Q5:能否删除或修改已铸造的 NFT?
A:链上数据不可篡改,但你可以通过 tokenURI 把图片和元数据换成空链接,实现观感上的“销毁”。真正删除只能基于焚烧(burn)函数,这需要合约事先实现 burn 逻辑。
Q6:如何批量发行 10 000 张 NFT 系列?
A:采用 ERC721A 或 ERC1155 标准 + 链下随机数生成图片组合,再用脚本循环调用 mintNFT,gas 成本与代码实现复杂度会大幅增加;推荐使用专业的 launchpad 联合审计,确保合规与可拓展。
写在最后
完成一次 NFT 合约部署与铸造 后,你已掌握 Web3 基本开发脉络。下一步可探索:
- 通过 Polygon 降低 gas 费
- 接入 The Graph 做数据统计
- 上线主网 OpenSea 吸引藏家
祝你发片顺利,早日拥有自己的百万级 NFT 项目!