ERC721 NFT 開發&部署(1/2)

Rogerh.eth
12 min readMay 13, 2022

--

隨著NFT將區塊鏈帶入公眾視野,雖然現在行情非常低迷,但也意味著各位開發者還有一些時間學習以及準備下一個熱潮,現在是學會如何在區塊鏈上發佈自己的NFT(ERC-721令牌)不錯的時間點,不算晚也不算早,接下來的區塊鏈應用從開發層面來看也只會越來越複雜、越來越完整,但NFT依舊會是組成這些生態系的基礎元素之一,雖然簡單卻很重要

在本教程中,我們將使用MetaMaskSolidityHardhatPinataAlchemy在Rinkeby測試網路上創建和部署ERC-721智慧合約(如果您還不明白這意味著什麼,請不要擔心 — 我們會解釋它!

在本教程的第2部分中,我們將介紹如何使用我們的智能合約來鑄造NFT,並解釋如何在MetaMask及Opensea(目前最大的NFT二級市場)上查看您的NFT

1、連接到乙太坊網路

有很多方法可以向乙太坊區塊鏈發出請求,但為了簡化事情,我們將在Alchemy上使用一個免費帳戶,這是一個區塊鏈開發人員平臺和API,允許我們與乙太坊鏈進行通信,而無需運行自己的節點

在本教程中,我們還將利用Alchemy的開發人員工具進行監控和分析,以瞭解我們的智慧合約部署中後台發生了什麼(如果您還沒有Alchemy帳戶,可以在此處免費註冊)

2、建立應用程式(和 API 金鑰 )

創建 Alchemy 帳戶後,可以通過創建應用來生成 API 金鑰。這將使我們能夠向 Rinkeby 測試網路發出請求

  1. 導航到Alchemy Dashboard 中的“Create App”頁面
  2. 命名你的應用,提供簡短描述,為環境選擇“暫存”(用於你的應用簿記),然後為你的網络選擇“Rinkeby”

點擊”Create app”,就是這樣!你的應用應顯示在下表中

3、創建一個乙太坊帳戶(位址)

我們需要一個乙太坊帳戶來發送和接收交易,在本教程中,我們將使用MetaMask作為錢包,這是瀏覽器中用於管理乙太坊帳戶位址的虛擬錢包

如果您想了解有關乙太坊交易如何工作的更多資訊,請查看乙太坊基金會的此頁面

您可以在此處免費下載並創建一個MetaMask帳戶。當您創建帳戶時,或者如果您已經擁有帳戶,請確保切換到右上角的“Rinkeby測試網路”(這樣我們就不會處理真錢)

4、從水龍頭添加測試用ETH

為了將我們的智慧合約部署到測試網路,我們需要一些假的ETH。要獲得ETH,您可以到ChainLinkFaucETH並輸入您的Address,然後在下拉清單中選擇”Rinkeby“,最後再次按”Send Request“按鈕,不久之後,您應該會在MetaMask帳戶中看到ETH

可以多按幾次申請多一點來進行測試(我目前自用大概一個月會消耗5ETH左右)

5、初始化專案

前置目前已經準備完了,接下來,我們要為專案創建一個資料夾。開啟Terminal並輸入:

mkdir my-first-nft

打開你喜歡的 IDE,我的教程都會使用 visual studio code ,並開啟剛剛創建的資料夾

現在我們已經在項目資料夾中,我們將使用 npm init 來初始化專案(如果您尚未安裝 npm,請下載 Node.js),安裝完成後於Terminal輸入 npm init (中間會需要在Terminal回答一些問題,都先按 Enter 使用 default 設定)

6、安裝 hardhat

Hardhat是一個開發環境,用於編譯,部署,測試和調試乙太坊軟體,在部署到正式鏈之前,它可以幫助開發人員在本地構建智慧合約和dApp。

在 Terminal 中輸入 npm install --save-dev hardhat

7、創建 hardhat 專案

在我們的項目的 Terminal 中輸入:npx hardhat

然後,您應該會看到一條歡迎消息和選項,用於選擇要執行的操作

選擇”Create an empty hardhat.config.js”這將為我們生成一個 hardhat.config.js 文件

8、添加項目資料夾

為了保持專案井井有條,我們將創建兩個新資料夾。

輸入:mkdir contracts & mkdir scripts

  • contracts:我們保留NFT智慧合約代碼的地方
  • scripts:我們保留腳本以部署並與智慧合約交互的地方

9、開始寫我們的智能合約

現在我們的環境已經設置好了,接下來是更令人興奮的事情:編寫我們的智慧合約代碼!

智能合約是用一種名為Solidity的語言編寫的,我們將用它來編寫MyNFT.sol智能合約

  • 導航到 contracts 資料夾並創建一個名為 MyNFT.sol 的新檔。 輸入: cd contracts & touch MyNFT.sol
  • 以下是我們的NFT智慧合約代碼,我們基於OpenZeppelin庫的ERC-721實現。將以下內容複製並粘貼到 MyNFT.sol 檔中(這是最簡單的版本,之後都會以這個版本做延伸)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFT is ERC721 {
constructor() ERC721("MyNFT", "MYNFT") {}
}
  • 因為我們是從 OpenZeppelin 合約庫繼承類,所以在你的命令行中運行以將庫安裝到我們的資料夾中。
    輸入:npm install @openzeppelin/contracts

那麼,這段代碼到底做了什麼呢?讓我們逐行分解。

在我們的智慧合約的頂部,我們導入了三個OpenZeppelin智能合約類:

  • @openzeppelin/contracts/token/ERC721/ERC721.sol 包含ERC-721標準的實現,我們的NFT智慧合約將繼承該標準,要成為有效的NFT,您的智慧合約必須實現ERC-721標準的所有方法。要瞭解有關繼承的ERC-721功能的更多資訊,請查看此處的介面定義,或是去查看源碼

這邊我詳細解釋源碼的細節

10、將metamask和alchemy連接到您的專案

現在我們已經創建了一個MetaMask錢包、Alchemy帳戶,並編寫了我們的智能合約,現在是時候將這三者連接起來了

從您的虛擬錢包發送的每筆交易都需要使用您唯一的私鑰簽名。為了向我們的程式提供此許可權,我們可以安全地將我們的私鑰(和Alchemy API金鑰)存儲在 .env中(這邊提及的私鑰都請最高規格保護)

首先,在專案目錄中安裝 dotenv 包,輸入:npm install dotenv --save

然後,在我們專案的根目錄中創建一個 .env 檔,並將您的MetaMask私鑰和HTTP Alchemy API URL添加到其中

  • 從MetaMask匯出您的私鑰
  • 獲取HTTP Alchemy API URL並將其複製到剪貼板

.env 輸入對應的值

API_URL="<https://eth-rinkeby.alchemyapi.io/v2/your-api-key>"
PRIVATE_KEY="your-metamask-private-key"

不要提交!請確保永遠不要與任何人共用或公開您的文件,因為這樣做會洩露您的私鑰,如果您是使用git進行版本控制,請將您的 .env 檔添加到 .gitignore

創建 .gitignore 檔,添加下列內容

.env
node_modules

目前的專案架構如下:

11、安裝 ether.js

Ethers.js是一個庫,通過使用更使用者友好的方法包裝標準JSON-RPC方法,可以更輕鬆地對乙太坊進行交互和發出請求

hardhat 使集成外掛程式變得非常容易(獲得額外的工具和擴展功能)。我們將利用Ethers外掛程式進行合約部署(Ethers.js有一些超級乾淨的合約部署方法)

在terminal中輸入:npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0

12、更新 hardhat.config.js

到目前為止,我們已經添加了幾個依賴包和外掛程式,現在我們需要更新hardhat.config.js以便我們的項目瞭解所有這些依賴和外掛程式

更新您的 hardhat.config.js,如下所示:

/**
* @type import('hardhat/config').HardhatUserConfig
*/
require('dotenv').config();
require("@nomiclabs/hardhat-ethers");
const { API_URL, PRIVATE_KEY } = process.env;
module.exports = {
solidity: "0.8.1",
defaultNetwork: "rinkeby",
networks: {
hardhat: {},
rinkeby: {
url: API_URL,
accounts: [`0x${PRIVATE_KEY}`]
}
},
}

13、編譯我們的智能合約

為了確保到目前為止一切正常,讓我們編譯我們的合同,編譯任務是內置安全帽任務之一

在terminal中輸入:npx hardhat compile ,你應該會看到以下輸出

% npx hardhat compile
Compiled 10 Solidity files successfully

14、編寫部署腳本

現在我們的合約已經寫好了,我們的配置檔也很好用了,是時候編寫我們的合約部署腳本了

scripts資料夾並建立名為deploy.js的新檔案,向其添加以下內容:

async function main() {
const contractFactory = await ethers.getContractFactory("MyNFT")
// Start deployment, returning a promise that resolves to a contract object
const contract = await contractFactory.deploy()
await contract.deployed()
console.log("Contract deployed to address:", contract.address)
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error)
process.exit(1)
})

Hardhat在他們的合同教程中解釋了這些代碼行中的每一行的作用,我們在這裡採用了他們的解釋

const contractFactory = await ethers.getContractFactory("MyNFT");

ethers 中的 ContractFactory.js 是用於部署新智能合約的 abstract,因此 contractFactory 在這裡是我們NFT合約實例的工廠

const contract = await contractFactory.deploy();

在 ContractFactory 上調用 deploy() 將啟動部署,並返回解析為 Contract 的 promise,這是一個物件,它為我們的每個智慧合約函數提供了一個調用的方法

15、部署我們的合同

我們終於準備好部署我們的智能合約了,導航回根目錄

在terminal中輸入:npx hardhat --network rinkeby run scripts/deploy.js

然後,您應該看到類似下面的內容:

Contract deployed to address: 0x0dc96169CCdAc3Af0630788e99aF1C391D8A017e

如果我們轉到Rinkeby etherscan並搜索我們的合約地址,我們應該能夠看到它已成功部署。如果您無法立即看到它,請稍等片刻,因為這可能需要一些時間。將如下所示:

點進去可以查看交易細節,“to”位址應與您的 MetaMask 帳戶位址匹配,“From”位址將顯示“Contract … created”。如果我們點擊進入交易,我們將在“From”欄位中看到我們的合同位址:

你剛剛成功將NFT智能合約部署到乙太坊鏈

這就是本教程第一部分的全部內容,在接下來第二部分中我們會介紹如何使用我們的智能合約來鑄造NFT,並解釋如何在MetaMask及Opensea(目前最大的NFT二級市場)上查看您的NFT

--

--

Rogerh.eth

Sharing what i have learned for becoming a great developer.