主页 > imtoken官方版下载安卓最新版 > Solidity语法---以太坊智能合约生命周期

Solidity语法---以太坊智能合约生命周期

合约对象初始化

在 Solidity 中编写合约与面向对象的编程语言非常相似。 我们可以通过构造函数来初始化合约对象。 构造函数是一个函数,其方法名称与契约名称相同。 创建合约时,会调用构造函数来初始化状态变量的数据。

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

同一个合约可以同时有两个构造函数吗?

sitejianshu.com 以太坊以太经典那个好_销毁以太坊_sitejianshu.com 以太坊以太经典

从上图不难看出,当我们在同一个合约中有多个构造函数时,会出现如下错误信息:

More than one constructor defined.
     function Power(uint number) { 
     ^
Spanning multiple lines.
Another declaration is here

如果您尝试部署 Power 合约,您将看到您需要为合约交易提供两个参数。

sitejianshu.com 以太坊以太经典那个好_销毁以太坊_sitejianshu.com 以太坊以太经典

合约部署成功后,我们会看到getPower函数返回的值。

构造函数(constructor)会在合约创建时初始化数据。 传统的类会在对象被销毁时调用析构函数(destructor)。 在以太坊智能合约中,销毁合约时会自动调用析构函数。 相关数据。

合同所有人

在创建合约对象的时候,在构造函数中保存了我们当前合约的合约地址,在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;
    }
}

因此,我们在合约中增加了一层保护。 只有合约的创建者可以调用 increment 方法将计数加 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方法看看效果:

sitejianshu.com 以太坊以太经典那个好_销毁以太坊_sitejianshu.com 以太坊以太经典

执行kill方法,过一会刷新,你会发现刚才的合约没有了。

sitejianshu.com 以太坊以太经典那个好_销毁以太坊_sitejianshu.com 以太坊以太经典

原文:以太坊智能合约生命周期