區塊鏈

[教學] 打造你的 NFT 智能合約 – ERC721A

打造你的NFT 智能(慧)合約 - ERC721A

GM!前些日子在幣圈亂玩,一路從幣玩到了NFT再玩到自己動手寫合約…所以,我們就久違的來一篇關於智能(慧)合約(Smart Contract)的教學吧!

智能合約是什麼?

智能合約(私心比較喜歡稱作智慧合約),Smart Contract,是一種在區塊鏈所使用的合約,通常運作在有圖靈設計的區塊鏈中,其中最著名的就是以太鏈(Ethereum)的EVM。智能合約的存在,提供區塊鏈更多可以延伸的應用方式,例如最近比較常被聽到的 NFT 即是智能合約的應用之一。

而根據不同的區塊鏈以及 VM 設計,語法也會有所不同。其中常被使用的以太鏈較被廣泛使用的是 Solidity。

ERC721

ERC-721 是一種合約協議的代號,他是目前 NFT 的基礎協議,用作發行擁有不同代號的有限量無限量代幣(Token)。而因為他的唯一編碼方式以及使用 Metadata 來提供更多資訊的特色,因此被廣泛應用在各領域。

ERC721A

ERC-721A 是由 ERC-721 的改良,因原本使用的 ERC-721 其語法的因素,導致在鑄造(Mint)多個 NFT 時會產生大量的手續費(Gas Fee),而 ERC-721A 大幅度地減少了手續費的消耗,因此在目前的 NFT 世界被廣泛使用。

ERC-721A 的 A 是一個知名專案 Azuki (紅豆)的開頭。

Github: chiru-labs/ERC721A: https://ERC721A.org (github.com)

開始之前

你會需要一個 Node.js 的開發環境,你可以透過 NVM 安裝,或者到官方網站下載符合你作業系統的版本進行安裝。

NVM

這是一個方便用於管理Node.js版本的工具,通常用於有多版本需求或者是懶人安裝用。

在 Ubuntu/macOS 可以直接執行這個命令安裝:

Windows 版本請參考:coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. (github.com)

安裝完成後再執行

然後再執行

確認版本,預期執行結果會類似

專案環境設定

建立一個新的資料夾test-erc721a,然後初始化成 Node.js 的專案資料夾

執行命令後會詢問是否要安裝套件,請按下 Enter 直接安裝。

初始化完成後,再來安裝必要套件 Hardhat,這是一個用於 Solidity 合約語法的開發工具以及框架。

安裝完成後執行

這邊我們選擇 Create a basic sample project

環境設定完成之後你會看到資料夾中多了這些東西

  • contracts: 智能合約檔案的資料夾
  • migrations: 部署合約腳本的資料夾
  • test: 測試腳本的資料夾
  • hardhat.config.js: 一些設定的資料夾

到此,基本的環境設定就完成了。

合約製作

我們在這裡要安裝 OpenZeppelin 所提供的合約庫,這個開源的合約庫提供了相當多的合約協議可供開發使用,而且不太需要擔心安全性問題(但不是完全安全),畢竟是開源的,內容大家都能看到,有異常也容易被發現。

然後我們還需要安裝 ERC-721A 的合約庫。

接下來在 contracts 建立一個新的檔案:Mint.sol,然後貼上以下內容。

這個合約主要提供了以下功能:

  • mint: 鑄造
  • tokenURI: 讀取 NFT 的 Metadata
  • airdrop: 空投 NFT 給指定位址的人
  • setMint: 啟動或停止鑄造
  • setBaseUri: 設定 NFT 的 Metadata URI,主要用於設定 NFT 圖片位址、細節內容等

這些都是目前主要的功能,不過還缺少了一些較細節的設定,例如價錢設定、錢包位址可鑄造的數量等等,但為了教學與入門方便,我們先省略這些細節,之後的文章再來增加這些功能…如果我有空寫的話。

實際測試

完成合約之後,就要來測試啦!

首先,先開啟一個新的終端機,然後輸入以下指令來啟動單機測試用的節點:

啟動之後,不要關掉,另外開一個終端機,輸入以下指令來開啟連線

輸入完成後你應該會看到類似這樣的畫面:

接下來輸入以下這個指令:

注意:以下指令不包括「>」符號,只需要輸入後方的內容即可。

你會看到一大堆的位址,如下面所示,但注意!這些都是測試位址,請不要轉你的以太幣到這些位址,會消失!或者是在別人的錢包!

接下來輸入以下指令部署你的 ERC-721A 智能合約到你的測試節點上,在部署的同時可以觀察測試節點的那個終端機,會有有趣的內容喔~

輸入以下指令來看合約位址

以上都沒有遇到問題後,這表示你的部署已經完成了,接下來我們要來手動玩一次鑄造啦!

先來確認一下數字是不是為 0,看起來沒什麼問題。然後輸入鑄造的命令:

然後你會看到一大堆錯誤

這是正常的,因為我們在合約中有一段限制的程式,在還沒設定啟用鑄造功能前,鑄造功能是無法使用的!

所以我們要先啟用鑄造功能

然後再輸入一次

欸嘿!成功啦!我們可以用 totalSupply 確認數量是不是增加了。

然後設定一下 BaseUri

再用 tokenURI 確認回傳的位址組合正不正確

看起來一切正常,恭喜你獲得基本款 NFT 智能合約啦!

自動測試

手動體驗一次測試後,雖然有趣,但如果每次開發功能都要手動跑一次的話,那也太累人了。可是又不能不測試,畢竟智能合約一但部署至區塊鏈上就無法被更改(註1),如果有嚴重問題的話就會相當麻煩。

這時候我們就需要自動測試啦!

在 test 資料夾中將原本的測試腳本內容刪除,更換成以下內容:

然後在終端機執行

好了,剛剛我們的操作現在只要一行指令就可以自動幫我們完成測試,是不是很方便呢?

關於自動測試的部分,可以參考 Mocha 以及 chai,這是 hardhat 預設使用的工具,同時也是 Node.js 在執行自動化測試時相當常用的工具。

到這裡,你已經擁有你的 ERC-721A 智能合約以及學到了最基本的測試。接下來的文章會為大家講解,如何將智能合約部署到測試的區塊鏈,以及,如何用網頁瀏覽器與你的智能合約互動。

我們下回再見!

註1: 智能合約有提供一種叫做 Proxy 的功能,他可以允許合約採用代理模式呼叫,如此一來便可隨時更新背後呼叫的合約,以達到類似更新的作用。


嗨,我建立了一個 Discord 社群,如果有任何想交流的或想聊聊的歡迎加入!

Discord: https://discord.gg/uq8dhu5X

您的見解

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料