之前我们写过如何将以太坊智能合约通过truffle部署到区块链上。在本文将进一步了解以太坊智能合约。
智能合约的建立
当我们编写完成一个智能合约后,当它被部署到区块链时,我们可能会有一些操作要做。例如,设置一些变量。与面向对象编程语言中的类一样,智能合约也有一个构造函数constructor
。构造函数是与合约同名的函数。
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;
}
}
如果你尝试部署此合约,你将看到必须向合约交易提供两个参数。
如果我们将智能合约部署到区块链,我们将能够看到智能合约的执行代码,当我们读取存储的值时,它等于我们的power。
在部署时,构造函数constructor
确实有助于自定义合约。传统的类大部分时间都是在对象被销毁时调用的析构函数。以太坊 智能合约也可能是这样的。
谁在与智能合约交互?
当你创建智能合约时,你可能需要知道在运行时谁与它交互。在以太坊区块链链中,actors(智能合同或钱包)通过他们的地址address
来识别。如果你想知道调用函数的地址address
,可以使用msg.sender
访问它。存储地址可以让你根据交易创建者实现相应的逻辑。
假设我们想从Hello World教程中改进我们的Counter
合约,并且只允许合约的创建者能够更新计数器。我们需要添加两个步骤:一个构造函数,它将存储创建者的地址和另外一个是增量函数,以确保它是调用函数的创建者。
下面是我们的Counter
合约更新:
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)
。提供一个地址作为参数,让你将存储在合约中的剩余钱传送到相应的地址。
当你执行一个销毁函数来破坏一个合约时,检查调用者的身份可以让你保护合约不会被任何人破坏。
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函数:
几秒钟后,如果你尝试访问你的合约,你会看到,你不能再与它互动交互了。
这样我们就简单了解了一个智能合约的生命周期。
安利一个教程: 以太坊dapp,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。