1. 程式人生 > >Solidity 語言簡易入門,快速上手!

Solidity 語言簡易入門,快速上手!

Solidity語言簡介

solidity語言是一種可以編寫智慧合約的高階語言,當然編寫智慧合約不止這一種,但是學習以太坊最好還是學會這一種語言就差不多了。在以太坊平臺上,solidiy編寫的智慧合約會執行在以太坊虛擬機器EVM之上,變成位元組碼執行。

新手入門建議使用官方IDE開發工具Remix。


結構

solidity語言中的合約結構和麵向物件程式設計的類相似。一個合約就幾乎是一個類,結構基本一致。包括宣告變數(如狀態變數,函式,函式修改器,事件),合約繼承等。

contract SimpleContract{
    unit SomeData; // 狀態變數
    
    function(){
        // 函式
    }
    
    address public creater;   // 建立者地址

    function SimpleContract() {
       creater = msg.sender;  // 在建構函式中記錄合約建立者
    }  

    modifier onlyCreater() {
        // 函式修改器
        require(msg.sender == creater);
        _;
    }

    function abort() onlyCreater(){
        // 使用函式修改器
    }

    event Deposit(address _from, uint _amount);  // 事件
    function Donate() payable(){
        Deposit(msg.sender, msg.value);  // 觸發事件
    }    


}
  • 狀態變數:永久儲存在合約賬戶中的值,用於儲存合約狀態。一經寫入智慧合約,部署到區塊鏈之上,後不可修改 。
  • 函式:結構類似js函式。
  • 函式修改器:可用於修改函式的行為,在函式執行前或執行後插入其他邏輯。比如在函式執行前進行引數檢查等。
  • 事件:是以太坊日誌協議的高層次抽象,用於記錄合約執行過程中發生的各種事件以及狀態變化。

     

變數型別

1. 值型別

跟C++ 極為相似。簡要說明。

  1. 布林型別。 true false,支援 ! &&  ||  ==   !=
  2. 列舉型別。enum SomeEnum { one, two, three  }
  3. 整數型別。int uint,uint為無符號整數。變數支援通過後綴指明變數使用多少位進行儲存,字尾範圍是8~256之內8的整數倍。如int8  int16... int256, 預設為int256 uint256。
  4. address地址型別。智慧合約獨有的變數型別,長度為20位元組,和以太坊賬戶地址長度一致。原本屬於合約的基類,擁有一些成員方法和變數。從solidity0.5.0版本開始,合約不再繼承自address地址型別,但仍然可以通過顯式型別轉換將合約轉換為地址型別。

重點介紹address的一些方法和變數。

1. <address>.balance  賬戶餘額

2. <address>.transfer(uint256 amount)  轉賬,失敗會丟擲異常,終止程式碼

3. <address>.send(uint256 amount) return (bool) 轉賬,失敗會返回false

4. <address>.call(...) return (bool)  

5. <address>.callcode(....) return (bool)

6. <address>.delegate(...) return (bool) 

4 5 6 與合約進行互動。

4 接收任何長度型別的引數,每個引數被填充為32位元組並拼接在一起。

6 與4的區別是 6僅執行diamagnetic,而諸如轉賬儲存,餘額等其他方面都是使用當前合約資料,這是為了用另外一個合約的程式碼。

5 屬於早期介面,許可權較低,無法訪問msg.sender, msg.value等變數。

2. 引用型別

  1. 陣列:T[k]型別為T長度為k的定長陣列,T[ ] 則聲明瞭一個動態陣列
    1. 成員變數和函式: 
      1. bytes和string,一種特殊的陣列。bytes屬於任意長度的位元組資料,string用於表示任意長度的UTF8字元資料。
      2. push方法,陣列尾部新增新元素,返回新陣列長度。
      3. length 陣列長度,賬戶儲存中的陣列長度可以修改,而記憶體中的陣列建立後length成員已經確定了無法修改。外部呼叫無法返回一個動態陣列的長度,做法是需要將返回的內容放在一個長度足夠的定長陣列
  2. 結構體。與C極為相似。
struct{
    address add;
    uint amount;
}

3.  對映:對映是一種鍵值對對映關係的儲存結構。我們使用 mapping(KeyType => ValueType)來宣告一個對映。

鍵型別KeyTpye可以是除了對映,動態陣列,智慧合約,列舉型別,結構體以外的任何型別

值型別ValueType可以是任意型別,包括對映本身。

對映可以看作一個散列表,鍵輸入雜湊,得到值。對映不儲存鍵的值,而是儲存其Keccak-256雜湊值。

3. 型別轉換

顯示型別轉換和隱式型別轉換。

uint16 a = uint16(b) 顯式轉換。

uint16 a = 0x11111111  32位隱式轉為16位。

4. 運算子

需要注意一個新的運算子 delete

uint a[3]; 若a[2]  = 2, delete a[2] 之後, a[2] = 0; 

delete a 則表示將陣列變為長度為0的空陣列。

5. 型別推斷

var  a = "asad"  推斷 a的型別為string,用法跟js中的var,C++中的auto一致。


內建單位、全域性變數和函式

1. 貨幣單位

2. 時間單位

3. 區塊和交易屬性。

4. 異常處理函式

5. 數學加密函式

6. 合約相關的變數和函式。

選擇控制結構

迴圈,條件語句與C++完全一致。

函式

呼叫同一合約的函式,內部呼叫

呼叫其他合約例項的方法,屬於外部呼叫。

命名呼叫 !!!

函式可用性:external, public, internal, private

特殊函式

constant, 只讀

fallback函式, 不接收引數,無返回值。

 

待更新。。。