1. 變數聲明和常見數據類型#
除了 address(地址)這類特別的類型,Solidity 的變數和數據類型與常見編程語言類似,具體介紹如下:
2. 枚舉
Solidity 需要定義一組常量時可以通過定義枚舉來實現,定義枚舉使用 enum 關鍵字,示例代碼如下,該示例代碼定義了一個顏色的枚舉,枚舉中有紅、黃、綠三種顏色,三種顏色的值依次為 0、1、2。
3. 結構體
結構體使用 Struct 關鍵字定義,下面的示列定義了一個名為 Player 的結構體,這個結構體包含了地址(addr)和數量(amount)兩個屬性,其中地址是 address 類型,數量是整型,具體代碼如下
4. 函數
Solidity 中函數的定義語法如下:
其中,<parameter types>指函數的參數及類型。{internal|external} 這兩個關鍵字規定了函數的調用方式,internal 指內部調用,能直接使用上下文環境中的數據;external 實現合約的外部消息調用,默認是 internal。[pure|constant|view|payable] 這 4 個關鍵字用來說明函數屬性,pure 關鍵字來源於函數式編程,表明這個函數體是一個純函數計算不能調用其他函數;constant 關鍵字定義一個常量,但在 Solidity 的 0.4.17 版本後不再使用;view 關鍵字表明這個函數是只讀不能修改狀態;如果一個函數需要進行貨幣操作,必須要帶上 payable 關鍵字。[returns(<return types>)] 用來指明函數的返回類型。
5. 註釋#
Solidity 註釋的語法和 JavaScript 中一樣,使用 “//” 進行單行註釋,使用 “/*” 和 “*/” 進行多行註釋。
//這是單行註釋
/*
這是
多行註釋
*/
6. 文件結構#
對於 Solidity 語言,除了要了解以上基本語法外,還需要了解 Solidity 的文件結構。Solidity 文件一般以.sol 作為文件後綴。在 sol 文件中,第 1 行是版本聲明,不同的版本支持的功能不同,所以文件需要指定版本號,語法如下:
pragma solidity ^0.4.0;
上面這行語句表明這個 sol 文件需要在 0.4.0 之後的版本上運行,其中的 “^” 符號表示不支持 0.5.0 及之後的版本。
以上是 Solidity 語法的簡單介紹,詳細內容可參看 Solidity 的官方教程,在此不再贅述。
: Solidity 語言的官方教程地址是 http://solidity.readthedocs.io/en/develop/types.html。
智能合約的開發#
了解了 Solidity 的基本語法後就可以開始進行智能合約的開發了。使用 Solidity 開發智能合約需要安裝一個編譯器。對於剛開始學習 Solidity 語言的讀者朋友來說,這裡推薦使用在線的 IDE 編輯器 ——Remix。在瀏覽器中輸入 http://remix.ethereum.org 即可使用,無須本地安裝。
1. 編譯器 Remix 的使用#
Remix 的操作界面主要分為 4 部分。左側是文件瀏覽區域,可以進行新建文件、打開本地文件、更新代碼到 GitHub 和瀏覽所有打開文件等操作;中間上半部分是編輯代碼的地方,代碼語法高亮,並可以自動進行語法檢查,黃色是警告和建議,紅色是語法錯誤;下半部分是一個交互式的終端界面,用來查詢交易詳情,調試智能合約;右側是功能面板,用來編譯、運行和測試智能合約,整個界面如圖 5-21 所示。
Remix 的功能比較強大,本書不過多贅述,有興趣的讀者可訪問 Remix 的官網 https://remix.readthedocs.io/en/latest 進行查閱。接下來我們直接上手,用 Remix 編譯器開發一個智能合約。
打開 Remix 後,默認顯示的是 Solidity 語言編寫的一個投票的智能合約示例,代碼比較多,此處不展開說明。這裡新建一個 Hello.sol 的文件。單擊左上角的 “+” 按鈕,輸入文件名為 “Hello.sol”,單擊 “OK” 按鈕進行保存,如圖
在新生成的文件第 1 行先聲明編譯器版本為 0.4.0 之後的版本,然後定義一個名為 “helloBlockchain” 的智能合約,這個合約中只包含一個函數 renderHello,其功能就是返回 “Hello Blockchain” 字符串,如圖
代碼編寫完成後,在右側功能面板選擇版本號 0.4.25 + 的編譯器進行編譯,如圖所示。編譯成功後會打印 “Hello Blockchain” 這個智能合約的名字。
接著單擊 “Run” 標籤,選擇運行環境為本地測試環境,選擇 “helloBlockchain” 智能合約後再單擊 “Deploy” 按鈕部署這個智能合約,如圖 5-25 所示。
Remix 有 3 種運行模式,如下所述。
●JavaScript VM:這種模式是在瀏覽器中模擬一個區塊鏈,合約在這個模擬的沙盒中執行,刷新頁面就會使所有數據清空,不會做任何持久化,沒有注入 Web3 對象。
●Injected Provider:連接到包含注入 Web3 對象的源上,在 Mist 瀏覽器或安裝 MetaMask 的瀏覽器上會自動切換到此模式下。
●Web3 Provider:連接到遠程結點,需要填寫源的 url 地址和端口,例如 geth、ganache 等客戶端,包含 Web3 對象
這裡選擇 Injected Provider 模式(圖中的 Provider 為 Web3 對象,即 Injected Web3)
部署智能合約是將智能合約寫入到以太坊,在以太坊上進行寫入操作都需要消耗以太幣,所以在這一步操作會消耗以太幣。在彈出的窗口中單擊 “Confirm” 按鈕確認支付,如圖
到這裡智能合約就部署到本地的測試環境了。智能合約部署成功後,在 Remix 主界面的右下角可以看到部署成功的智能合約和可以使用的函數 renderHello,單擊 renderHello 即是調用並執行該函數,可以看到輸出結果為字符串 “Hello Blockchain”,如圖
最後,總結一下智能合約的開發過程,整個流程如圖
1)新建 sol 文件,編寫智能合約的功能,這裡實現了一個輸出 “Hello Blockchain” 的功能。
2)使用編譯器對代碼進行編譯。
3)若編碼無錯誤,編譯器將編譯結果編譯生成一個二進制文件。
4)將編譯成功的智能合約部署到區塊鏈系統中。
5)部署成功後會返回智能合約的地址和應用二進制接口(Application Binary Interface,ABI),用於和智能合約進行交互。
6)通過地址和 ABI 調用智能合約。
Truffle 框架#
當掌握了 Solidity 的基本語法和智能合約的開發流程後,就可以進一步學習 DApp 的開發框架 Truffle 了。
Truffle 是針對基於以太坊的 Solidity 語言的一套開發框架。Truffle 本身基於 JavaScript,Truffle 的目標是讓 DApp 的開發變得更簡單,它具有以下功能。
●內置的智能合約編譯、鏈接、部署和二進制文件的管理。
●支持智能合約的自動化測試。
●腳本化的、可擴展的部署與發布框架。
●管理部署的網絡環境功能。
●使用 EthPM 或 npm 提供的包管理,使用 ERC190 標準。
●與合約直接通信的交互控制台(寫完合約就可以在命令行裡驗證了)。
●智能合約的構建流程可根據需求進行自定義配置。
●在 Truffle 環境裡支持執行外部的腳本
Truffle 的安裝和常用命令#
Truffle 可以通過包管理工具 npm 進行安裝,安裝命令如下:
$ npm install -g truffle
安裝完成後輸入 truffle 命令即可看到它的使用方法,如圖 5-29 所示。以下是幾個主要的 Truffle 命令的用法介紹。
1. 初始化 Truffle 項目 ——truffle init
要初始化 Truffle 項目只需要輸入 truffle init 就可以初始化一個空的項目,新建一個文件夾叫 first-DApp,進入文件夾後執行 truffle init,如圖所示。
Truffle 會自動生成一個空的項目工程。新生成的 Truffle 項目中包含幾個文件夾和配置文件,其中 contracts 文件夾用來存放智能合約;migrations 文件夾用來實現部署智能合約的功能;test 文件夾用來存放合約的測試文件;truffle.js 是默認配置文件;truffle-config.js 是 Windows 下的默認配置文件,以防止文件名與 truffle 命令衝突,一個 Truffle 項目的結構如
2. 編譯命令 ——truffle compile
執行 truffle compile 命令會編譯智能合約文件,編譯成功後會在當前目錄的 build 文件夾下生成新的智能合約二進制文件,如圖 5-32 所示。
3. 部署命令 ——truffle deploy
部署智能合約之前需要修改配置文件,本章中使用的智能合約開發測試環境為 Ganache,其客戶端監聽的端口為本地的 7545 端口,故需要修改 truffle.js 文件連接到本地的 7545 端口,如圖
修改完成就可以進行智能合約部署了,在終端中輸入命令 “truffle deploy” 即可完成。
4. 測試命令 ——truffle test
執行 truffle test 命令會運行 test 文件夾下的所有測試用例,該命令將會自動識別以.js、.es、.es6、.jsx 和.sol 為擴展名的文件,其他擴展名的文件將被忽略。
5. 終端命令 ——truffle console
執行 truffle console 命令可以打開一個交互式終端界面,方便地進行智能合約的調用和調試。
6. 下載模板命令 ——truffle unbox [box-name]
安裝完成後輸入 truffle 命令即可看到它的使用方法,如圖 5-29 所示。以下是幾個主要的 Truffle 命令的用法介紹。
1. 初始化 Truffle 項目 ——truffle init
要初始化 Truffle 項目只需要輸入 truffle init 就可以初始化一個空的項目,新建一個文件夾叫 first-DApp,進入文件夾後執行 truffle init,如圖 5-30 所示。
Truffle 會自動生成一個空的項目工程。新生成的 Truffle 項目中包含幾個文件夾和配置文件,其中 contracts 文件夾用來存放智能合約;migrations 文件夾用來實現部署智能合約的功能;test 文件夾用來存放合約的測試文件;truffle.js 是默認配置文件;truffle-config.js 是 Windows 下的默認配置文件,以防止文件名與 truffle 命令衝突,一個 Truffle 項目的結構如圖
Truffle 還有一個很實用的命令就是 truffle unbox [box-name],這個命令用來下載模板,box-name 是實際需要下載的模板名字。下一節內容將詳細介紹模板的使用。
要使用這個 drizzle 模板,首先要安裝 Truffle 和 Ganache 環境,前邊已經安裝完了,接下來直接執行 truffle unbox drizzle 命令下載這個模板即可。
至此,進行 DApp 開發的各項基礎知識已經介紹完,準備工作也已完成,下面開始進行 DApp 的實際開發。