---
title: "如何使用 ethers.js 鑄造 NFT"
description: "了解如何使用 Ethers.js 鑄造 NFT 的逐步指南，輕鬆建立你獨一無二的數位資產，加入區塊鏈革命！"
---

# 如何使用 ethers.js 鑄造 NFT

本教學說明如何使用 Ethers（透過 [ethers.js](https://www.alchemy.com/dapps/ethers-js) 函式庫）以及我們在第一篇《How to Create an NFT》中撰寫的智慧合約，在 Ethereum 區塊鏈上鑄造 NFT。我們也會探討基本的測試設定

_預估完成本指南所需時間：約 10 分鐘_

此外，別忘了看看我們 NFT 教學系列的其他文章：

- 🌟  [How to mint an NFT using Web3.js](https://www.alchemy.com/blog/how-to-mint-an-nft-using-web3-js)
- 👛  [How to view your NFT in your mobile wallet](https://www.alchemy.com/blog/how-to-view-your-nft-in-your-mobile-wallet)
- 💸  [How to set a price on an NFT](https://www.alchemy.com/blog/how-to-set-a-price-on-an-nft)
- 💻  [NFT minter tutorial: How to create a full stack 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 contracts library](https://docs.openzeppelin.com/contracts/erc721) 來鑄造 NFT。在這個練習中，我們將帶你了解另一種實作方式，使用第 4 版的 [OpenZeppelin library](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 library 所提供 ERC721 功能中的一小部分，目的是提供你建立更完整測試所需的基礎元件。

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

`tasks.spec.ts (integration specs)`

`test-helpers.ts` 請注意，這需要匯入相關的 NPM 函式庫，包括 sinon、chai 及 sinon-chai。由於使用了 stub，因此必須呼叫 `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 餘額，可供我們的測試交易使用。
