一步步教你编写、部署并在以太坊铸造 NFT

·

快速导读

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

⚠️ 谨记:主网与测试网地址相同但资产分离,测试网使用假 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 scripts

5. 安装依赖与工具库

npm install @openzeppelin/contracts
npm install --save-dev @nomiclabs/hardhat-ethers ethers
npm install dotenv

6. 编写 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-web3

2. 上传 NFT 图片与元数据

使用 Pinata(无需绑定信用卡,注册即用)。

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

  1. 打开 MetaMask App
  2. 切网络到 Ropsten
  3. 进入「收藏品」→「导入 NFT」

    • 合约地址:Part 1 部署地址
    • 代币 ID:到 Ropsten Etherscan 查 Mint 事件 log 中的 tokenId
  4. 强制刷新钱包页面,几秒钟即可看到新铸造的「火星小橘猫」。

常见问答 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:采用 ERC721AERC1155 标准 + 链下随机数生成图片组合,再用脚本循环调用 mintNFT,gas 成本与代码实现复杂度会大幅增加;推荐使用专业的 launchpad 联合审计,确保合规与可拓展。


写在最后

完成一次 NFT 合约部署与铸造 后,你已掌握 Web3 基本开发脉络。下一步可探索:

👉 想提前布局下一次行情?点此解锁更高效的链上工具升级思路

祝你发片顺利,早日拥有自己的百万级 NFT 项目!