原文作者:PaperMoon团队
非同质化代币(Non-Fungible Token,简称 NFT)是一种具有唯一性的数字资产形式,广泛应用于数字艺术、数字收藏品、链游资产以及去中心化身份认证等场景。
ERC-721 是以太坊生态中最主流的 NFT 标准协议之一,定义了非同质化代币的发行、转移与查询接口规范。
本文将详细介绍如何使用 Hardhat 开发框架 与 OpenZeppelin 官方合约库,在 Polkadot Hub 测试网络(TestNet) 上完成 ERC-721 NFT 合约的开发、编译与部署。
Hardhat 是一套功能完善的以太坊开发工具链,集成了编译、测试、调试和部署能力,并且生成标准 EVM 字节码,可与 Polkadot Hub 的 EVM 环境完全兼容。
环境准备(Prerequisites)
在开始实践之前,请确保已完成以下准备工作:
1. 具备 Solidity 基础编程能力
2. 了解 ERC-721 NFT 标准基本机制
3. 已安装 Node.js 22.13.1 或更高版本
4. 已获取 Polkadot 测试网 Gas 代币
5. 拥有一个包含私钥的钱包,用于签署交易
说明:测试代币仅用于开发测试环境,不具备实际经济价值。
初始化 Hardhat 项目(Set Up Your Project)
1. 创建项目目录
打开终端,执行以下命令:
mkdir hardhat-nft-deployment
cd hardhat-nft-deployment
npx hardhat@^2.27.0 init
上述命令将创建项目目录,并初始化一个标准 Hardhat 工程结构。
2. 安装 OpenZeppelin 合约库
执行以下命令安装依赖:
npm install @openzeppelin/contracts
该库包含经过安全审计的标准智能合约实现,是目前最主流的 Solidity 合约基础库。
配置 Hardhat 网络(Configure Hardhat)
1. 修改配置文件
打开项目根目录下的:
hardhat.config.ts
将其修改为如下内容:
import type { HardhatUserConfig } from 'hardhat/config';
import hardhatToolboxViemPlugin from '@nomicfoundation/hardhat-toolbox-viem';
import { vars } from 'hardhat/config';
const config: HardhatUserConfig = {
plugins: [hardhatToolboxViemPlugin],
solidity: {
version: '0.8.28',
settings: {
optimizer: {
enabled: true,
runs: 200,
},
},
},
networks: {
polkadotTestnet: {
url: 'https://services.polkadothub-rpc.com/testnet',
chainId: 420420417,
accounts: [vars.get('PRIVATE_KEY')],
},
},
};
export default config;
2. 配置说明
该配置主要包含以下信息:
(1)Solidity 编译器
version: '0.8.28'
指定编译器版本,确保与合约兼容。
(2)Gas 优化器
optimizer: {
enabled: true,
runs: 200,
}
用于减少部署与执行成本。
(3)网络配置
polkadotTestnet
用于指定 Polkadot Hub 测试网 RPC 节点和链 ID。
(4)私钥管理
accounts: [vars.get('PRIVATE_KEY')]
通过环境变量方式管理私钥,避免明文泄露。
3. 安全提示
建议参考 Hardhat 官方文档,使用 .env 或系统环境变量安全存储私钥,避免直接写入代码仓库。
创建 NFT 智能合约(Create the Contract)
1. 清理默认合约文件
进入:
contracts/
目录,删除 Hardhat 自动生成的示例合约文件。
2. 创建新合约文件
新建文件:
contracts/MyNFT.sol
3. 编写 ERC-721 合约代码
在 MyNFT.sol 中写入以下内容:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MyNFT is ERC721, Ownable {
uint256 private _nextTokenId;
constructor(
address initialOwner
) ERC721("MyToken", "MTK") Ownable(initialOwner) {}
function safeMint(address to) public onlyOwner {
uint256 tokenId = _nextTokenId++;
_safeMint(to, tokenId);
}
}
4. 合约功能解析
该 NFT 合约主要实现了以下功能:
(1)继承标准模块
• ERC721:NFT 核心功能
• Ownable:权限控制机制
(2)Token ID 自动管理
uint256 private _nextTokenId;
自动递增分配 NFT 编号。
(3)构造函数初始化
设置:
• NFT 名称:MyToken
• NFT 简称:MTK
• 初始管理员地址
(4)安全铸造函数
safeMint
仅管理员可调用,确保资产安全。
编译智能合约(Compile the Contract)
在项目根目录执行:
npx hardhat compile
编译成功示例输出
Downloading solc 0.8.28
Compiled 1 Solidity file with solc 0.8.28
表示合约已成功编译为 EVM 字节码。
使用 Ignition 部署合约(Deploy the Contract)
Hardhat Ignition 是官方提供的模块化部署工具,可管理复杂部署流程。
1. 清理默认模块
进入:
ignition/modules/
删除默认示例文件。
2. 创建部署模块
新建文件:
ignition/modules/MyNFT.ts
3. 编写部署脚本
写入以下内容:
import { buildModule } from '@nomicfoundation/hardhat-ignition/modules';
export default buildModule('MyNFTModule', (m) => {
const initialOwner = m.getParameter('initialOwner', 'INSERT_OWNER_ADDRESS');
const myNFT = m.contract('MyNFT', [initialOwner]);
return { myNFT };
});
将:
INSERT_OWNER_ADDRESS
替换为你自己的钱包地址。
4. 执行部署命令
运行:
npx hardhat ignition deploy ignition/modules/MyNFT.ts --network polkadotTestnet
5. 确认网络信息
终端会提示:
Confirm deploy to network polkadotTestnet (420420417)? … yes
输入 yes 确认。
6. 部署成功示例输出
Hardhat Ignition 🚀
Deploying [ MyNFTModule ]
Batch #1
Executed MyNFTModule#MyNFT
Batch #2
Executed MyNFTModule#MyNFT.safeMint
Deployed Addresses
MyNFTModule#MyNFT - 0x1234...
说明合约已成功部署到测试网。
部署后的交互与验证
部署完成后,你可以通过以下方式进行验证:
1. 查看合约地址
复制终端输出的合约地址,在区块浏览器中查询。
2. 铸造 NFT
通过:
• Hardhat 脚本
• Remix
• 前端页面
调用 safeMint 即可生成 NFT。
3. 查询资产信息
可调用标准 ERC-721 接口:
• ownerOf
• balanceOf
• tokenURI
总结(Conclusion)
通过本教程,你已经完整掌握了:
✅ Hardhat 项目初始化流程
✅ Polkadot Hub 网络配置方法
✅ OpenZeppelin NFT 合约开发
✅ Hardhat 编译与优化设置
✅ Ignition 模块化部署方式
✅ 测试网验证流程
该流程适用于从学习到实战的完整 NFT 开发路径。

1766

被折叠的 条评论
为什么被折叠?



