solidity语法4——合约(类似面向对象中的Class)

Posted zccst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solidity语法4——合约(类似面向对象中的Class)相关的知识,希望对你有一定的参考价值。

 

这部分主要介绍合约的完整写法和用法。前面1,2,3运用在4中。

 

 

 

 

Pure 函数

函数可以声明为 pure ,在这种情况下,承诺不读取或修改状态。

除了上面解释的状态修改语句列表之外,以下被认为是从状态中读取:

  1. 读取状态变量。
  2. 访问 this.balance 或者 <address>.balance
  3. 访问 blocktx, msg 中任意成员 (除 msg.sig 和 msg.data 之外)。
  4. 调用任何未标记为 pure 的函数。
  5. 使用包含某些操作码的内联汇编。
pragma solidity ^0.4.16;

contract C {
    function f(uint a, uint b) public pure returns (uint) {
        return a * (b + 42);
    }
}

批注:官方文档写的太隐晦。

只要有了pure与view修饰符的函数,那么调用函数就不会消耗gas。
而没有pure与view修饰的函数,如下面的change就会消耗gas。

使用场景:

  • view: 可以自由调用,因为它只是“查看”区块链的状态而不改变它

  • pure: 也可以自由调用,既不读取也不写入区块链

 原理:

  • pure:不读取更不修改区块上的变量,使用本机的CPU资源计算我们的函数。所以不消耗任何的资源这是很容易的理解的。

  • view: 但是view既然要读取区块链上的值,为什么也不用消耗gas呢?

在Solidity中constant,view,pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。 在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。 view的作用和constant一模一样,可以读取状态变量但是不能改; pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。 大家可以运行以下测试代码来加深这3个关键字的理解。

contract constantViewPure{
    string name;
    uint public age;
    
    function constantViewPure() public{
        name = "liushiming";
        age = 29;
    }
    
    function getAgeByConstant() public constant returns(uint){
        age += 1;  //声明为constant,在函数体中又试图去改变状态变量的值,编译会报warning, 但是可以通过
        return age;  // return 30, 但是!状态变量age的值不会改变,仍然为29!
    } 
    
    function getAgeByView() public view returns(uint){
        age += 1; //view和constant效果一致,编译会报warning,但是可以通过
        return age; // return 30,但是!状态变量age的值不会改变,仍然为29!
    }
    
    function getAgeByPure() public pure returns(uint){
        return age; //编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量!
        return 1;
    }
}

  

 

以上是关于solidity语法4——合约(类似面向对象中的Class)的主要内容,如果未能解决你的问题,请参考以下文章

智能合约学习笔记——solidity语法

Solidity编程 四 之 智能合约的结构

Solidity合约内创建合约以及引用其他合约的总结

智能合约实战 solidity 语法学习 09 [ 访问函数getter 合约创建 合约对象 合约继承IS ]

智能合约实战 solidity 语法学习 08 [ 访问函数getter 合约创建 合约对象 合约继承IS ]

智能合约实战 solidity 语法学习 06 [ transfer ]