第一行代碼:以太坊(2)-使用Solidity語言開發和測試智能合約

智能合約是以太坊的核心之一,用戶可以利用智能合約實現更靈活的代幣以及其他DApp。不過在深入講解如何開發智能合約之前,需要先介紹一下以太坊中用於開發智能合約的Solidity語言,以及相關的開發和測試環境。

智能合約就是運行在以太坊上的程序。客戶端可以通過Web3.js API調用智能合約,而智能合約本身又可以直接訪問以太坊網絡,也就是說,智能合約前面連接着客戶端,後面連接着以太坊網絡,起到了承前啓後的作用,而且通過智能合約,可以讓整個以太坊網絡更靈活,可控性更強。其實智能合約的作用相當於微軟Office中的VBA,一個功能強大的領域腳本語言。智能合約的開發語言是Solidity,那麼Solidity是什麼呢?應該如何在以太坊網絡上運行用Solidity語言編寫的智能合約呢?本文將會揭曉這些問題的答案。

1. 什麼是Solidity語言

Solidity是一種用於編寫智能合約的高級語言,運行在Ethereum虛擬機(以太坊虛擬機,EVM)之上。那麼Solidity到底是怎樣一種編程語言呢?或者說Solidity語言的主要特性是什麼呢?請繼續往下看。

Solidity語言的語法接近於JavaScript,是一種面向對象的語言。但作爲一種真正意義上運行在網絡上的去中心智能合約,它又有很多的不同,下面列舉一些Solidity語言的主要特性。

  • 以太坊底層是基於帳戶的,因此在Solidity語言中有一個特殊的Address數據類型。用於定位用戶,定位合約,定位合約的代碼(合約本身也是一個帳戶)。
  • 由於Solidity語言內嵌框架是支持支付的,所以提供了一些關鍵字,如payable,可以在語言層面直接支持支付。
  • Solidity語言可以將數據存儲在區塊鏈上,數據的每一個狀態都可以永久存儲,所以需要確定變量使用的是內存,還是區塊。
  • 運行環境是在去中心化的網絡上,會比較強調合約或函數執行的調用的方式。因爲原來一個簡單的函數調用變爲了一個網絡上的節點中的代碼執行。
  • 最後一個非常大的不同則是Solidity語言的異常機制,一旦出現異常,所有的執行都將會被回撤,這主要是爲了保證智能合約執行的原子性,以避免中間狀態出現的數據不一致。有點類似於數據庫中的事務回滾。

2. 用Solidity語言開發智能合約

Solidity是一種圖靈完備的編程語言,所以編程的方式與Java、C++類似。不過Solidity語言中並沒有類的概念,但有一個合約的概念,用關鍵字contract表示。任何一個Solidity程序,都必須至少有一個合約(contract)。在合約中可以編寫Solidity函數,類似於類中的方法。Solidity源代碼文件的擴展名是sol,下面的例子給出了一個簡單的使用Solidity語言編寫的智能合約的例子,以便讀者對Solidity語言和智能合約有一個感性的認識。

下面的例子給出了一個名爲Calc的智能合約程序,在該智能合約中有一個add函數,用於將兩個無符號整數相加,並返回相加的結果。

pragma solidity ^0.4.0;
contract Calc{
    function add(uint a,uint b) returns (uint){
        return a + b;
    }
}

儘管現在還沒有正式講解Solidity語言和智能合約,不過從這段簡單的智能合約代碼也可以瞭解Solidity語言的結構。首先,智能合約的第1行需要使用pragma solidity指定Solidity編譯器的最低版本,本例是0.4.0,也就是說,要編譯這段Solidity程序,Solidity編譯器的版本不能低於0.4.0。要記住,在版本號前面要加上“^”。

接下來就是用contract關鍵字聲明智能合約,語法與類非常接近,智能合約的名字跟在contract關鍵字後面,智能合約中的代碼用一對花括號括起來。

最後是在智能合約中聲明若干個函數,函數的語法與JavaScript類似(都是使用function關鍵字聲明函數),不過也不完全相同,因爲Solidity是強類型的編程語言,而JavaScript是弱類型的編程語言。也就是說,聲明Solidity變量需要指定數據類型,如本例的uint,表示無符號整數類型。函數的返回值類型需要在函數聲明的結尾通過returns關鍵字指定。如本例的returns(uint),函數返回值與C風格的編程語言相同,仍然使用return語句指定函數返回值。Solidity語言的每一條語句後面都要跟分號(;)。

3. 使用Remix運行智能合約

學習編寫智能合約最重要的一步就是運行智能合約,否則無法知道我們編寫的智能合約程序是否正確。在正常情況下,應該將智能合約部署在以太坊網絡上,然後通過以太坊客戶端調用,不過現在還沒有講如何將智能合約部署到以太坊網絡上,以及如何調用智能合約。所以目前只能使用最簡單的方式測試智能合約。以太坊官方提供了一個在線的智能合約編寫和測試環境:Remix,通過這個工具,可以用不同的方式測試智能合約。
在瀏覽器地址欄輸入如下的Url後,會進入Remix頁面。

https://remix.ethereum.org

Remix頁面主要包含如下4部分。

  • 智能合約列表區域,位於Remix頁面的左側,如果第一次使用Remix,這個區域只有browser和config兩個節點,如果以前使用Remix創建過智能合約,會在browser節點下方顯示曾經創建過的智能合約文件(.sol文件)。
  • 代碼區域,位於Remix頁面的中上部,用於編寫智能合約代碼。
  • 日誌區域,位於Remix頁面的中下部,運行智能合約後,會將日誌信息輸出到這一區域。
  • 設置區域,位於Remix頁面右側,在這一區域可進行各種設置,如將智能合約部署在以太坊網絡上,運行智能合約等。

除了這4部分外,在Remix頁面左上角還有一排按鈕,其中最左側的加號按鈕用於新建智能合約,最右側的加號和減號按鈕分別用於增加和減少智能合約代碼的字號。Remix頁面的整體佈局如下圖所示。

image.png

接下來單擊Remix頁面左上角的加號按鈕,會彈出一個如下圖所示的頁面,在“File Name”文本框輸入“Calc.sol”,然後單擊“OK”按鈕創建新的智能合約。

image.png

將上一節給出的智能合約代碼輸入代碼區域,可以點擊加號和減號按鈕將代碼字體調整到自己感覺舒服的程度,效果如下圖所示。在設置區域會出現一些警告,並不需要管它們。

image.png

在設置區域切換到“Run”頁面,所有的設置保持默認值即可,然後點擊中間的“Deploy”部署Calc合約。成功部署Calc合約後,會在“Run”頁面下方根據Calc合約中的函數顯示相應的按鈕,如本例中只有一個add函數,並且該函數有兩個參數,所以在“Run”頁面下方會出現一個“add”按鈕,在按鈕旁邊的文本框輸入“3,4”,表示add函數的兩個參數值,如下圖所示。

image.png

最後單擊“add”按鈕執行add函數,會在日誌區域顯示相應的信息,然後單擊日誌區域輸出信息的向下箭頭,會在日誌區域顯示一個表格,在“decoded output”行會顯示add函數的返回值(計算結果),如下圖所示。

image.png

通過本節的若干步驟,終於成功運行了Calc智能合約的add函數,並獲得了add函數的返回值(本例是7),不過這個智能合約程序並沒有部署在以太坊網絡上,而是在本地運行的,也就是說,本節其實是通過模擬的方式運行了本地合約,這種運行方式只能測試智能合約中的函數的邏輯是否正確,並不能將以太坊客戶端、以太坊網絡和智能合約放到一起聯調,所以在實際的場景中,需要將智能合約部署到以太坊網絡上才能完整地對其進行測試。

《第一行代碼:以太坊》開始轉載了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章