如何撰寫智能合約(Smart Contract)?(I)

gasolin
Taipei Ethereum Meetup
6 min readSep 6, 2017

--

上一篇中介紹了智能合約是什麼,也概略描述了從編譯到部署智能合約的流程,接下來將介紹如何使用solidity語言來寫智能合約。

使用solidity語言撰寫智能合約

Ethereum上的智能合約需要使用solidity¹語言來撰寫。雖然還有其他能用來撰寫智能合約的語言如Serpent(類Python)、lll(類Fortran),但目前看到所有公開的智能合約都是使用solidity撰寫。

宣傳上說,solidity是一種類似Javascript的語言,而且圍繞著solidity的各種開發工具鏈,都是使用屬於Javascript生態系的npm來提供的。但我覺得solidity還是比較像Java或C#。 因為和Javascript不同,solidity與Java或C#同屬於強型別(Strong Type,在定義變數時需要指定型別)語言、在定義函式(function)時同樣需指定回傳的型別(type)、同樣也需要先編譯才能執行。這些特性都是Javascript所不具備的。

開發前的準備

本文將使用當前最活躍的智能合約開發框架truffle³為基礎來開發。之前提到過的ENS(Ethereum Name Service)⁵也是採用truffle框架。其他選擇還有embark⁴。

就像一般網站或App開發一樣,在提供公開服務之前,開發者會在自己用於寫程式的電腦(又稱作本機)或透過測試網路來測試程式執行的效果,測試完成後,才會部署到公開的網路上提供服務。 開發區塊鏈智能合約(程式)的過程也是如此。特別是公開鏈上所有的操作都需要真金白銀(虛擬代幣),而且根據網路狀況,每個公開鏈上的操作都需要要一小段反應時間(15秒 ~ 數分鐘),這些等待頗浪費寶貴的開發時間。 因此在開發的過程中,我們將使用testrpc⁶工具在電腦上模擬智能合約所需的乙太坊區塊鏈測試環境。

testrpc中也包含了Javascript版本的Ethereum虛擬機(Ethereum Virtual Machine)⁷,因此可以完整地執行智能合約。

安裝所需工具

首先開發機上必須裝好Node.js,再使用以下命令安裝所需的工具:

啟動 Testrpc

安裝好後隨時可以使用testrpc命令來啟動乙太坊測試環境。

可以看到testrpc啟動後自動建立了10個帳號(Accounts),與每個帳號對應的私鑰(Private Key)。

一切準備就緒,我們可以開始建立第一份智能合約專案了。

建立專案

開啟另一個命令列視窗,輸入以下命令以建立專案:

如此一來,我們已建立好第一份智能合約專案了。

demo資料夾下,可以看到contracts資料夾,裡面放的是這個專案所包含的所有solidity程式。我們在contracts資料夾中額外建立一個HelloWorld.sol檔案。(或者也可以用truffle create contract HelloWorld命令來建立)

HelloWorld.sol檔案內容如下:

講解

第一行指名目前使用的solidity版本,不同版本的solidity可能會編譯出不同的bytecode。

contract關鍵字類似於其他語言中較常見的class。因為solidity是專為智能合約(Contact)設計的語言,宣告contract後即內建了開發智能合約所需的功能。也可以把這句理解為class HelloWorld extends Contract

函式的結構與其他程式類似,但如果有傳入的參數或回傳值,需要指定參數或回傳值的型別(type)。

編譯

現在執行truffle compile命令,我們可以將HelloWorld.sol原始碼編譯成Ethereum bytecode。

編譯成功的話,在build/contracts目錄下會多出HelloWorld.json這個檔案。(在Windows平台上執行truffle compile若遇到問題,可以查看參考資料⁹來解決。)

部署

truffle框架中提供了部署的腳本,打開/migrations/2_deploy_contracts.js檔案,將內容修改如下

使用artifacts.require語句來取得準備部署的合約,使用deployer.deploy語句將合約部署到區塊鏈上。

現在執行truffle migrate命令,

如此一來合約已經部署到testrpc中。切換到testrpc視窗,可以看到testrpc有反應了。

與合約互動

truffle提供命令行工具,執行truffle console命令後,可用Javascript來和剛剛部署的合約互動。

講解

這邊使用HelloWorld.deployed().then語句來取得HelloWorld合約的Instance,並存到hello變數中,以方便後續的呼叫。

上面用的是Javascript ES6+的語法,這句也可以寫成

如此一來我們已寫好並部署完成了第一個智能合約,也驗證了合約確實可以運作。

結語

本篇設計的範例⁸超級簡單,但已達到完整地帶大家快速走一遍智能合約開發流程的目的。要透過智能合約實現各種功能,可以參考Solidity by exampleTruffle getting started 網站學習更多的內容。也歡迎讀者留言,分享學習資源或提供建議。

下一篇會接著介紹如何建立一個簡單的加密代幣🔒💵合約。

參考資料

* [1] Solidity http://solidity.readthedocs.io/en/latest/index.html

* [2] Solidity線上編輯器 https://ethereum.github.io/browser-solidity/

* [3] Truffle Framework http://truffleframework.com/

* [4] Embark Framework https://github.com/iurimatias/embark-framework

* [5] ENS也使用Truffle框架 https://github.com/ethereum/ens

* [6] https://github.com/ethereumjs/testrpc

* [7] https://github.com/ethereumjs/ethereumjs-vm

* [8] HelloWorld範例修改自 https://app.pluralsight.com/library/courses/blockchain-fundamentals/

* [9] Truffle issue on windows http://truffleframework.com/docs/advanced/configuration#resolving-naming-conflicts-on-windows

*原文網址 https://blog.gasolin.idv.tw/2017/09/06/howto-write-a-smart-contract/

--

--