函数修饰符主要包括
payableviewpure
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; |