solidity入门指南 第二章

constant、view、pure关键字的区别

在 solidity 0.4.16 (含)之前,constant表示function不会改变合约的state(状态), 这样编译器就知道函数执行不需要网络验证,这样就可以不消耗gas。

由于constant这个关键字通常在别的开发语言中用来定义常量,从solidity 0.4.17版本开始,用view和pure来代替constant。

view的作用和constant作用一样可以读取状态变量但是不能改

pure的作用更为严格,函数不能改也不能读状态变量

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pragma solidity ^0.4.21;

contract constantViewPure{
uint age;

function constantViewPure() public
{
age = 30;
}


function getAgeConstant() public constant returns(uint)
{
age += 1;
return age;
}

function getAgeView() public view returns(uint)
{
age += 2;
return age;
}

function getAgePure() public pure returns(uint)
{
age += 3;
return age;
}

function getAge() public returns(uint)
{
return age;
}
}

getAgeConstant: 编译会报warning,返回31
getAgeView: 编译会报warning,返回32
getAgePure: 编译报错,错误信息:Function declared as pure, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable
getAge:返回30

整个过程并未消耗gas,并未改变合同的状态值,age始终是30

结果如下
avatar

bool类型实战

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

contract booltest{
bool a;
uint x = 200;
uint y = 300;


function getBool() public view returns(bool)
{
return a;
}

function getBool2() public view returns(bool)
{
return !a;
}

function getBool3() public view returns(bool)
{
return (x == y) && true;
}

function getBool4() public view returns(bool)
{
return (x == y) || true;
}
}

结果
avatar