跳至主要内容

部署你的第一個智能合約

智能合約
Remix
Solidity
部署
新手
jdourlens
2020年4月3日
6 分鐘閱讀

我想你和我們一樣興奮,都想在以太坊區塊鏈上部署並與你的第一個智能合約互動。

別擔心,因為這是我們的第一個智能合約,我們會在本地測試網上部署它,所以你部署和盡情操作它都不需要任何費用。

撰寫我們的合約

第一步是訪問 Remix (opens in a new tab) 並建立一個新檔案。 在 Remix 介面的左上角新增一個新檔案,並輸入你想要的檔案名稱。

在 Remix 介面中新增檔案

在新檔案中,我們將貼上以下程式碼:

1// SPDX-License-Identifier: MIT
2pragma solidity >=0.5.17;
3
4contract Counter {
5
6 // 公開的無正負號整數,用來記錄次數
7 uint256 public count = 0;
8
9 // 遞增計數器的函式
10 function increment() public {
11 count += 1;
12 }
13
14 // 取得計數值的 getter,非必要
15 function getCount() public view returns (uint256) {
16 return count;
17 }
18
19}
顯示全部

如果你習慣寫程式,你應該可以輕易猜出這個程式的功能。 以下是逐行說明:

  • 第 4 行:我們定義了一個名為 Counter 的合約。
  • 第 7 行:我們的合約儲存一個名為 count 的無正負號整數,初始值為 0。
  • 第 10 行:第一個函式會修改合約的狀態,並透過 increment() 遞增我們的 count 變數。
  • 第 15 行:第二個函式只是一個 getter,用來從智能合約外部讀取 count 變數的值。 請注意,因為我們將 count 變數定義為 public (公開),所以這不是必要的,只是作為範例展示。

這就是我們第一個簡單的智能合約。 你可能知道,它看起來像 Java 或 C++ 等物件導向程式設計 (OOP) 語言中的類別 (class)。 現在可以來操作我們的合約了。

部署我們的合約

既然我們寫好了第一個智能合約,現在就要將它部署到區塊鏈上,以便進行操作。

在區塊鏈上部署智能合約,實際上只是傳送一筆交易,其中包含已編譯智能合約的程式碼,而無須指定任何接收者。

首先,我們要點擊左側的編譯圖示來編譯合約

Remix 工具列中的編譯圖示

然後點擊編譯按鈕:

Remix Solidity 編譯器中的編譯按鈕

你可以選擇「自動編譯」(Auto compile) 選項,這樣每當你在文字編輯器中儲存內容時,合約就會自動編譯。

然後前往「部署及執行交易」(deploy and run transactions) 畫面:

Remix 工具列中的部署圖示

進入「部署及執行交易」畫面後,再次確認你的合約名稱是否出現,然後點擊「部署」(Deploy)。 如你在頁面頂端所見,目前環境是「JavaScript VM」(JavaScript 虛擬機),這代表我們將在一個本地測試鏈上部署我們的智能合約並與之互動,以便能更快地測試,且無須支付任何費用。

Remix Solidity 編譯器中的部署按鈕

點擊「部署」(Deploy) 按鈕後,你會在底部看到你的合約。 點擊左邊的箭頭將它展開,我們便能看到合約的內容。 這就是我們的 count 變數、increment() 函式和 getCounter() getter。

如果你點擊 countgetCount 按鈕,它會實際擷取合約的 count 變數內容並顯示出來。 因為我們還沒呼叫 increment 函式,所以它應該會顯示 0。

Remix Solidity 編譯器中的函式按鈕

現在讓我們點擊按鈕來呼叫 increment 函式。 你會在視窗底部看到所執行交易的紀錄。 你會發現,當你按下擷取資料的按鈕時,紀錄會與按下 increment 按鈕時不同。 這是因為在區塊鏈上讀取資料不需要任何交易 (寫入) 或費用。 因為只有修改區塊鏈的狀態才需要進行交易:

交易紀錄

按下 increment 按鈕會產生一筆交易來呼叫我們的 increment() 函式,之後如果我們回頭點擊 count 或 getCount 按鈕,我們就會讀取到智能合約已更新的狀態,其中 count 變數的值會大於 0。

智能合約已更新的狀態

在下一篇教學中,我們將介紹如何在你的智能合約中新增事件。 記錄事件是個便利的方法,可以對你的智能合約進行除錯,並了解呼叫函式時發生了什麼事。

頁面最後更新時間: 2024年4月26日

這個使用教學對你有幫助嗎?