跳至主要內容

如何鑄造 NFT(NFT 教學系列第 2/3 部分)

ERC-721
Alchemy
Solidity
智能合約
初階
蘇米·穆吉爾
2021年4月22日
13 分鐘閱讀

Beeple (opens in a new tab):6900 萬美元 3LAU (opens in a new tab):1100 萬美元 Grimes (opens in a new tab):600 萬美元

他們全都使用 Alchemy 強大的 API 鑄造了他們的 NFT。在本教學中,我們將教你如何在不到 10 分鐘內完成同樣的事情。

「鑄造 NFT」是指在區塊鏈上發佈 ERC-721 代幣的唯一實例。使用我們在本 NFT 教學系列第 1 部分中的智能合約,讓我們展現 Web3 技能並鑄造一個 NFT。在本教學結束時,你將能夠隨心所欲(且在錢包允許的範圍內)鑄造任意數量的 NFT!

我們開始吧!

第 1 步:安裝 Web3

如果你遵循了關於建立 NFT 智能合約的第一個教學,你應該已經有使用 Ethers.js 的經驗。Web3 類似於 Ethers,它是一個用來讓向以太坊區塊鏈發送請求變得更容易的函式庫。在本教學中,我們將使用 Alchemy Web3 (opens in a new tab),這是一個增強版的 Web3 函式庫,提供自動重試和強大的 WebSocket 支援。

在你的專案主目錄中執行:

npm install @alch/alchemy-web3

第 2 步:建立 mint-nft.js 檔案

在你的 scripts 目錄中,建立一個 mint-nft.js 檔案並加入以下程式碼:

require("dotenv").config()
const API_URL = process.env.API_URL
const { createAlchemyWeb3 } = require("@alch/alchemy-web3")
const web3 = createAlchemyWeb3(API_URL)

第 3 步:取得你的合約 ABI

我們的合約 ABI(應用程式二進位介面)是與我們的智能合約互動的介面。你可以了解更多關於 的資訊。Hardhat 會自動為我們產生一個 ABI,並將其儲存在 MyNFT.json 檔案中。為了使用它,我們需要透過在 mint-nft.js 檔案中加入以下程式碼來解析其內容:

const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json")

如果你想查看 ABI,可以將其列印到主控台:

console.log(JSON.stringify(contract.abi))

要執行 mint-nft.js 並在主控台看到列印出的 ABI,請前往你的終端機並執行:

node scripts/mint-nft.js

第 4 步:使用 IPFS 設定 NFT 的中繼資料

如果你還記得第 1 部分的教學,我們的 mintNFT 智能合約函式會接收一個 tokenURI 參數,該參數應解析為描述 NFT 中繼資料的 JSON 文件——這正是賦予 NFT 生命力的關鍵,使其具有可設定的屬性,例如名稱、描述、圖片和其他屬性。

星際檔案系統 (IPFS) 是一個去中心化的協定和點對點網路,用於在分散式檔案系統中儲存和分享資料。

我們將使用 Pinata(一個方便的 IPFS API 和工具套件)來儲存我們的 NFT 資產和中繼資料,以確保我們的 NFT 是真正去中心化的。如果你沒有 Pinata 帳戶,請在此 (opens in a new tab)註冊一個免費帳戶並完成驗證電子郵件的步驟。

建立帳戶後:

  • 前往「Files」頁面,然後點擊頁面左上角的藍色「Upload」按鈕。

  • 將圖片上傳到 Pinata——這將成為你 NFT 的圖片資產。你可以隨意為該資產命名。

  • 上傳後,你將在「Files」頁面的表格中看到檔案資訊。你還會看到一個 CID 欄位。你可以點擊旁邊的複製按鈕來複製 CID。你可以在 https://gateway.pinata.cloud/ipfs/<CID> 檢視你的上傳內容。例如,你可以在此 (opens in a new tab)找到我們在 IPFS 上使用的圖片。

對於視覺學習者,上述步驟總結如下:

How to upload your image to Pinata

現在,我們還需要上傳另一份文件到 Pinata。但在那之前,我們需要先建立它!

在你的根目錄中,建立一個名為 nft-metadata.json 的新檔案,並加入以下 JSON 程式碼:

你可以隨意更改 JSON 中的資料。你可以移除或新增 attributes 區塊的內容。最重要的是,確保 image 欄位指向你的 IPFS 圖片位置——否則,你的 NFT 將會包含一張(非常可愛的!)狗狗照片。

完成 JSON 檔案的編輯後,儲存並將其上傳到 Pinata,步驟與我們上傳圖片時相同。

How to upload your nft-metadata.json to Pinata

第 5 步:建立合約實例

現在,為了與我們的合約互動,我們需要在程式碼中建立一個合約實例。為此,我們需要合約地址,你可以從部署紀錄中取得,或透過在 Blockscout (opens in a new tab) 上查詢你用來部署合約的地址來取得。

View your contract address on Etherscan

在上述範例中,我們的合約地址是 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778。

接下來,我們將使用 Web3 的 contract 方法 (opens in a new tab),透過 ABI 和地址來建立我們的合約。在你的 mint-nft.js 檔案中,加入以下內容:

const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"

const nftContract = new web3.eth.Contract(contract.abi, contractAddress)

第 6 步:更新 .env 檔案

現在,為了建立並發送交易到以太坊鏈上,我們將使用你的公開以太坊帳戶地址來取得帳戶隨機數(將在下方說明)。

將你的公鑰加入到 .env 檔案中——如果你完成了教學的第 1 部分,我們的 .env 檔案現在應該看起來像這樣:

API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-private-account-address"
PUBLIC_KEY = "your-public-account-address"

第 7 步:建立你的交易

首先,讓我們定義一個名為 mintNFT(tokenData) 的函式,並透過以下步驟建立我們的交易:

  1. .env 檔案中取得你的 PRIVATE_KEYPUBLIC_KEY

  2. 接下來,我們需要找出帳戶隨機數。隨機數規格用於追蹤從你的地址發送的交易數量——基於安全考量以及防止重放攻擊,我們需要這個數值。為了取得從你的地址發送的交易數量,我們使用 getTransactionCount (opens in a new tab)

  3. 最後,我們將使用以下資訊設定我們的交易:

  • 'from': PUBLIC_KEY — 我們交易的來源是我們的公開地址

  • 'to': contractAddress — 我們希望互動並發送交易的合約

  • 'nonce': nonce — 包含從我們地址發送的交易數量的帳戶隨機數

  • 'gas': estimatedGas — 完成交易所需的預估燃料

  • 'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI() — 我們希望在此交易中執行的運算——在這種情況下是鑄造一個 NFT

你的 mint-nft.js 檔案現在應該看起來像這樣:

第 8 步:簽署交易

現在我們已經建立了交易,我們需要簽署它才能將其發送出去。這就是我們將使用私鑰的地方。

web3.eth.sendSignedTransaction 將為我們提供交易雜湊值,我們可以使用它來確保我們的交易已被開採,且沒有被網路丟棄。你會注意到在交易簽署部分,我們加入了一些錯誤檢查,以便我們知道交易是否成功通過。

第 9 步:呼叫 mintNFT 並執行 node mint-nft.js

還記得你上傳到 Pinata 的 metadata.json 嗎?從 Pinata 取得它的雜湊碼,並將以下內容作為參數傳遞給函式 mintNFT https://gateway.pinata.cloud/ipfs/<metadata-hash-code>

以下是取得雜湊碼的方法:

How to get your nft metadata hashcode on Pinata如何在 Pinata 上取得你的 NFT 中繼資料雜湊碼

透過在獨立視窗中載入 https://gateway.pinata.cloud/ipfs/<metadata-hash-code>,再次確認你複製的雜湊碼連結到你的 metadata.json。該頁面應該看起來類似於下方的螢幕截圖:

Your page should display the json metadata你的頁面應該會顯示 JSON 中繼資料

總而言之,你的程式碼應該看起來像這樣:

現在,執行 node scripts/mint-nft.js 來部署你的 NFT。幾秒鐘後,你應該會在終端機中看到類似這樣的回應:

The hash of your transaction is: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8

Check Alchemy's Mempool to view the status of your transaction!

接下來,造訪你的 Alchemy 記憶體池 (opens in a new tab)以查看你的交易狀態(無論是待處理、已開採,還是被網路丟棄)。如果你的交易被丟棄,檢查 Blockscout (opens in a new tab) 並搜尋你的交易雜湊值也會很有幫助。

View your NFT transaction hash on Etherscan在 Etherscan 上檢視你的 NFT 交易雜湊值

就是這樣!你現在已經在以太坊區塊鏈上部署並鑄造了一個 NFT

使用 mint-nft.js,你可以隨心所欲(且在錢包允許的範圍內)鑄造任意數量的 NFT!只要確保傳入一個描述 NFT 中繼資料的新 tokenURI 即可(否則,你最終只會製作出一堆具有不同 ID 的相同 NFT)。

想必你希望能夠在錢包中展示你的 NFT——所以請務必查看第 3 部分:如何在錢包中檢視你的 NFT