區塊鏈應用開發實戰[9] – 智能合約開發語言 Solidity

小明一早與各團隊主管開完會後,開始思考交易所跟行銷獎勵兩個 POC 的可行性。不過無論是哪個 DApp 應用都會建構在智能合約的基礎上,因此他決定先深入學習以太坊上智能合約的主流開發語言 – Solidity。

Solidity 與其他程式語言無太大差異,它是一種靜態型別的程式語言。用於開發在以太坊虛擬機(EVM)上執行的智慧型合約,並編譯為可在 EVM 上執行的位元組碼。使用 Solidity,能夠編寫出可自我執行商業邏輯的應用程式,且是經部署後便永不可修改程式碼的交易合約。最新的官方文件可參考 https://solidity.readthedocs.io/ 。

Solidity 的語法與 JavaScript 相似,且是一種物件導向的語言。
而一個智能合約的組成必要元素有:

  1. 版本宣告 pragma solidity ^0..;
  2. 宣告一個合約 contract 合約名稱{…},contract 就像物件導向語言中的 class 類別相似,同時也支援繼承。
contract HelloWorld {
    address creator;
    string message;

    //合約的建構函式
    constructor() public {
        creator = msg.sender;
    }

    //可公開(public)呼叫並回傳字串(string)型別的無傳入參數之函式
    function say() public constant returns (string)  {
        return message;
    }

    function setMessage(string _newMsg) public {
        message = _newMsg;
    }

    function kill() public { 
        if (msg.sender == creator)
            selfdestruct(creator); //銷毀合約並將合約內的金額轉回給合約創建者地址
    }

}

熟悉多種程式語言的小明覺得 Solidity 程式語法非常容易入門,主要的差異還是在於智能合約去中心化的特性:

  1. 以太坊底層是基於帳戶,而非UTXO的,所以有一個特殊的Address的類型。用於定位用戶,定位合約,及定位合約的程式碼(合約本身也是一個帳戶)。
  2. 由於智能合約支援支付功能,所以提供了相關功能的關鍵字,如payable,可以在程式語言中使用支付功能。
  3. 智能合約的資料儲存是使用網絡上的區塊鏈,變數資料的每一個狀態都可以永久存儲,所以開發時需要確定變數要使用記憶體暫存,還是永久儲存在區塊鏈上。
  4. 智能合約程式執行環境是在去中心化的網路上,所以為了避免數據不一致。一旦出現異常,所有的執行都將會被撤銷。

 

 

Jason Chen
administrator
Jason Chen
BDE 區塊鏈學院 Founder | 台北區塊鏈社群 Organizer | Banking and Gaming Tech Expert

2003 ~ 2007
負責十多家銀行保險公司核心業務系統研發與建置

2008 ~ 2010
與Oracle合作台新銀行IPMS專案,獲頒2010年亞洲銀行家(The Asian Banker)「最佳分行自動化網路獎」及IDC頒發2010企業創新獎(Enterprise Innovation Award 2010)

2011 ~ 2015
加入亞洲最大博彩集團負責上百款RNG遊戲設計與研發,且全部通過GLI國際認證

2016 ~ 2018
投入新創圈,協助新創團隊將想法落實為商業模型。2016年研發多管道行銷平台通過政府SBIR補助,2017年研發聊天機器人平台被收購。目前為區塊鏈的信仰者與推廣者,協助區塊鏈生態圈的加速落地。