以太幣智能合約(二):透過 Solidity 制定合約
繼上一篇拿到以太幣以後,就可以來試著寫一份合約了!接著我們會透過 Solidity 來撰寫一份以太幣智能合約。
Solidity 是一個合約導向式語言,當初設計時有參考 ECMAScript 的規範,所以寫起來有點像是有考慮變數型別的 JavaScript。總之會寫 JavaScript 的話應該會很好上手。
Remix IDE:官方開發的線上編輯程式
不管你用 VS Code、Atom 還是 Sublime Text,開發 Solidity 時會建議你選用 Ethereum 團隊開發的編輯器 Remix。裡面整合了能夠測試 Solidity 的 VM,也能夠直接部署合約到以太幣的網路或測試網路上。
撰寫 Solidity 合約很簡單
首先來看看這段範例程式碼:
pragma solidity ^0.4.23;
contract signinBoard {
int public people = 0;
constructor(int initPeople) public {
people = initPeople;
}
function signIn(int _people) public {
people += _people;
}
}
第一行是宣告使用的 Solidity 版本。由於 Solidity 還算新語言,可能會常常加入或棄用很多新功能,所以合約上要寫好使用的 Solidity 版本。
接著要宣告這份合約名字,例如這個叫 signinBoard
,並宣告一個建構子 constructor
來做初始化。下面的 function signIn(int _people)
則是代表宣告一個公開方法 signIn
,並接受一個字串參數。其中後面的 public
代表這 function 可以被公開使用。
其實我覺得這邊宣告也很像在寫 Java。
這邊先簡單介紹一下幾個寫 function 會用到的關鍵字,一些詳細的用法後面還會提到:
- public:可被公開呼叫
- private:只可被合約內部呼叫
- payable:開放付款的 function(智能合約是可以存錢進去的)
- returns:要返回值的 function
- view:不會改變變數值的 function
- pure:不會讀取也不會改變變數值的 function
想深入了解可以看官方的文件:Contracts、Types。
如果右邊的 Compile 頁籤沒有顯示問題的話,就可以切換到 Run 頁籤來試著跑看看。一開始我們可以先用把 Environment 改成 JavaScript VM,這樣不用花到任何以太幣就可以在本機測試。
選擇剛剛寫好的 signinBoard
合約,輸入初始值 initPeople
並按下 Create,就能看到下方建立好一份合約。
合約下面可以看到所有公開的變數和方法:點擊 people
可以看到我們剛剛建立合約時所填入的 initPeople
,而填入 _people
並按下 signIn
則可以執行該方法。試試執行幾次 signIn
方法,看看 people
變數有沒有變吧。
Gas 是什麼?Gas Price?Gas Limit?
開始把合約部署上去到區塊鏈之前,先來看看你的合約要花多少錢。
區塊鏈中每個交易都是交由礦工來計算的,礦工都是為了賺那些手續費才願意做這些事情;既然我們在區塊鏈上寫程式讓礦工執行,我們寫的程式中每個運算也都要支付手續費給礦工。這些運算的單位叫做 Gas,而每個 Gas 花費的價格就稱為 Gas Price。
在 Solidity 中,除了讀取外,每個運算、寫入都需要消耗 Gas。也就是說要是你的合約寫的效率很差,你就會讓執行合約的人花很多錢才能算完。
但為了避免合約撰寫人亂寫一通,讓立合約人花一堆錢,所以每次執行合約都有個手續費上限,超過手續費就不做了。這手續費上限就叫做 Gas Limit。
要是花費的 Gas 超過 Gas Limit 的話,會停止執行合約。但已消耗的 Gas 仍然會計費,畢竟礦工還是進行計算了。
所以 $每次的交易的花費為 = Gas Price \times 所消耗的 Gas$。
如下圖中,Actual Tx Cost/Fee 為 Gas Used By Txn 乘上 Gas Price。
下一篇再來講如何把合約丟到區塊鏈上,成為真正的智能合約。
以太幣智能合約 目錄
- 以太幣智能合約(一):如何獲得免費以太幣?
- 以太幣智能合約(二):透過 Solidity 制定合約
- 待續