image.png
    在 Solidity 中 constant、view、pure 三个函数修饰词的作用是告诉编译器,函数不改变 / 不读取状态变量,这样函数执行就可以不消耗 gas 了(是完全不消耗!),因为不需要矿工来验证,所以用好这几个关键词对省 gas 很重要。

    • constant: 常量,不可更改
    • view: 可读取但不可更改合约中的状态变量
    • pure: 不可读取且不可更改合约中的状态变量

    据说,在 Solidity v4.17 之前,只有 constant,后来有人嫌 constant 这个词本身代表变量中的常量,不适合用来修饰函数,所以将 constant 拆成了 view 和 pure。view 的作用和 constant 一模一样,可以读取状态变量但是不能改;pure 则更为严格,pure 修饰的函数不能改也不能读状态变量,否则编译通不过。

    测试代码:

    1. pragma solidity ^0.4.21;
    2. contract constantViewPure{
    3. string name;
    4. uint public age;
    5. function constantViewPure() public{
    6. name = "liushiming";
    7. age = 29;
    8. }
    9. function getAgeByConstant() public constant returns(uint){
    10. age += 1; //声明为constant,在函数体中又试图去改变状态变量的值,编译会报warning, 但是可以通过
    11. return age; // return 30, 但是!状态变量age的值不会改变,仍然为29!
    12. }
    13. function getAgeByView() public view returns(uint){
    14. age += 1; // view和constant效果一致,编译会报warning,但是可以通过
    15. return age; // return 30,但是!状态变量age的值不会改变,仍然为29!
    16. }
    17. function getAgeByPure() public pure returns(uint){
    18. return age; //编译报错!pure比constant和view都要严格,pure完全禁止读写状态变量!
    19. return 1;
    20. }
    21. }