在区块链的世界里,NFT(非同质化代币)已成为数字艺术、收藏品、虚拟资产等领域的核心载体,如果你也想拥有自己的NFT项目,第一步就是在以太坊上部署NFT合约,本文将以“零基础友好”为原则,从环境准备到合约部署,一步步带你完成整个过程,即使是新手也能轻松上手。
为什么选择以太坊部署NFT
以太坊作为最早的智能合约平台,拥有最成熟的NFT标准(如ERC-721、ERC-1155)、最大的用户群体和最完善的生态(如OpenSea、Rarible等NFT市场),尽管其 gas 费用较高,但对于初学者和需要稳定生态支持的项目来说,仍是首选。
前置准备:工具与环境
在部署合约前,你需要准备好以下工具,它们就像“开发工具箱”,缺一不可:
以太坊钱包
推荐使用 MetaMask(浏览器插件钱包),支持创建和管理钱包地址,存储私钥,并与以太坊网络交互。
- 安装:访问MetaMask官网(metamask.io),下载对应浏览器的插件(Chrome、Firefox等)。
- 创建钱包:按照提示设置密码、备份助记词(务必妥善保存,丢失将无法找回资产)。
测试网ETH
以太坊主网的交易需要真实ETH(用于支付gas费),而测试网(如Goerli、Sepolia)提供免费的“测试ETH”,供开发者调试。
- 获取测试ETH:前往 Faucet(水龙头)网站,如Goerli Faucet(https://goerlifaucet.com/),输入钱包地址领取(注意:部分水龙头需要完成社交任务或等待时间)。
开发环境
- Node.js:JavaScript运行环境,建议安装LTS版本(v16+)。
- npm/yarn:包管理工具,随Node.js安装(
npm install -g yarn可安装yarn)。 - Hardhat:以太坊开发框架,支持编译、测试、部署智能合约,适合初学者。
创建NFT项目与编写合约
我们用Hardhat框架创建一个符合ERC-721标准的NFT合约(ERC-721是“非同质化代币”标准,每个NFT独一无二)。
初始化Hardhat项目
打开终端,执行以下命令:
mkdir my-nft-project && cd my-nft-project npm init -y npm install --save-dev hardhat npx hardhat
在交互式界面中选择“Create a basic sample project”,然后按提示输入项目名称(默认即可)。
编写NFT合约
进入contracts目录,你会看到一个默认的Lock.sol文件,将其重命名为MyNFT.sol,并编写以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}
function safeMint(address to, uint256 tokenId) public onlyOwner {
_safeMint(to, tokenId);
}
function _baseURI() internal pure override returns (string memory) {
return "https://your-metadata-base-uri.com/"; // 替换为你的NFT元数据基础URI
}
function getCurrentTokenId() public view returns (uint256) {
return _tokenIdCounter.current();
}
}
代码解析:
import:引入OpenZeppelin合约库(ERC721标准实现,避免重复造轮子)。constructor:初始化NFT名称(如“My NFT”)和符号(如“MNFT”)。safeMint:铸造NFT的核心函数,仅合约所有者可调用(onlyOwner)。_baseURI:NFT元数据的链接前缀(每个NFT的元数据通过{id}.json访问,如https://your-metadata-base-uri.com/1.json)。
安装依赖
OpenZeppelin合约库需要手动安装:
npm install @openzeppelin/contracts
编译与测试合约
编译合约
在终端执行:
npx hardhat compile
成功后,会在artifacts/contracts/MyNFT.sol/MyNFT.json生成合约的ABI(应用二进制接口)和字节码,这是后续部署的关键文件。
测试合约(可选但推荐)
在test目录创建myNft.test.js文件,编写测试用例(如铸造NFT的功能验证),然后运行:
npx hardhat test
测试能确保合约逻辑正确,避免部署后出现低级错误。
部署合约到以太坊测试网
配置网络
打开hardhat.config.js,添加测试网配置(以Goerli测试网为例):
require("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.9",
networks: {
goerli: {
url: `https://eth-goerli.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`, // 替换为Alchemy或Infura的RPC URL
accounts: [process.env.PRIVATE_KEY], // 替换为你的钱包私钥
},
},
};
- 获取RPC URL:注册Alchemy(https://www.alchemy.com/)或Infura(https://infura.io/),创建Goerli项目,复制RPC URL。
- 环境变量:在项目根目录创建
.env文件,添加:ALCHEMY_KEY=你的Alchemy RPC URL PRIVATE_KEY=你的MetaMask钱包私钥(从MetaMask的“账户详情”中复制,以0x开头)
注意:
.env文件不要提交到代码仓库(在.gitignore中添加.env)。
编写部署脚本
在scripts目录创建deploy.js:
async function main() {
const MyNFT = await ethers.getContractFactory("MyNFT");
const myNFT = await MyNFT.deploy("My NFT", "MNFT"); // 部署时传入NFT名称和符号
await myNFT.deployed();
console.log("NFT合约部署成功,地址:", myNFT.address);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
执行部署
确保钱包已连接到Goerli测试网(在MetaMask中切换网络,添加Goerli的RPC URL),然后运行:
npx hardhat run scripts/deploy.js --network goerli
部署成功后,终端会输出合约地址(如0x123...abc),请务必记录这个地址!
验证合约与测试NFT功能
合约验证(可选)
为了让NFT市场(如OpenSea)识别你的合约,需要验证源代码。
- 方法:访问以太坊浏览器(如Etherscan,测试网为
goerli.et),找到你的合约地址,点击“Verify and Publish”,选择“Solidity (Single File)”,输入合约版本、源代码等,提交即可。herscan.io
测试NFT铸造
调用合约的safeMint函数,向指定地址(如自己的钱包地址)铸造NFT。
- 工具:使用Remix IDE(https://remix.ethereum.org/)或MetaMask的“交互式合约”功能(在Etherscan合约页面点击“Contract”→“Write to contract”)。
- 步骤:
- 在Etherscan合约页面,点击“Connect to Web3”连接MetaMask。
- 在“safeMint”函数中输入
to(钱包地址)和tokenId(唯一ID,如1)。 - 点击“Write”,支付gas费(测试网gas费