---
title: "如何使用 ethers.js 铸造 NFT"
description: "了解使用 Ethers.js 铸造 NFT 的分步指南。轻松创建独特的数字资产，加入区块链革命！"
---

# 如何使用 ethers.js 铸造 NFT

本教程介绍如何使用 Ethers 通过 [ethers.js](https://www.alchemy.com/dapps/ethers-js) 库，以及我们在第一部分《如何创建 NFT》中的智能合约，在 Ethereum 区块链上铸造一个 NFT。我们还将探讨基本的测试

_预计完成本指南所需时间：约 10 分钟_

此外，别忘了查看我们 NFT 教程系列的其余部分：

- 🌟  [如何使用 Web3.js 铸造 NFT](https://www.alchemy.com/blog/how-to-mint-an-nft-using-web3-js)
- 👛  [如何在移动钱包中查看你的 NFT](https://www.alchemy.com/blog/how-to-view-your-nft-in-your-mobile-wallet)
- 💸  [如何为 NFT 设定价格](https://www.alchemy.com/blog/how-to-set-a-price-on-an-nft)
- 💻  [NFT minter 教程：如何创建全栈 DApp](https://www.alchemy.com/blog/nft-minter-tutorial-how-to-create-a-full-stack-dapp)

在[另一篇教程](https://www.alchemy.com/docs/reference/nft-api-overview)中，我们学习了如何使用 Web3 和 [OpenZeppelin 合约库](https://docs.openzeppelin.com/contracts/erc721)铸造 NFT。在本练习中，我们将带你了解一种替代实现方式，使用第 4 版 [OpenZeppelin 库](https://docs.openzeppelin.com/contracts/4.x/erc721)，以及 [Ethers.js](https://docs.ethers.io/) 这个 Ethereum 库，而不是 Web3。

我们还将介绍使用 [Hardhat](https://www.alchemy.com/dapps/hardhat) 和 [Waffle](https://www.alchemy.com/dapps/waffle) 对合约进行测试的基础知识。本教程中我使用的是 Yarn，但如果你愿意，也可以使用 npm/npx。

最后，我们会用到 TypeScript。这部分内容已有相当完善的文档，所以这里不再赘述。

在其他方面，本教程与 Web3 版本的工作方式相同，包括 Pinata 和 IPFS 等工具的使用。

## 简单回顾

提醒一下，"铸造 NFT" 是指在区块链上发布你的 ERC721 代币的一个唯一实例这一行为。本教程假设你已经在 NFT 教程系列的[第一部分](https://www.alchemy.com//blog/how-to-create-an-nft)中成功将智能合约部署到了 Ropsten 网络，其中包括安装 Ethers。

## 第 1 步：创建你的 Solidity 合约

[OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin) 是一个用于安全智能合约开发的库。你只需继承他们对 [ERC20](https://www.alchemy.com/overviews/erc20-solidity) 或 ERC721 等常用标准的实现，再根据需要扩展其行为即可。我们将把这个文件放在 contracts/MyNFT.sol 中。

## 第 2 步：创建 Hardhat 任务，用于部署合约和铸造 NFT

创建文件 tasks/nft.ts，内容如下：

## 第 3 步：创建辅助函数

你会注意到我们的任务导入了几个辅助函数。它们如下所示。

`contract.ts`

`env.ts`

`provider.ts`

注意，最后的 getProvider\(\) 函数使用的是 ropsten 网络。这个参数是可选的，如果省略则默认为 "homestead"。我们当然使用的是 Alchemy，但也有一些[受支持的替代方案](https://docs.ethers.io/v5/api/providers/#providers-getDefaultProvider)。

`wallet.ts`

## 第 4 步：创建测试

在你的 test 目录下，创建以下文件。请注意，这些测试并不全面。它们只测试了 OpenZeppelin 库提供的 ERC721 功能中的一小部分，目的是为你提供基础构件，以便你创建更完善的测试。

`test/MyNFT.spec.ts (unit tests)`

`tasks.spec.ts (integration specs)`

`test-helpers.ts` 请注意，这需要用到所导入的 NPM 库，包括 sinon、chai 和 sinon-chai。由于使用了 stubbing（桩替换），因此需要调用 `sinon.restore()`。

## 第 5 步：配置

这是我们相当简洁的 `hardhat.config.ts`。

注意这个条件判断，只有在不运行测试时才调用 dotenv。你可能不希望在生产环境中这样做，但请放心，如果 .env 文件不存在，dotenv 会静默忽略它。

## 运行我们的任务

现在这些文件都已就绪，我们可以运行 hardhat 来查看我们的任务（为简洁起见，不包括内置任务）。

忘记任务需要哪些参数了？没问题。

## 运行我们的测试

要运行测试，我们执行 `hardhat test`。

## 总结

在本教程中，我们基于 [Solidity](https://www.alchemy.com/overviews/solidity) 为一个经过充分测试的 NFT 基础设施打下了坚实的基础。**waffle.provider.getWallets\(\)** 提供的钱包链接到一个本地的模拟 [Hardhat Network](https://hardhat.org/hardhat-network/) 账户，该账户[方便地预先加载了](https://hardhat.org/hardhat-network/reference/#initial-state) eth 余额，我们可以用它来为测试交易提供资金。
