本文,我們先從一個簡單的智能合約樣例出發,通過對合約源檔案結構的剖析與介紹,使大家對Solidity語言有一個初步的認識。最後,我們将該智能合約樣例在Remix合約編譯器中編譯、部署,觀察其執行結果。
基礎概念
在開始之前,我們先對Solidity有個初步的了解,即Solidity是什麼?
讓我們看一下官方的描述:
- Solidity是一種面向對象(合約)的,為實作智能合約而建立的進階程式設計語言;
- Solidity是一種針對以太坊虛拟機(EVM)設計的語言,它受到了C++、Python和JavaScript的影響;
- Solidity是一種靜态類型語言,支援複雜的使用者定義程式設計,支援庫和繼承。
合約樣例
下面是一個簡單的合約例子,我們用來示範如何用Solidity編寫一個簡單的智能合約。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// 第一個合約
contract HelloWorld {
// 狀态變量
string public str = "Hello World!";
// set 函數
function set(string memory s) public {
str = s;
}
// get 函數
function get() public view returns(string memory) {
return str;
}
}
合約結構
版權許可
// SPDX-License-Identifier: MIT
版本許可位于源檔案中的第1行,用于定義合約的版權許可辨別。雖然不是強制的,但我們建議在每個源檔案中都應該以這樣的代碼開始,來說明合約的版權許可證。如果你不想指定一個許可證,或者如果源代碼不開源,請使用特殊值 UNLICENSED。
版本辨別
pragma solidity ^0.8.13;
版本辨別位于源檔案中的第2行,用于定義Solidity的版本,其中 pragma 是定義版本辨別的關鍵字。
這行代碼表示不允許低于 0.8.7 版本的編譯器編譯,也不允許高于 0.9.0 的編譯器編譯,即使用的編譯器版本介于 0.8.7 與 0.9.0之間。
Solidity編譯器版本規範如下:
序号 | 版本規範 | 說明 |
1 | ^0.5.1 | 指定的主版本号下所有更新的版本。即比對 0.5.1 ~ 0.6.0 之間的版本 |
2 | ~0.5.1 | 指定的主版本号與次版本号下所有更新的版本。即比對 0.5.1 ~ 0.5.9 之間的版本 |
3 | >=0.5.1 | 版本号大于等于0.5.1,比對 >=0.5.1 的所有版本 |
4 | <=0.5.1 | 版本号小于等于0.5.1,比對 <=0.5.1 的所有版本 |
5 | x | 比對所有版本 |
6 | 0.5或0.5.x | 比對指定主版本号與次版本号下的所有版本 |
截止到目前,Solidity的編譯器版本已更新到 0.8.15。我們建議在編譯部署合約時,應該盡量使用最新版本,因為新版本會有一些新特性以及bug修複。
合約類(對象)
contract HelloWorld {
// 函數和資料
}
在Solidity語言中,合約類似于其他面向對象程式設計語言中的類。contract 是定義合約類的關鍵字,HelloWorld 是合約名稱。我們建議合約名稱和本地檔案名用同一個名稱,且第一個字母大寫。
合約還可以從其他合約繼承,可以是一些特殊的合約,比如庫(library)和接口(interface)。這些知識點我們會在後續的課程中講解。
狀态變量
string public str = "Hello World!";
這段代碼中的 str 就是一個狀态變量,它是一個永久存儲在合約存儲中的值。
函數
function set(string memory s) public
function get() public view returns(string memory)
函數是合約代碼的可執行單元,函數通常在合約内部定義。函數一般有以下幾部分組成:
- 函數名
- 參數
- 傳回值
在樣例代碼中,我們定義了2個函數:
- set():用于設定狀态變量的值;
- get():用于傳回狀态變量的值。
注釋
合約中的注釋有單行注釋(//)和多行注釋(/*...*/)兩種,和C++的注釋類似。
// 這是一個單行注釋
/*
這是一個
多行注釋
*/
合約部署
我們推薦使用Remix來開發簡單合約。
Remix 是一個合約開發和編譯器,可以線上使用,而無需安裝任何東西。
我們在Remix中編譯、部署和運作這個樣例合約。執行結果如下圖: