在区块链的世界里,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.etherscan.io),找到你的合约地址,点击“Verify and Publish”,选择“Solidity (Single File)”,输入合约版本、源代码等,提交即可。

测试NFT铸造

调用合约的safeMint函数,向指定地址(如自己的钱包地址)铸造NFT。

  • 工具:使用Remix IDE(https://remix.ethereum.org/)或MetaMask的“交互式合约”功能(在Etherscan合约页面点击“Contract”→“Write to contract”)。
  • 步骤
    1. 在Etherscan合约页面,点击“Connect to Web3”连接MetaMask。
    2. 在“safeMint”函数中输入to(钱包地址)和tokenId(唯一ID,如1)。
    3. 点击“Write”,支付gas费(测试网gas费