以太坊智能合约的生命周期

之前我们写过如何将以太坊智能合约通过truffle部署到区块链上。在本文将进一步了解一下以太坊智能合约的生命周期。

智能合约的建立

当我们编写完成一个智能合约后,当它被部署到区块链时,我们可能会有一些操作要做。例如,设置一些变量。与面向对象编程语言中的类一样,智能合约也有一个构造函数constructor。构造函数是与合约同名的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pragma solidity ^0.4.11;

contract power {

uint value;

/* 这个功能在初始化的时候执行 */
function power(uint number, uint p) {
value = number ** p;
}

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

}

如果你尝试部署此合约,你将看到必须向合约交易提供两个参数。

samrt-contracts-lifecycle

如果我们将智能合约部署到区块链,我们将能够看到智能合约的执行代码,当我们读取存储的值时,它等于我们的power。

samrt-contracts-lifecycle

在部署时,构造函数constructor确实有助于自定义合约。传统的类大部分时间都是在对象被销毁时调用的析构函数。智能合约也可能是这样的。

谁在与智能合约交互?

当你创建智能合约时,你可能需要知道在运行时谁与它交互。在以太坊区块链链中,actors(智能合同或钱包)通过他们的地址address来识别。如果你想知道调用函数的地址address,可以使用msg.sender访问它。存储地址可以让你根据交易创建者实现相应的逻辑。

假设我们想从Hello World教程中改进我们的Counter合约,并且只允许合约的创建者能够更新计数器。我们需要添加两个步骤:一个构造函数,它将存储创建者的地址和另外一个是增量函数,以确保它是调用函数的创建者。

下面是我们的Counter合约更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pragma solidity ^0.4.11;

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;
}

}

所以我们目前的合约只允许最初的创造者增加计数器。

智能合约的销毁

再美好的事也会结束,再好的智能合约也会over!当使用销毁函数kill掉合约时,就不再可以与它进行交互了。要kill一个合约,你需要调用销毁函数selfdestruct(address)。提供一个地址作为参数,让你将存储在合约中的剩余钱传送到相应的地址。

当你执行一个销毁函数来破坏一个合约时,检查调用者的身份可以让你保护合约不会被任何人破坏。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
pragma solidity ^0.4.11;

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()。为了实现语言的健壮性,重新命名了suicide()函数。

来看看,让我们调用我们的kill函数:

kill

几秒钟后,如果你尝试访问你的合约,你会看到,你不能再与它互动交互了。

killed

这样我们就简单了解了一个智能合约的生命周期。

  • 以太坊智能合约,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊dapp,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

汇智网原创,转载请标明出处。