作者:黎躍春,區塊鏈、高可用架構工程師
微信: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
方法讓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
方法時,會調用析構函數將合約銷燬的整個過程。
技術交流
區塊鏈技術交流QQ羣:348924182
「區塊鏈部落」官方公衆號