constant
- constant 用于变量: 表明当前变量不可修改。如果修改,编辑器会报错。
- constant 用于函数: 表明当前函数中,不应该修改状态。即便修改了,编译器也不会报错。
- solc 0.4.17 之后,被废弃。取而代之的是view和pure。
view 和 pure
二者相同之处在于不可修改变量。
view 是用在没有对状态(storage)进行修改的函数上。加了view
的函数,调用时所做的修改不会对合约的状态产生影响,只是起一个查看状态的作用。和 constant 用于函数时功能一样。另外使用 Remix 时,可以方便查看函数返回值。使用view 时,Remix 会把调用函数的输出值放在函数右边显示,而不是在 details 里。
用途在于:
- 告诉你的同伴:这块storage不能乱改。或者告诉其他引用做library的人:这块storage不能乱改。
- 触发events
- 创建其他合约
- 使用selfdestruct
- 通过call方法发送ether
- 通过call方法调用其他没有view修饰的方法
- 使用包含某些操作码的内联汇编。
pure 更加严格,表明它甚至不会读取和存储stroage状态,只能操作方法中本地变量。
用途在于:
- 调用
this.balance
或者<address>.balance
- 访问其他block , tx, msg 的成员变量
- 通过call方法调用其他没有pure修饰的方法
- 使用包含某些操作码的内联汇编。
注意:
阻止函数读取EVM级别的状态是不可能的,只能防止它们写入状态(只能在EVM级别执行view,pure不能)。
payable
表明调用该函数可以接受以太币。当别人向你的合约地址转账时就会触发。
如果合约中不声明payable方法,也会有个匿名方法:fallback function 被触发。
这个方法想要正常工作最少需要2300 gas。
下列操作会花费大于2300gas:
- 存储storage
- 创建合约
- 调用外部方法
- 发送ether