函数修饰符主要包括
payable
view
pure
payable
表示一个函数能附加以太币调用。
- 普通函数
- 构造函数
- 回调函数
1 | pragma solidity ^0.4.18; |
view
view
和 constant
等价,但是在 0.5
版本之后,constant
就弃用了。
本地执行不消耗 gas
。
下面的行为被认为修改了状态
- 写状态变量
- 触发事件(
events
) - 创建其他合约
call
调用附加以太币- 调用了没有任何
pure
和view
修饰的函数 - 使用了低级别调用
1 | pragma solidity ^0.4.18; |
上面的加法并没有改变 a
,所以,不需要花费 gas
。
如果,没有 view
修饰,则会花费 gas
。
假设,我们加了 view
但是,修改了状态变量,如下
1 | function f(uint b) public view returns(uint){ |
那么,上面的执行的时候,会返回 所给 b
的值,但是,存储在区块链中的 a
是没有变化的。
即, view
只会本地执行。
pure
表示一个纯函数,既不读取状态,也不改变状态。
本地执行不消耗 gas
。
下面几种情况认为是读取状态
- 读状态变量
- 访问了
.balance
属性 - 访问了
block
、tx
、msg
成员msg.sig
和msg.data
除外
- 调用了任何没有
pure
修饰的函数
1 | pragma solidity ^0.4.18; |