以太坊智能合约生命周期(Ethereum smart contracts lifecycle)
合約對象初始化
上一節(jié)中我們提到Solidity編寫合約和面向?qū)ο缶幊陶Z言非常相似,我們可以通過構(gòu)造函數(shù)(constructor)來初始化合約對象。構(gòu)造函數(shù)就是方法名和合約名字相同的函數(shù),創(chuàng)建合約時會調(diào)用構(gòu)造函數(shù)對狀態(tài)變量進行數(shù)據(jù)初始化操作。
pragma solidity ^0.4.4;contract Power {uint value;/* 合約初始化時會調(diào)用構(gòu)造函數(shù) */function Power(uint number, uint p) { value = number ** p;}function getPower() constant returns (uint) {return value;}}同一個合約是否可同時擁有兩個構(gòu)造函數(shù)?
由上圖不難看出,當我們同一個合約如果有多個構(gòu)造函數(shù)時,會出現(xiàn)下面的錯誤提示:
More than one constructor defined.function Power(uint number) { ^ Spanning multiple lines. Another declaration is here如果你嘗試部署Power合約,你將看到需要提供兩個參數(shù)進行合約交易。
合約部署成功后,我們將會看到getPower函數(shù)返回的值。
構(gòu)造函數(shù)(constructor)會在合約創(chuàng)建時對數(shù)據(jù)進行初始化,傳統(tǒng)的類會在對象銷毀時調(diào)用析構(gòu)函數(shù)(destructor),在以太坊智能合約中,同樣在合約銷毀時,自動調(diào)用析構(gòu)函數(shù)銷毀相關(guān)數(shù)據(jù)。
合約owner
讓我們來對我們上一篇中的Counter合約進行改進,合約對象創(chuàng)建時在構(gòu)造函數(shù)中保存我們當前合約的合約地址,在increment函數(shù)中增加一個判斷,只有當在我們合約內(nèi)部調(diào)用時,狀態(tài)變量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) { // 判斷是誰在調(diào)用`increment`方法count = count + 1;}}/* 讀取count的值 */function getCount() constant returns (uint) {return count;}}因此我們給合約增加了一層保護層,只有創(chuàng)建合約的creator才能夠自己調(diào)用increment方法讓count加1。
析構(gòu)函數(shù) - 一個合約的銷毀
最完美的事情是有開始有結(jié)尾,合約也一樣,它也可以結(jié)束。當一個合約通過kill方法將其殺死,那么我們將不能再和這個合約進行交互,如果一個合約被銷毀,那么當前地址指向的是一個僵尸對象,這個僵尸對象調(diào)用任何方法都會拋出異常。你想銷毀合約,需要調(diào)用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) { // 檢查誰在調(diào)用selfdestruct(owner); // 銷毀合約}}}在其他一些比較老的教程里面,你可能會看到suicide()方法,但是為了語言更好的可讀性,這個方法目前已經(jīng)重新命名,以后如有需要,大家直接調(diào)用selfdestruct()方法就好。
接下來讓我們調(diào)用我們的kill方法查看效果:
執(zhí)行kill方法,過一會兒刷新,你會發(fā)現(xiàn)剛才的合約已經(jīng)沒了。
小結(jié)
本節(jié)中,我們學習了一個簡單但是完整的合約,詳細講解了合約的構(gòu)造函數(shù)、析構(gòu)函數(shù),以及如何部署到區(qū)塊鏈,當我們調(diào)用kill方法時,會調(diào)用析構(gòu)函數(shù)將合約銷毀的整個過程。
http://liyuechun.org/2017/09/29/solidity-contract-0005/
總結(jié)
以上是生活随笔為你收集整理的以太坊智能合约生命周期(Ethereum smart contracts lifecycle)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以太坊Oracle系列一: Human
- 下一篇: 简单支付验证(SPV)与创新