跳至主要內容

初學者的 Hello World 智能合約

solidity
hardhat
alchemy
智能合約
部署
初階
elanh
2021年3月31日
19 分鐘閱讀

如果你是區塊鏈開發的新手且不知道從何開始,或者你只是想了解如何部署智能合約並與之互動,這篇指南就是為你準備的。我們將逐步介紹如何使用虛擬錢包 梅塔馬斯克 (MetaMask) (opens in a new tab)Solidity (opens in a new tab)Hardhat (opens in a new tab) 以及 Alchemy (opens in a new tab),在 Sepolia 測試網路上建立並部署一個簡單的智能合約(如果你還不懂這些名詞的意思,別擔心,我們會一一解釋)。

在本教學的第 2 部分中,我們將探討如何在智能合約部署後與之互動,而在第 3 部分中,我們將介紹如何將其發布到 Etherscan 上。

如果你在任何時候有疑問,歡迎隨時在 Alchemy Discord (opens in a new tab) 中提問!

第 1 步:連接到以太坊網路

有許多方法可以向以太坊鏈發出請求。為了簡單起見,我們將在 Alchemy 上使用免費帳戶。Alchemy 是一個區塊鏈開發者平台與 API,允許我們與以太坊鏈通訊,而無需執行我們自己的節點。該平台還提供用於監控和分析的開發者工具,我們將在本教學中利用這些工具來了解智能合約部署在底層是如何運作的。如果你還沒有 Alchemy 帳戶,可以在這裡免費註冊 (opens in a new tab)

第 2 步:建立你的應用程式(與 API 金鑰)

建立 Alchemy 帳戶後,你可以透過建立應用程式來產生 API 金鑰。這將允許我們向 Sepolia 測試網路發出請求。如果你對測試網路不熟悉,請查看此頁面

  1. 在導覽列中選擇「Select an app (選擇應用程式)」,然後點擊「Create new app (建立新應用程式)」,導覽至 Alchemy 儀表板中的「Create new app」頁面。

Hello world create app

  1. 將你的應用程式命名為「Hello World」,提供簡短描述,並選擇一個使用案例,例如「Infra & Tooling (基礎設施與工具)」。接著,搜尋「Ethereum」並選擇網路。

create app view hello world

  1. 點擊「Next (下一步)」繼續,然後點擊「Create app (建立應用程式)」,就完成了!你的應用程式應該會出現在導覽列的下拉式選單中,並提供可複製的 API 金鑰。

第 3 步:建立以太坊帳戶(地址)

我們需要一個以太坊帳戶來發送和接收交易。在本教學中,我們將使用梅塔馬斯克 (MetaMask),這是一個瀏覽器中的虛擬錢包,用於管理你的以太坊帳戶地址。了解更多關於交易的資訊。

你可以在這裡 (opens in a new tab)免費下載梅塔馬斯克 (MetaMask) 並建立以太坊帳戶。當你在建立帳戶時,或者如果你已經有帳戶,請務必使用網路下拉式選單切換到「Sepolia」測試網路(這樣我們就不會動用到真實資金)。

如果你沒有看到 Sepolia 列出,請進入選單,然後選擇「Advanced (進階)」,向下捲動並開啟「Show test networks (顯示測試網路)」。在網路選擇選單中,選擇「Custom (自訂)」分頁以尋找測試網路列表,然後選擇「Sepolia」。

metamask sepolia example

第 4 步:從水龍頭添加以太幣

為了將我們的智能合約部署到測試網路,我們需要一些測試用的 ETH。要獲取 Sepolia ETH,你可以前往 Sepolia 網路詳細資訊查看各種水龍頭的列表。如果其中一個無法使用,請嘗試另一個,因為它們有時會枯竭。由於網路流量的關係,接收測試用 ETH 可能需要一些時間。不久之後,你應該就會在你的梅塔馬斯克 (MetaMask) 帳戶中看到 ETH!

第 5 步:檢查你的餘額

為了再次確認我們的餘額已入帳,讓我們使用 Alchemy 的 composer 工具 (opens in a new tab)發出 eth_getBalance 請求。這將回傳我們錢包中的 ETH 數量。輸入你的梅塔馬斯克 (MetaMask) 帳戶地址並點擊「Send Request (發送請求)」後,你應該會看到類似以下的響應:

{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" }

注意: 此結果的單位是 Wei 而不是 ETH。Wei 被用作以太幣的最小面額。Wei 到 ETH 的轉換為:1 eth = 1018 Wei。因此,如果我們將 0x2B5E3AF16B1880000 轉換為十進位,我們會得到 5*10¹⁸,這等於 5 ETH。

呼!我們的測試資金都在那裡了

第 6 步:初始化我們的專案

首先,我們需要為專案建立一個資料夾。導覽至你的命令列並輸入:

mkdir hello-world
cd hello-world

現在我們已經在專案資料夾中,我們將使用 npm init 來初始化專案。如果你尚未安裝 npm,請遵循 Node.js 安裝指示 (opens in a new tab)(本教學將會用到 Node.js 和 npm)。

npm init

你如何回答安裝問題其實並不重要,以下是我們的做法供你參考:

確認 package.json 後,我們就可以開始了!

第 7 步:下載 Hardhat (opens in a new tab)

Hardhat 是一個用於編譯、部署、測試和除錯以太坊軟體的開發環境。它幫助開發者在部署到即時鏈之前,在本地端建置智能合約與去中心化應用程式 (dapp)。

在我們的 hello-world 專案中執行:

npm install --save-dev hardhat

查看此頁面以獲取有關安裝指示 (opens in a new tab)的更多詳細資訊。

第 8 步:建立 Hardhat 專案

在我們的專案資料夾中執行:

npx hardhat

然後你應該會看到一條歡迎訊息以及選擇你想要做什麼的選項。選擇「create an empty hardhat.config.js」:

這將為我們產生一個 hardhat.config.js 檔案,我們將在其中指定專案的所有設定(在第 13 步)。

第 9 步:新增專案資料夾

為了保持專案井然有序,我們將建立兩個新資料夾。在命令列中導覽至專案的根目錄並輸入:

mkdir contracts
mkdir scripts
  • contracts/ 是我們存放 hello world 智能合約程式碼檔案的地方
  • scripts/ 是我們存放用於部署和與合約互動的腳本的地方

第 10 步:撰寫我們的合約

你可能會問自己,我們到底什麼時候才要寫程式碼??嗯,我們這就來了,在第 10 步。

在你最喜歡的編輯器中打開 hello-world 專案(我們喜歡 VSCode (opens in a new tab))。智能合約是使用一種名為 Solidity 的語言撰寫的,這也是我們將用來撰寫 HelloWorld.sol 智能合約的語言。‌

  1. 導覽至「contracts」資料夾並建立一個名為 HelloWorld.sol 的新檔案。
  2. 以下是來自以太坊基金會的 Hello World 智能合約範例,我們將在本教學中使用它。將以下內容複製並貼上到你的 HelloWorld.sol 檔案中,並務必閱讀註解以了解此合約的作用:

這是一個超級簡單的智能合約,它在建立時儲存一則訊息,並且可以透過呼叫 update 函式來更新。

第 11 步:將梅塔馬斯克 (MetaMask) 與 Alchemy 連接到你的專案

我們已經建立了一個梅塔馬斯克 (MetaMask) 錢包、Alchemy 帳戶,並撰寫了我們的智能合約,現在是時候將這三者連接起來了。

從你的虛擬錢包發送的每筆交易都需要使用你獨特的私鑰進行簽章。為了向我們的程式提供此權限,我們可以安全地將我們的私鑰(以及 Alchemy API 金鑰)儲存在環境變數檔案中。

要了解更多關於發送交易的資訊,請查看這篇關於使用 Web3 發送交易的教學

首先,在你的專案目錄中安裝 dotenv 套件:

npm install dotenv --save

然後,在我們專案的根目錄中建立一個 .env 檔案,並將你的梅塔馬斯克 (MetaMask) 私鑰和 HTTP Alchemy API URL 添加到其中。

get alchemy api key

複製 Alchemy API URL

你的 .env 應該看起來像這樣:

API_URL = "https://eth-sepolia.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"

為了實際將這些連接到我們的程式碼,我們將在第 13 步的 hardhat.config.js 檔案中參考這些變數。

不要提交 .env!請確保永遠不要與任何人分享或暴露你的 .env 檔案,因為這樣做會危及你的機密。如果你正在使用版本控制,請將你的 .env 添加到 gitignore 檔案中。

第 12 步:安裝 Ethers.js

Ethers.js 是一個函式庫,它透過將標準 JSON-RPC 方法包裝成更使用者友善的方法,使得與以太坊互動和發出請求變得更加容易。

Hardhat 使得整合外掛程式 (opens in a new tab)以獲得額外工具和擴充功能變得超級容易。我們將利用 Ethers 外掛程式 (opens in a new tab)進行合約部署(Ethers.js (opens in a new tab) 有一些非常簡潔的合約部署方法)。

在你的專案目錄中輸入:

npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"

在下一步中,我們也需要在我們的 hardhat.config.js 中要求 (require) ethers。

第 13 步:更新 hardhat.config.js

到目前為止,我們已經添加了幾個相依套件和外掛程式,現在我們需要更新 hardhat.config.js,以便我們的專案知道它們的存在。

將你的 hardhat.config.js 更新為如下所示:

第 14 步:編譯我們的合約

為了確保到目前為止一切運作正常,讓我們編譯我們的合約。compile 任務是內建的 hardhat 任務之一。

從命令列執行:

npx hardhat compile

你可能會收到關於 SPDX license identifier not provided in source file 的警告,但不用擔心——希望其他一切看起來都很好!如果沒有,你隨時可以在 Alchemy Discord (opens in a new tab) 中留言。

第 15 步:撰寫我們的部署腳本

現在我們的合約已經寫好,設定檔也準備就緒,是時候撰寫我們的合約部署腳本了。

導覽至 scripts/ 資料夾並建立一個名為 deploy.js 的新檔案,將以下內容添加到其中:

Hardhat 在他們的合約教學 (opens in a new tab)中非常出色地解釋了這些程式碼每一行的作用,我們在這裡採用了他們的解釋。

const HelloWorld = await ethers.getContractFactory("HelloWorld");

ethers.js 中的 ContractFactory 是一個用於部署新智能合約的抽象概念,因此這裡的 HelloWorld 是我們 hello world 合約實例的工廠。當使用 hardhat-ethers 外掛程式時,ContractFactoryContract 實例預設會連接到第一個簽署者。

const hello_world = await HelloWorld.deploy();

ContractFactory 上呼叫 deploy() 將開始部署,並回傳一個解析為 ContractPromise。這是一個為我們每個智能合約函式提供方法的物件。

第 16 步:部署我們的合約

我們終於準備好部署我們的智能合約了!導覽至命令列並執行:

npx hardhat run scripts/deploy.js --network sepolia

然後你應該會看到類似以下的內容:

Contract deployed to address: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570

如果我們前往 Sepolia Etherscan (opens in a new tab) 並搜尋我們的合約地址,我們應該能夠看到它已成功部署。交易看起來會像這樣:

etherscan contract

From 地址應該與你的梅塔馬斯克 (MetaMask) 帳戶地址相符,而 To 地址會顯示「Contract Creation (合約建立)」,但如果我們點擊進入交易,我們會在 To 欄位中看到我們的合約地址:

etherscan transaction

恭喜!你剛剛將一個智能合約部署到了以太坊鏈上 🎉

為了了解底層發生了什麼事,讓我們導覽至 Alchemy 儀表板 (opens in a new tab)中的 Explorer 分頁。如果你有多個 Alchemy 應用程式,請務必按應用程式篩選並選擇「Hello World」。 hello world explorer

在這裡,你會看到當我們呼叫 .deploy() 函式時,Hardhat/Ethers 在底層為我們發出的一些 JSON-RPC 呼叫。這裡有兩個重要的呼叫需要特別指出:eth_sendRawTransaction (opens in a new tab),這是實際將我們的合約寫入 Sepolia 鏈的請求;以及 eth_getTransactionByHash (opens in a new tab),這是一個根據雜湊值讀取我們交易資訊的請求(這是處理交易時的典型模式)。要了解更多關於發送交易的資訊,請查看這篇關於使用 Web3 發送交易的教學。

本教學的第 1 部分就到此結束,在第 2 部分中,我們將透過更新初始訊息來實際與我們的智能合約互動,而在第 3 部分中,我們將將我們的智能合約發布到 Etherscan,讓每個人都知道如何與之互動。

想了解更多關於 Alchemy 的資訊嗎?請查看我們的網站 (opens in a new tab)。不想錯過任何更新?在這裡 (opens in a new tab)訂閱我們的電子報!也請務必加入我們的 Discord (opens in a new tab)