/ EthereumCryptocurrencySolidity區塊鏈JavaScript程式

以太幣智能合約(二):透過 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
    想深入了解可以看官方的文件:ContractsTypes

如果右邊的 Compile 頁籤沒有顯示問題的話,就可以切換到 Run 頁籤來試著跑看看。一開始我們可以先用把 Environment 改成 JavaScript VM,這樣不用花到任何以太幣就可以在本機測試。

solidity

選擇剛剛寫好的 signinBoard 合約,輸入初始值 initPeople 並按下 Create,就能看到下方建立好一份合約。

solidity_run

合約下面可以看到所有公開的變數和方法:點擊 people 可以看到我們剛剛建立合約時所填入的 initPeople,而填入 _people 並按下 signIn 則可以執行該方法。試試執行幾次 signIn 方法,看看 people 變數有沒有變吧。

solidity_run2

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。
gas

下一篇再來講如何把合約丟到區塊鏈上,成為真正的智能合約。

以太幣智能合約 目錄