閱讀時間 8 分鐘
引言
自《Cryptokitties》推出以來,相容於 ERC-721 的數位收藏品便廣受歡迎,並在過去幾個月內獲得了廣泛採用。本指南將介紹如何使用0xcert/ethereum-erc721智慧合約函式庫,來建立並發行我們自己的 ERC-721(NFT)。
什麼是非同質化代幣(NFT)?
「可替代性」意指事物具有同等性質或可相互替換。例如,以太坊的代幣中,同一類別的所有代幣都具有相同的價值。卡達諾的代幣亦是如此。可替代性代幣可按 1:1 的比例相互替換。
有鑑於此,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 定義了若干符合 ERC-20 標準的功能。這使得在某些現有的錢包中顯示代幣資訊變得更加容易。
ERC-20 功能
- 名稱:用於確定其他合約或應用程式可藉此識別您的名稱。
- 符號:用於指定符號或簡稱。
- totalSupply:此函式用於定義區塊鏈上現有的代幣總量,其數值不一定要保持恆定。
- balanceOf:返回某個地址持有的 NFT 數量。
與代幣所有權相關的功能
- ownerOf:此函式會傳回代幣持有者的地址。由於每個 ERC-721 代幣都是獨一無二且不可互換的,因此在區塊鏈上會以一個 ID 來代表。其他使用者、合約或應用程式可利用此 ID 來確定代幣的持有者。
- 批准:此功能用於批准代幣轉帳。
- takeOwnership:這是一項可選功能,用於從使用者處提取代幣,前提是該使用者已事先授權此地址提取代幣。
- 轉帳:一項功能,讓代幣持有者能夠將其代幣轉移至其他地址,就像轉移任何其他代幣或貨幣一樣。
- tokenOfOwnerByIndex:這是一項可選功能,但非常建議實作。每位代幣持有者可同時擁有多個相同的 NFT。每個 NFT 的唯一 ID 有助於識別它們,但隨著數量增加,追蹤這些 ID 終將變得非常困難。因此,合約會記錄與持有者相關的 ID,而此功能則能讓我們取得進行追蹤所需的相關資訊。
元資料功能
- tokenMetadata:此為一項可選功能,它是一個介面,可讓我們查閱代幣的相關資訊。
活動
- 轉移:當代幣的所有者變更時,會觸發此事件。該事件會發送相關資訊,包括轉出代幣的地址、接收代幣的地址,以及被轉移的代幣 ID。
- 批准:當一位使用者批准另一位使用者可支配該代幣時,會觸發此事件,例如當執行 approve 函式時。此事件會發送相關資訊,說明目前由哪個地址持有該代幣、哪個地址已被批准未來可支配該代幣,以及哪個代幣 ID 已被批准取得其所有權。
非同質化代幣(NFT)的應用案例:
- 數位藝術(或實體藝術):這是 NFT 最常見的應用場景。數位藝術拍賣是 NFT 的早期應用之一,且至今仍持續成長
- 遊戲:提供遊戲內購及收藏品。
- 房地產:能夠將房產代幣化,並建立智慧合約以進行買賣。
- 財務:金融工具,例如貸款、期貨及其他負債。
- 軟體:軟體授權,以確保打擊盜版及保障隱私。
- 音樂會或體育賽事門票:為防止票務銷售中的詐欺行為,並讓粉絲們有一個專屬平台來回顧過往的體驗。
取得 ETH 測試幣
既然我們已經了解什麼是 ERC-721 代幣以及它是如何運作的,接下來就來看看該如何建立並發行我們自己的代幣。
我們即將在 Ropsten 測試區塊鏈上發布我們的合約。首先,你需要安裝Metamask瀏覽器擴充功能,才能建立一個 ETH 錢包,並從Ropsten 水龍頭領取一些測試用 ETH。在你的 Metamask 錢包中選擇「Ropsten 測試網路」,將錢包地址複製到水龍頭的文字欄位中,然後點擊「Send me test Ether」。

將檔案上傳至 IPFS
在撰寫 NFT 合約之前,我們需要儲存與該 NFT 相關的藝術作品,並建立一個元資料檔案;為此,我們將使用IPFS——一個分散式檔案共享系統。請依照以下IPFS 安裝指南,為您的作業系統下載並安裝 IPFS CLI。
以下是儲存圖片及元資料檔案的步驟
步驟 1:建立 IPFS 儲存庫 在終端機中輸入以下指令以建立 IPFS 儲存庫
ipfs init
步驟 2:啟動 IPFS 監控程式
開啟一個新的終端機,並輸入以下指令
IPFS 守護程式
步驟 3:將圖片上傳至 IPFS
在第一個終端機中加入圖片(此處為 art.png)
ipfs 新增 art.png

請複製以 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
ipfs 新增 nft.json
請複製以 Qm 開頭的哈希值,並在開頭加上https://ipfs.io/ipfs/,結果應類似如下:https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7
請查看這個網址,我們之後會需要它來發行我們的 NFT。
建立我們的代幣
為了方便與安全性著想,我們將使用0xcert/ethereum-erc721來建立我們的 NFT 合約。透過 0xcert/ethereum-erc721,我們無需從頭編寫整個 ERC-721 介面,而是可以直接導入並使用其中的函式。
請前往Ethereum RemixIDE,並建立一個新的 Solidity 檔案,例如:nft.sol
將以下程式碼貼到你的新 Solidity 檔案中:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;
import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol";
contract newNFT is NFTokenMetadata, Ownable {
constructor() {
nftName = "Synth NFT";
nftSymbol = "SYN";
}
function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
super._mint(_to, _tokenId);
super._setTokenUri(_tokenId, _uri);
}
}
上述程式碼說明:
第 1 行:SPDX 授權類型規格,這是 Solidity ^0.6.8 之後的必要補充。 每當智慧合約的程式碼對外公開時,這些授權條款有助於解決並避免版權相關的糾紛。若您不希望指定任何授權類型,可使用「Unlicensed」值,或直接省略該註解(此舉不會導致錯誤,僅會顯示警告訊息)
第 2 行:宣告智慧合約的 Solidity 版本。
第 4-5 行:匯入 0xcert/ethereum-erc721 合約
第 7 行:合約以「newNFT」為名稱開始,此合約繼承自其他名為「NFTokenMetadata」和「Ownable」的合約。
第 9-12 行:初始化建構函式,並設定代幣的名稱與符號。
第 14 行:我們宣告了一個具有三個參數的 mint 函式,其中 _to 變數為 address 類型,用於儲存將接收 NFT 代幣的地址;_tokenId 變數為 uint256 類型,用於儲存代幣的 ID;_uri 變數則用於儲存 JSON 檔案的 URI。 將此 mint 函式宣告為 external,表示它可從其他智慧合約以及該合約自身作用域之外進行存取。
第 15 行:使用將接收該代幣的地址和代幣 ID 來發送代幣。
第 16 行:使用 token id 和 JSON 檔案的 URI 來設定 URI。
編譯智慧合約,並使用注入的 Web3 進行部署(在編譯合約前,請確保已在 Metamask 中選取 Ropsten 測試網)。
在 Metamask 中確認這筆交易。

若在部署前收到錯誤訊息「此合約可能是抽象的」,請確認您在「合約」選項中選取的是正確的合約

現在請前往 Remix 中的「已部署合約」區段,並展開剛部署的合約。你會看到許多函式/方法。展開 mint 函式,並新增以下詳細資訊:
- 請將您的 Ropsten 地址填入 _to 欄位中
- 在 _tokenid 欄位中輸入一個數字(建議輸入 1,因為這是第一個)
- 將 JSON 檔案的 URI 加入 _uri 欄位中,該 URI 我們已在上一節中取得。
點擊「Transact」,並在 Metamask 中確認交易。現在,您已在 Ropsten 網路上持有該代幣。
您可以透過輸入前述的 tokenid,來查核其他詳細資訊,例如名稱、符號、擁有者及 tokenuri。

結論
恭喜你成功創建了自己的 NFT!你可以協助一位藝術家朋友,將他們的藝術作品上傳至以太坊網路,或者自己也成為一名藝術家。你可以瀏覽0xcert/ethereum-erc721 的 GitHub頁面,查看更多範例。
訂閱我們的電子報,獲取更多關於以太坊的文章和指南。如果您有任何意見,歡迎在我們的Twitter 上留言。您隨時都可以在我們的Discord 伺服器上與我們交流,那裡有許多頂尖的開發者 :)