跳至主要內容

如何建立並部署 ERC-721(NFT)

更新於
2025年11月26日

閱讀時間 12 分鐘

概覽

自《Cryptokitties》推出以來,符合 ERC-721 標準的數位收藏品已廣受歡迎,並在近幾個月朝向大眾普及邁進。本指南將說明如何使用OpenZeppelin標準來建立並部署 NFT(ERC-721)。

想看影片教學嗎?跟著 Radek 一起學習,20 分鐘內掌握如何建立並部署 ERC-721(NFT)。
訂閱我們的 YouTube 頻道,觀看更多影片!

您將負責的工作內容


  • 了解非同質化代幣(NFT)及其應用場景
  • 為您即將建置的 ERC-721 代幣建立元資料
  • 將您的檔案上傳至去中心化儲存系統(IPFS)
  • 使用 Remix.IDE 建立並部署 ERC-721 代幣

您需要準備的物品


  • 一個 Quicknode 端點(您可在此免費建立一個)
  • 一個內含測試用 ETH 的 Web3 錢包(例如 MetaMask、Coinbase Wallet、Phantom 或相容於 WalletConnect 的錢包)(您可透過Multi-Chain Quicknode 水龍頭取得一些 ETH)
  • 已安裝IPFS CLI
  • 一款現代化的網頁瀏覽器(例如 Chrome)

什麼是不可替代代幣?

「可互換」意指相同或可相互替換。例如,以太坊代幣——即某特定代幣類別中的所有成員——都具有相同的價值。卡達諾代幣亦是如此。可互換代幣可按 1:1 的比例相互替換。

有鑑於此,NFT 具有獨特性;每個 NFT 都各不相同。每一個代幣都擁有獨特的特徵與價值。可以成為 NFT 的物品類型包括收藏卡、藝術品、機票等。它們彼此之間都能明確區分,且不可互換。不妨將非同質化代幣(NFT)視為稀有收藏品;每個 NFT 都有獨特的特徵、非凡的屬性,而且大多數情況下還附帶其元數據。

什麼是 ERC-721?

ERC 代表「以太坊意見徵求」(Ethereum Request for Comment),而 721 則是提案識別碼。ERC 是以太坊生態系統中的應用層標準,例如ERC-20 便是針對代幣的智慧合約標準;ERC 的提案者負責與以太坊社群建立共識,一旦提案經社群審查並獲批准,即成為正式標準。您可在此處追蹤最新的 ERC 提案。 ERC-721 的制定旨在提出在智慧合約內追蹤與轉移 NFT 的功能。

ERC-721是一項開放標準,用以規範如何在相容於 EVM(以太坊虛擬機)的區塊鏈上建立非同質化代幣(NFT);它是針對非同質化代幣的一套標準介面;其中包含一系列規則,使處理 NFT 變得更加簡便。NFT 不僅限於 ERC-721 類型,也可以是ERC-1155代幣。

以下是 ERC-721 標準中定義的一組函式與事件:

ERC-721 功能

balanceOf:此函式用於返回特定地址所擁有的 NFT(非同質化代幣)數量。

ownerOf:此函式會傳回特定代幣持有者的地址。每個 ERC721 代幣皆為唯一,並由一個 ID 代表。此函式可讓使用者或應用程式根據代幣的唯一 ID 來判定其持有者。

safeTransferFrom(不帶資料):此函式可將特定代幣的所有權安全地從一個地址轉移至另一個地址。此函式會檢查收件方是否為智慧合約。若是,則必須實作特定函式(onERC721Received)才能接受轉移。

transferFrom:此函式用於將代幣的所有權從一個地址轉移至另一個地址。通常在發送者已獲授權轉移該代幣時使用。

批准:此功能用於授權某個地址轉移特定代幣。這使得委託轉移成為可能,即持有者可允許另一方代表其轉移代幣。

getApproved:此函式用於取得特定代幣的已授權地址。若該代幣沒有已授權地址,此函式將傳回一個 null 地址。

setApprovalForAll:此功能允許擁有一個或多個代幣的所有者,授權或撤銷對某位操作員的管理所有代幣的授權。

isApprovedForAll:此函式用於檢查某位操作者是否已獲授權管理所有者的所有代幣。

safeTransferFrom(帶有資料):此函式與 safeTransferFrom(不帶資料)類似,但額外增加了一個資料參數。若收件方為智慧合約,可利用這項額外資料在轉帳過程中傳遞附加資訊。此函式還會檢查收件方是否為智慧合約,以及是否實作 onERC721Received 函式。

ERC-721 活動

轉移:當代幣的所有權從一個地址轉移至另一個地址時,會觸發此事件。該事件包含關於發送者(from)、接收者(to)以及被轉移的特定代幣(透過 ID 識別)的詳細資訊。此事件可讓外部監聽者(例如使用者介面或其他合約)對轉移操作做出反應。

授權:當某個地址獲准轉移特定代幣時,便會觸發此事件。該事件包含代幣的當前持有者(owner)、現已獲准轉移該代幣的地址(approved),以及已獲准轉移的特定代幣(透過 ID 識別)。此事件可讓應用程式追蹤代幣的授權狀況,並據此做出相應反應。

ApprovalForAll:當持有者批准或撤銷對操作者管理其所有代幣的授權時,會觸發此事件。該事件包含持有者的地址(owner)、操作者的地址(operator),以及一個表示操作者是否獲得授權的布林值(approved)。此事件可讓應用程式追蹤哪些地址已被授予管理特定持有者所有代幣的權限。

非同質化代幣(NFT)的應用案例

  • 數位藝術(或實體藝術):藝術品是 NFT 最受歡迎的應用場景。數位藝術拍賣是 NFT 的首個應用領域,且持續蓬勃發展。

  • 遊戲:提供遊戲內的購買項目及收藏品。

  • 房地產:將不動產代幣化,並透過智慧合約進行買賣。

  • 財務:包括貸款、期貨及其他相關責任等金融工具。

  • 軟體名稱:確保打擊盜版及保障隱私的軟體授權。

  • 演唱會門票/體育賽事門票:為確保售票過程不會發生詐欺行為,並讓粉絲能有一個集中平台查閱過往的觀賽體驗。

  • KYC 合規:為特定用戶的 KYC 建立一個代幣。

取得測試用 ETH

既然我們已經了解什麼是 ERC-721 代幣以及它們如何運作,接下來就來看看該如何建立並部署我們自己的代幣。

我們將在以太坊 Sepolia 測試網部署合約。開始之前,您需要安裝MetaMask瀏覽器擴充功能(或其他相容的 web3 錢包;例如 Phantom 或支援 WalletConnect 的錢包),並準備一些測試用 ETH——您可透過Quicknode 多鏈水龍頭取得。只需連接您的錢包或貼上地址,然後點擊「繼續」。 系統會提示您分享推文以獲得額外獎勵(我們建議您這麼做!);若不願分享,只需點擊「不用了,直接發送 0.05 ETH 給我」。請注意,在以太坊主網使用 EVM 水龍頭時,主網餘額需達到 0.001 ETH 才符合資格。

Quicknode 多水龍頭鏈

將檔案上傳至 IPFS

在編寫 NFT 合約之前,我們需要將用於 NFT 的藝術作品上傳至伺服器,並建立元資料檔案;為此,我們將使用IPFS——一個點對點的檔案儲存與共享分散式系統。 與 IPFS 協定互動的方法有多種。您可以選擇在自己的系統上架設並運作 IPFS,或是選用 Quicknode 作為更簡便的解決方案。Quicknode 透過管理底層基礎設施,簡化您存取 IPFS 的流程。這種做法讓您能專注於內容本身,無需承擔維護本地 IPFS 節點以進行資料釘選的責任。透過 Quicknode,技術上的複雜性將由其為您處理。

我們將介紹兩種將檔案上傳至 IPFS 的方法:使用標準的 IPFS 命令列介面(CLI),或是簡化的Quicknode IPFS 服務

標準方法:使用 IPFS 命令列介面 (CLI)

請依照IPFS 文件中的安裝指南,根據您的作業系統下載並安裝 IPFS CLI

以下是上傳圖片及元資料檔案的步驟。

步驟 1:建立 IPFS 儲存庫

請在終端機/命令提示字元視窗中輸入以下內容,以啟動 IPFS 儲存庫。

ipfs init

步驟 2:啟動 IPFS 守護程式

啟動 IPFS 守護程式,開啟另一個終端機/命令提示字元視窗,並輸入以下內容。

IPFS 守護程式

步驟 3:將圖片上傳至 IPFS

切換至第一個終端機視窗,並將該圖片上傳至 IPFS(此處為 art.png)。

ipfs add art.png

NFT 藝術品元資料

複製以Qm開頭的哈希值,並在前面加上「https://ipfs.io/ipfs/」前綴;其格式應類似如下:https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg

步驟 4:將 JSON 檔案上傳至 IPFS

建立一個名為nft.json 的 JSON 檔案,並將其儲存於與圖片相同的目錄中。

JSON 檔案格式:

{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC"
}

現在,請加入 JSON 檔案。

ipfs add nft.json

取以Qm開頭的雜湊值,並在其前加上「https://ipfs.io/ipfs/」作為前綴;其形式應類似於https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7

請儲存這個網址。我們之後會需要它來鑄造我們的 NFT。

Quicknode IPFS 解決方案:更簡便的替代方案

資訊

如欲進一步了解 Quicknode IPFS 的價格資訊,請點此查看我們的定價方案。

如果您正在尋找更簡便的方法,Quicknode 的 IPFS 服務能為您提供一個易於使用且高效的解決方案,用以上傳您的 NFT 資產。透過 Quicknode,您無需再為管理基礎設施的複雜性煩惱,從而能專注於您的內容,而非維護本地的 IPFS 節點。

若要開始使用 Quicknode 來運作 IPFS,請依照以下步驟操作:

步驟 1:登入 Quicknode

登入Quicknode,並從左側邊欄中選擇「IPFS」選項:

Quicknode 上的 IPFS 概覽

步驟 2:使用 Quicknode 將圖片上傳至 IPFS

您可以透過拖放或點擊選取 Finder/檔案總管視窗中的檔案,快速上傳您的圖片檔案。在本指南中,我們使用下方的圖片。

NFT 藝術品元資料

上傳完成後,請在「檔案」分頁中點擊檔案名稱,然後點擊「複製IPFS 網址」按鈕。操作方式如下圖所示。

https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg

Quicknode IPFS 儀表板上的圖片

步驟 3:使用 Quicknode 將 JSON 檔案上傳至 IPFS

建立一個名為 nft.json, 請將您的 IPFS URL 替換為 圖片 欄位,並儲存。儲存後,請將您的 JSON 檔案上傳至 IPFS,操作方式與前一步驟類似。

{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://qn-shared.quicknode-ipfs.com/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg"
}

上傳完成後,請在「檔案」分頁中點擊檔案名稱,並複製 IPFS 網址。該網址的外觀應類似以下範例。

https://qn-shared.quicknode-ipfs.com/ipfs/QmeVHZzKGEDbEbG5MVz4hUucNf4qZTRfW18AgdJNTrv22m

請儲存這個網址。我們之後會需要它來鑄造我們的 NFT。

創建我們自己的代幣

為了方便且確保安全性,我們將使用OpenZeppelinERC-721合約來建立我們的 NFT。透過 OpenZeppelin,我們無需自行編寫完整的 ERC-721 介面,而是可以導入該函式庫合約並使用其中的函式。

請前往Ethereum RemixIDE,並建立一個新的 Solidity 檔案,例如:MyToken.sol

請將以下程式碼貼到您的新 Solidity 腳本中:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts@5.0.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@5.0.0/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts@5.0.0/access/Ownable.sol";

contract MyToken is ERC721, ERC721URIStorage, ERC721Burnable, Ownable {
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable(initialOwner)
{}

function safeMint(address to, uint256 tokenId, string memory uri)
public
onlyOwner
{
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
}

// The following functions are overrides required by Solidity.

function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}

function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}

上述程式碼的說明:

第 1 行:將 SPDX 授權類型指定為 MIT。這表示該程式碼採用 MIT 授權,這是一種開放的開源授權,允許在極少限制的情況下使用、修改及散佈該程式碼。

第 2 行:宣告 Solidity 版本為 ^0.8.20。這表示該程式碼是使用 Solidity 0.8.20 版本或其相容版本所編寫的。

第 4 至 7 行:從 OpenZeppelin 函式庫導入必要的合約。

  • ERC721.sol:此合約是從 OpenZeppelin 函式庫導入的,代表 ERC721 標準的基本實作。ERC721 是非同質化代幣(NFT)的標準。

  • ERC721URIStorage.sol:此合約擴展了 ERC721 標準,並新增了用於儲存及管理與 NFT 相關的元資料 URI 的功能。元資料 URI 通常指向關於該 NFT 的額外資訊。

  • ERC721Burnable.sol:此合約同樣擴展了 ERC721 標準,並新增了銷毀(摧毀)NFT 的功能。它提供了一項功能,可將 NFT 永久移出流通領域,且僅有所有者才能呼叫此功能。

  • Ownable.sol:此合約用於存取控制。它允許您指定一位擁有合約內特殊權限的所有者。該所有者可執行其他使用者無法執行的特定動作。

第 9 行:啟動名為 MyToken 並提到它擴展了 ERC721、ERC721URIStorage 以及 Ownable 合約。這意味著該 MyToken 該合約繼承了這些合約中所定義的功能與屬性。

第 10 行:建構函式由此開始。在 Solidity 中,建構函式是一種特殊函式,僅在合約部署時執行一次。此建構函式接受一個參數, 初始擁有者,這是一個以太坊地址。

第 11 行:此行呼叫 ERC721 合約的建構函式,並傳入參數「MyToken」和「MTK」。它將 NFT 合約初始化為名稱「MyToken」、符號「MTK」。

第 12 行:此行呼叫 Ownable 合約的建構函式,將 MyToken 合約的初始擁有者設定為作為 initialOwner 提供的地址。

第 15 行:宣告函式 safeMint 該函式有三個參數:to(NFT 代幣接收者的地址)、tokenId(代幣的唯一識別碼)以及 uri(與該代幣相關聯的 JSON 檔案的 URI)。此函式僅能由合約擁有者(由 onlyOwner 修飾詞)。

第 19 行:透過呼叫 _safeMint 此函式繼承自 ERC721 合約。它會建立一個新的代幣,並將其分配給指定的接收者地址。

第 20 行:使用 _setTokenURI 從該函式繼承而來的 ERC721URIStorage 合約。URI 是根據所提供的 tokenId 和 uri 來設定的。

第 25 至 32 行:實作 Solidity 所要求的覆寫,以因應 ERC721 以及 ERC721URIStorage 合約。 tokenURI 這是一個用於擷取與指定 tokenId 相關聯的元資料 URI 的函式。它被標記為 public 和 view,表示這是一個唯讀函式,且任何人都可以呼叫它。

第 34 至 41 行:實作 `supportsInterface` 函式,此函式是 ERC721 以及 ERC721URIStorage 合約。此函式會檢查合約是否支援給定的 interfaceId,並據此傳回一個布林值。

透過結合這些功能與合約,程式碼建立了一個名為 MyToken. 此合約允許合約擁有者安全地鑄造新代幣、為其關聯元數據 URI,並支援 ERC721 標準所定義的必要介面。

現在,如果您願意,請花一分鐘時間根據您的實際情況自訂這個智慧合約。您可以透過修改以下這行代碼來更新代幣名稱和代幣符號—— ERC721(「MyToken」,「MTK」).

完成後,請編譯智慧合約,並使用 注入式提供者 (在編譯合約前,請務必在 Metamask 上選取 Sepolia 測試網)。接著,將您的錢包地址貼上至緊鄰 部署 按鈕以設定 初始擁有者 建構函式中的參數。最後,點擊 部署 在 Remix.IDE 上。

Remix.IDE 的「部署」分頁

若在部署前收到錯誤訊息——「此合約可能是抽象的」,請務必在「合約」分頁下選取適當的合約。

在 Metamask 中確認交易:

顯示交易詳細資訊的 MetaMask 視窗

現在請前往 Remix 中的「已部署合約」區段,並展開該已部署合約。您會看到一堆函式/方法。展開該 safeMint 功能,並新增以下詳細資訊:


  1. 請在_to欄位中輸入您的錢包地址。
  2. 請在_tokenId欄位中輸入任何「大數」值。我們建議使用「1」,因為它代表正在鑄造的第一個代幣。
  3. 關於 _uri 在該欄位中,輸入與您在前幾個步驟中所使用的方法相對應的 JSON 檔案 URI:

safeMint 功能的螢幕截圖

點擊「交易」,並透過 MetaMask 確認交易。此過程可能需要幾分鐘,但您可以隨時透過Etherscan 等區塊鏈瀏覽器確認交易是否已執行。現在,您已在 Sepolia 鏈上擁有這枚 NFT。

您可以查看其他詳細資訊,例如 名稱, 符號, ownerOf,或 tokenURI 輸入我們稍早提到的代幣 ID。

在 Remix.IDE 上與 MyToken 合約進行互動

結論

恭喜您成功創建了專屬的 NFT!協助您的藝術家朋友將他們的藝術作品上傳至以太坊區塊鏈,或者親自成為一名藝術家。請參閱OpenZeppelin 的向導,查看更多範例。

訂閱我們的電子報,獲取更多關於以太坊的文章與指南。如有任何意見回饋,歡迎透過Twitter 聯絡我們。您隨時都可以在我們的Discord社群伺服器上與我們聊天,那裡聚集了您這輩子見過最酷的開發者們 :)

我們 ❤️ 您的回饋!

如果您有任何意見回饋或對新主題的建議,請告訴我們。我們非常樂意聽取您的意見。

分享這份指南