閱讀時間 6 分鐘
本指南中提及的 Ropsten 測試網,目前已不再積極維護。雖然與該鏈相關的具體步驟可能不再適用,但整體流程對於其他鏈而言仍可能有效。我們建議您在實作時探索當前的替代方案。如果您希望查看本指南的更新版本,請告訴我們!
概覽
ERC1155 已成為創建 NFT 的黃金標準;各大交易平台均會將新發行的代幣列為 ERC1155 標準。在本指南中,我們將了解 ERC1155 代幣標準,以及如何創建 ERC1155 代幣。
我們將採取的行動:
- 建立 3 個 NFT 系列
- 建立並部署 ERC-1155 合約
- 更新合約,使其與 OpenSea 相容
- 發佈我們的 NFT 系列
您需要準備的物品:
- 用於製作 NFT 的圖像素材
- MetaMask以及部分 Ropsten 測試網上的以太幣。
- 熟悉ERC20及ERC721(NFT)代幣標準。
什麼是 ERC1155?
ERC1155是一項多代幣標準,允許在單一合約中同時創建可互換、不可互換及半可互換代幣。在 ERC1155 問世之前,若某個應用場景同時需要 ERC20(可互換)和 ERC721(不可互換)代幣,則必須透過獨立的合約來實現。 ERC1155 還允許僅透過單一智慧合約即可發行多個 NFT 系列,無需為每個系列分別建立獨立合約;此舉不僅提升了智慧合約建構的效率,更將交易次數降至最低,這點至關重要,因為它能減少區塊鏈空間的佔用。透過 ERC1155,還可進行代幣批次轉移,而非像先前標準那樣僅能將代幣轉移至單一地址。
ERC1155 應用的常見範例是基於區塊鏈的去中心化遊戲,由於遊戲需要代幣和收藏品,因此 ERC1155 已成為該領域的標準。ERC1155 亦已成為 NFT 領域的標準。
先前的 ERC721 標準採用的是代幣 ID 與地址的一對一對應關係。ERC1155 的對應機制則較為複雜,其中由代幣 ID 與地址組合而成的識別碼,會對應至該代幣的餘額。
建立元資料 URI
我們將建立 3 個 NFT 系列(石頭、布、剪刀),每個系列各包含 1 個 NFT。要將檔案上傳至去中心化儲存系統 IPFS,我們可以透過命令列介面(CLI)上傳,或是使用這款非常易於操作的工具「NFT Storage」。
我們將使用第二個選項「NFT Storage」。請登入 NFT Storage,並上傳「石頭、剪刀、布」的圖片檔案。上傳成功後,您應該會看到類似以下畫面:

點擊「動作」,並複製每張圖片的 IPFS 網址;我們需要這些網址來填寫各收藏集的元資料。

我們將建立三個 JSON 元資料檔案,用來儲存關於我們 NFT 系列的信息。
- 1.json:岩石收藏
- 2.json:論文集
- 3.json:剪刀系列
我們的 1.json 檔案內容將類似如下:
{ //1.
"name": "Rocks",
"description": "This is a collection of Rock NFTs.",
"image": "https://ipfs.io/ipfs/bafkreifvhjdf6ve4jfv6qytqtux5nd4nwnelioeiqx5x2ez5yrgrzk7ypi",
}
- name:包含該 NFT 的名稱。
- 描述:包含該 NFT 的描述。
- 圖片:包含我們先前取得的圖片連結(IPFS 網址)。
- 如果一個集合包含多張圖片(這通常是常見的情況),則會新增一個額外的參數「id」,用以區分該集合中的各個標記。
建立其餘的 JSON 檔案 2.json 和 3.json,分別對應於「紙」和「剪刀」的集合。
為了將所有 JSON 檔案高效上傳至 IPFS,我們將以內容導向格式對其進行歸檔。https://car.ipfs.io/可協助將檔案歸檔為與 IPFS 相容的內容導向歸檔 (.car) 格式。
請前往IPFS CAR並上傳這三個 JSON 檔案。上傳完成後,下載該 .car 檔案並將其上傳至NFT Storage。現在,我們所有的 JSON 檔案都已以歸檔形式儲存於 IPFS 上。複製已上傳 .car 檔案的 IPFS 網址,您只需在網址末尾輸入檔案名稱,即可存取這些 JSON 檔案,例如:
https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/1.json

建立與部署 ERC1155 合約
我們將使用OpenZeppelin合約函式庫來建立 ERC1155 合約,並透過Ethereum REMIX IDE將其部署至 Ropsten 測試網。請確保您擁有一些 Ropsten 測試用 ETH,您也可以從Ropsten Faucet 取得。
在 REMIX 中建立一個名為 token.sol 的新檔案,並將以下程式碼貼入其中。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract rockPaperScissors is ERC1155 {
uint256 public constant Rock = 1;
uint256 public constant Paper = 2;
uint256 public constant Scissors = 3;
constructor() ERC1155("https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/{id}.json") {
_mint(msg.sender, Rock, 1, "");
_mint(msg.sender, Paper, 1, "");
_mint(msg.sender, Scissors, 1, "");
}
}
上述程式碼的說明:
第 1 行:指定SPDX 授權類型,此功能自 Solidity ^0.6.8 起新增。每當智慧合約的原始碼對外公開時,這些授權皆有助於解決或避免著作權問題。若您不希望指定任何授權類型,可以使用特殊值 UNLICENSED,或直接省略整段註解(這不會導致錯誤,僅會顯示警告)。
第 2 行:宣告 Solidity 版本。
第 4 行:匯入 OpenZeppelin 的 ERC1155 合約。
第 6 至 9 行:建立名為rockPaperScissors的合約,並建立三個變數Rock、Paper 和Scissors;接著為每個變數賦予適當的 id。
第 11 至 15 行:使用我們汽車檔案的連結作為參數來初始化建構函式,並透過參數鑄造不同的 NFT 系列:
- 將用於鑄造代幣的地址;此處的msg.sender指的是合約的部署者。
- 代幣 ID,我們已經為代幣 ID 賦予了名稱,因此此處使用這些名稱。
- 每種代幣的數量。
- 最後一個是資料欄位,此處留空。
編譯合約,前往左側選單的第三個分頁,選擇「Injected Web3」作為環境,並透過選擇正確的合約名稱來部署它:

請透過 MetaMask 批准這筆交易。交易完成後,您的合約即會部署完成。
現在,您可以透過輸入地址和代幣 ID 來執行諸如查詢代幣餘額等功能。我們也可以透過輸入代幣 ID 來取得該代幣的 URI。

OpenSea 不支援所回傳的 URI 格式。因此,我們需要覆寫 URI 函式,將檔案名稱以字串形式回傳:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
contract rockPaperScissors is ERC1155 {
uint256 public constant Rock = 1;
uint256 public constant Paper = 2;
uint256 public constant Scissors = 3;
constructor() ERC1155("https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/{id}.json") {
_mint(msg.sender, Rock, 1, "");
_mint(msg.sender, Paper, 1, "");
_mint(msg.sender, Scissors, 1, "");
}
function uri(uint256 _tokenid) override public pure returns (string memory) {
return string(
abi.encodePacked(
"https://ipfs.io/ipfs/bafybeihjjkwdrxxjnuwevlqtqmh3iegcadc32sio4wmo7bv2gbf34qs34a/",
Strings.toString(_tokenid),".json"
)
);
}
}
新增內容:
第 5 行:匯入 OpenZeppelin 合約,用以將 Integer 轉換為 String。
第 18 至 25 行:透過建立自訂的 URI 函式來覆寫 URI 函式,將整數型態的 token 轉換為字串,然後回傳完整的 URI。
重新編譯合約並部署它。現在當您向合約查詢 URI 時,它將回傳 OpenSea 所支援的格式。

結論
恭喜您成功部署 ERC1155 代幣。既然您已閱讀至此,現在您應該已經了解 ERC1155 多代幣標準,以及如何建立和部署 ERC1155 NFT。
訂閱我們的電子報,獲取更多關於以太坊的文章與指南。如有任何意見回饋,歡迎透過Twitter 聯絡我們。您隨時都可以在我們的Discord社群伺服器上與我們聊天,那裡聚集了您這輩子見過最酷的開發者們 :)
