主页 > 最新版官网imtoken > 以太坊智能合约生命周期

以太坊智能合约生命周期

最新版官网imtoken 2023-02-26 07:37:49

我们之前写过如何通过truffle将以太坊智能合约部署到区块链上。 在本文中,我们将详细了解以太坊智能合约。

智能合约的建立

我们写好智能合约之后,部署到区块链上的时候,我们可能会有一些操作要做。 比如设置一些变量。 与面向对象编程语言中的类一样以太坊合约怎么做,智能合约也有一个构造函数。 构造函数是与合约同名的函数。

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

如果我们将智能合约部署到区块链上,我们将能够看到智能合约执行的代码,当我们读取存储值时以太坊合约怎么做,它等于我们的权力。

samrt-contracts-lifecycle

构造函数确实有助于在部署时自定义合约。 传统类具有析构函数,大多数情况下对象被销毁时都会调用这些析构函数。 以太坊智能合约可能也是如此。

谁在与智能合约交互?

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

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

这是我们的柜台合同更新:

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

所以我们目前的合约只允许原始创建者增加计数器。

销毁智能合约

再好的事情也会结束,再好的智能合约也会结束! 当使用 destroy 函数杀死合约时,就无法再与其交互。 要杀死合约,您需要调用销毁函数 selfdestruct(address)。 提供地址作为参数可以让您将合约中存储的剩余资金转移到相应的地址。

当您执行 destroy 函数来销毁合约时,检查调用者的身份可以让您保护合约不被任何人销毁。

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

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

安利一个教程:Ethereum dapp,主要介绍使用node.js、mongodb、blockchain、ipfs实现去中心化电商DApp的实战,适合进阶。