『0005』- 以太坊智能合約生命週期(Ethereum smart contracts lifecycle)

孔壹學院:國內區塊鏈職業教育領先品牌

作者:黎躍春,區塊鏈、高可用架構工程師
微信:liyc1215 QQ羣:348924182 博客:http://liyuechun.org

上一篇中,我們講解了『0004』- 基於Ethereum Wallet的Solidity HelloWorld智能合約(Smart Contract)。本篇文章我們將一步步帶大家掌握以太坊智能合約的生命週期。

合約對象初始化

上一節中我們提到Solidity編寫合約和麪向對象編程語言非常相似,我們可以通過構造函數(constructor)來初始化合約對象。構造函數就是方法名和合約名字相同的函數,創建合約時會調用構造函數對狀態變量進行數據初始化操作。

pragma solidity ^0.4.4;

contract Power {

    uint value;

    /* 合約初始化時會調用構造函數 */
    function Power(uint number, uint p) { 
      value = number ** p;
    }

    function getPower() constant returns (uint) {
       return value;
    }

}

同一個合約是否可同時擁有兩個構造函數?

由上圖不難看出,當我們同一個合約如果有多個構造函數時,會出現下面的錯誤提示:

More than one constructor defined.
     function Power(uint number) { 
     ^
Spanning multiple lines.
Another declaration is here

如果你嘗試部署Power合約,你將看到需要提供兩個參數進行合約交易。

合約部署成功後,我們將會看到getPower函數返回的值。

構造函數(constructor)會在合約創建時對數據進行初始化,傳統的類會在對象銷燬時調用析構函數(destructor),在以太坊智能合約中,同樣在合約銷燬時,自動調用析構函數銷燬相關數據。

合約owner

讓我們來對我們上一篇中的Counter合約進行改進,合約對象創建時在構造函數中保存我們當前合約的合約地址,在increment函數中增加一個判斷,只有當在我們合約內部調用時,狀態變量count才加1,否則不做任何其他操作。

pragma solidity ^0.4.4;

contract Counter {

    uint count = 0;
    address owner; //存儲Counter合約owner

    function Counter() {
       owner = msg.sender; // 存儲Counter合約owner
    } 

    function increment() public {
       if (owner == msg.sender) { // 判斷是誰在調用`increment`方法
          count = count + 1;
       }
    }

    /* 讀取count的值 */
    function getCount() constant returns (uint) {
       return count;
    }

}

因此我們給合約增加了一層保護層,只有創建合約的creator才能夠自己調用increment方法讓count1

析構函數 - 一個合約的銷燬

最完美的事情是有開始有結尾,合約也一樣,它也可以結束。當一個合約通過kill方法將其殺死,那麼我們將不能再和這個合約進行交互,如果一個合約被銷燬,那麼當前地址指向的是一個殭屍對象,這個殭屍對象調用任何方法都會拋出異常。你想銷燬合約,需要調用selfdestruct(address)才能將其進行銷燬。

pragma solidity ^0.4.4;

contract Counter {

    uint count = 0;
    address owner;

    function Counter() {
       owner = msg.sender;
    } 

    function increment() public {
       if (owner == msg.sender) {
          count = count + 1;
       }
    }

    function getCount() constant returns (uint) {
       return count;
    }

    function kill() {
       if (owner == msg.sender) { // 檢查誰在調用
          selfdestruct(owner); // 銷燬合約
       }
    }

}

在其他一些比較老的教程裏面,你可能會看到suicide()方法,但是爲了語言更好的可讀性,這個方法目前已經重新命名,以後如有需要,大家直接調用selfdestruct()方法就好。

接下來讓我們調用我們的kill方法查看效果:


執行kill方法,過一會兒刷新,你會發現剛纔的合約已經沒了。

小結

本節中,我們學習了一個簡單但是完整的合約,詳細講解了合約的構造函數、析構函數,以及如何部署到區塊鏈,當我們調用kill方法時,會調用析構函數將合約銷燬的整個過程。

技術交流

  • 區塊鏈技術交流QQ羣:348924182

  • 「區塊鏈部落」官方公衆號

發佈了94 篇原創文章 · 獲贊 31 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章