Solidity基礎教程1——整體結構

本教程使用的開發環境是一款在線編譯器——ChainIDE,具體的使用方法在之前的文章當中已經有講解過,有需要的同學可以自行查看。

網址:https://eth.chainide.com/

文件架構

Solidity語言的文件名後綴爲.sol,一般用作智能合約的編寫,文件內會包含以下的一些內容:
1.編譯器版本定義
2.外部合約調用(非必需)
3.合約主體
4.註釋(非必需)

編譯器版本定義。版本限制是爲了解決程序有可能被不兼容的編譯器所導致編譯失敗而產生的,我們可以通過幾個例子來了解一些它的常用方法。

pragma solidity ^0.4.0;

這句話的意思是,該文件使用的編譯器是大於等於0.4.0但小於0.5.0(不包括0.5.0),後面這個條件由^符號進行限定,這樣可以保證在編譯器的一箇中等版本內進行編譯。

pragma solidity >=0.4.0 <0.7.0;

這種寫法更像程序內的一種條件語句,也就是該文件使用的編譯器大於等於0.4.0且小於0.7.0。

外部合約調用。在開源的倉庫比如github,或者本地的文件內,有已經寫好的合約,我們就可以通過外部調用的方式直接引用,不用再重寫一遍。這種不僅是爲了節約時間和精力,而且是爲了保證安全,通常來說已經在區塊鏈上運行了一段時間的庫是具有安全保障的,比如大家會經常使用的Openzipplin的Safemath等衆所周知的輪子。

調用方法也很簡單:

import "filename";

這是最簡單的,直接通過路徑來進行庫的引用,可以引用本地路徑下的庫,也可以引用github上的一些庫。具體引用方式可以看下面兩個例子。

import "github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.5.1/contracts/math/SafeMath.sol";
import "../test.sol"

上面那行引用的是github上的OpeZeppelin的庫,這樣會把這個庫放到編譯器環境當中進行編譯。下面那行引用的是本地路徑下的一個test.sol文件,文件的位置在它的父目錄下。

import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;

還有一個技巧是可以把引用的庫給一個簡稱,這樣在調用的時候可以更加方便,類似於python當中import pandas as py這種方式。

合約主體。智能合約就是由Contract關鍵字編寫的程序模塊,它的內部是作用域,它的大括號內的一切都是屬於這個合約的一部分。一個合約主要會包含這五個元素:

1.狀態變量。

uint storedData; // 狀態變量

狀態變量是一個永久儲存在合約儲存當中的值,狀態變量可以是整形、布爾型、等等,狀態變量的類型可以由程序設定,或者是通過邏輯進行推斷得出,具體的細節內容我們會在下一節教程當中講解。

2.自定義類型

    enum Class { Chinese, Math, English }       // 枚舉

    struct Student{                             // 結構體
        uint number;
        bool isboy;
        address WalletAddress;
        uint grade;
    }

自定義類型有枚舉類型和結構體兩種形式,都是通過一個程序開發者自行定義的方式來對改類型進行設定,並且在程序當中調用這個值。

3.函數

    function get() public view returns (uint) {
        return storedData;
    }

函數是合約用來實現功能的邏輯部分,它包含了輸入值,返回值,函數類型,函數可見性以及內部邏輯等部分,是合約當中一個非常重要的部分。

4.函數Modifier

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

Modifier可以更改函數的行爲,比如讓它加入一些前置判斷條件,對函數的使用進行限制。這種Modifier是合約的可繼承屬性,可能被派生屬性所覆蓋,總的來說是函數設計的一種表達方式。

上面這個onlyOwner的modifier就表示只有與合約當中owner變量的值相同的地址纔可以調用這個函數,後面的_表示待填充的代碼。

5.事件

event EventName(address bidder, uint amount);  //定義一個事件

function testEvent() public {
     emit EventName(msg.sender, msg.value);     // 觸發一個事件
}

這個部分有些與平常的語言不一樣的地方,由於程序運行的基礎環境是EVM,程序的調試和監管所需的日誌也是儲存在EVM上的,event關鍵詞就是定義一個事件,在emit的時候調用它。

在合約內是不可以查看這個事件的日誌的,想要查看日誌可以使用Javascript的接口從以太坊查詢這個日誌。

我們可以舉個例子,比如你是一個製作DEX前端的程序員,你要跟合約進行交互,觀察函數是否正確被調用了,交易是否完成,這個時候就可以通過調用日誌來進行查詢。這個部分在我們稍微後面一點的教程當中會提及。

最後,註釋。雖然註釋不是一個程序編譯時的必須組成部分,但是不寫註釋的程序員都是要被開除的[狗頭]。

   //  這是一條註釋

希望大家在寫程序的時候也能好好寫註釋,這樣在與別人協作或者是自己調試的時候會有很大幫助。

結語

今天的內容就到這裏結束了,主要是幫助大家對.sol文件結構有個整體的認識,這樣在真正開始編程的時候可以更快的入手。

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