以太坊智能合约生命周期(Ethereum smart contracts lifecycle)
合約對象初始化
上一節中我們提到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合約ownerfunction 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方法讓count加1。
析構函數 - 一個合約的銷毀
最完美的事情是有開始有結尾,合約也一樣,它也可以結束。當一個合約通過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方法時,會調用析構函數將合約銷毀的整個過程。
http://liyuechun.org/2017/09/29/solidity-contract-0005/
總結
以上是生活随笔為你收集整理的以太坊智能合约生命周期(Ethereum smart contracts lifecycle)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊Oracle系列一: Human
- 下一篇: 简单支付验证(SPV)与创新