0%

solidity | 函数修饰符 payable view pure

函数修饰符主要包括

  • payable
  • view
  • pure

payable

表示一个函数能附加以太币调用。

  • 普通函数
  • 构造函数
  • 回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pragma solidity ^0.4.18;

contract Test{

address owner;

constructor() public payable{
owner = msg.sender;
}

function () public payable{

}

function test() public payable{

}

}

view

viewconstant 等价,但是在 0.5 版本之后,constant 就弃用了。

本地执行不消耗 gas

下面的行为被认为修改了状态

  • 写状态变量
  • 触发事件(events)
  • 创建其他合约
  • call 调用附加以太币
  • 调用了没有任何 pureview 修饰的函数
  • 使用了低级别调用
1
2
3
4
5
6
7
8
9
10
11
pragma solidity ^0.4.18;

contract Test{

uint a;

function f(uint b) public view returns(uint){
return a + b;
}

}

上面的加法并没有改变 a ,所以,不需要花费 gas

如果,没有 view 修饰,则会花费 gas

假设,我们加了 view 但是,修改了状态变量,如下

1
2
3
4
function f(uint b) public view returns(uint){
a = b;
return a;
}

那么,上面的执行的时候,会返回 所给 b 的值,但是,存储在区块链中的 a 是没有变化的。

即, view 只会本地执行。

pure

表示一个纯函数,既不读取状态,也不改变状态。

本地执行不消耗 gas

下面几种情况认为是读取状态

  • 读状态变量
  • 访问了 .balance 属性
  • 访问了 blocktxmsg 成员
    • msg.sigmsg.data 除外
  • 调用了任何没有 pure 修饰的函数
1
2
3
4
5
6
7
8
9
10
11
pragma solidity ^0.4.18;

contract Test{

uint a;

function f(uint b) public pure returns(uint){
return b + 2;
}

}
请我喝杯咖啡吧~