以太坊智能合约生命周期

之前我们写过如何将以太坊智能合约通过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;
    }

}

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

samrt-contracts-lifecycle

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

samrt-contracts-lifecycle

在部署时,构造函数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函数:

kill

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

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

安利一个教程: 以太坊dapp,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值