【Solidity】view与pure方法修饰符的应用

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

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

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

pragma solidity ^0.8.7;

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

Loading

Facebook评论