如何撰寫智能合約(Smart Contract)?(I)
上一篇中介紹了智能合約是什麼,也概略描述了從編譯到部署智能合約的流程,接下來將介紹如何使用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 example 和 Truffle 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/