view
可以将函数声明为 view
类型,这种情况下要保证不修改状态。
下面的语句被认为是修改状态:
- 修改状态变量。
- 产生事件。
- 创建其它合约。
- 使用 selfdestruct。
- 通过调用发送以太币。
- 调用任何没有标记为 view 或者 pure 的函数。
- 使用低级调用。
- 使用包含特定操作码的内联汇编。
pure
Pure 纯函数,比view更加纯粹
函数可以声明为 pure
,在这种情况下,承诺不读取也不修改状态变量。
特别是,应该可以在编译时确定一个 pure
函数,它仅处理输入参数和 msg.data
,对当前区块链状态没有任何了解。 读取constant,依然视作pure。
除了上面解释的状态修改语句列表之外,以下被认为是读取状态:
- 读取状态变量。
- 访问 address(this).balance 或者 <address>.balance。
- 访问 block,tx, msg 中任意成员 (除 msg.sig 和 msg.data 之外)。
- 调用任何未标记为 pure 的函数。
- 使用包含某些操作码的内联汇编。
- 读取
immutable
变量