学习资源:https://learnblockchain.cn/docs/solidity
https://github.com/OpenZeppelin/openzeppelin-contracts/
view 修饰的函数 ,是constant的别名,只能读取storage变量的值,不能写入。以下表示状态进行了更改:
- 修改状态变量。
- 产生事件(https://solidity-cn.readthedocs.io/zh/develop/contracts.html?highlight=view#events)。
- 创建其它合约(https://solidity-cn.readthedocs.io/zh/develop/control-structures.html#creating-contracts)。
- 使用 selfdestruct。
- 通过调用发送以太币。
- 调用任何没有标记为 view 或者 pure 的函数。
- 使用低级调用。
- 使用包含特定操作码的内联汇编。
pure 修饰的函数 ,不能对storage变量进行读写。以下被认为是从状态中读取:
- 读取状态变量。
- 访问 this.balance 或者 <address>.balance。
- 访问 block,tx, msg 中任意成员 (除 msg.sig 和 msg.data 之外)。
- 调用任何未标记为 pure 的函数。
- 使用包含某些操作码的内联汇编。
constant 常量,意味着不可变化。可以读取状态变量但是不能改变,5.0之后会废除。
以上本地执行均不需要消耗gas
payable 当一个函数被 payable 修饰,表示调用这个函数时,可以附加发送一些 ETH(当然也可以不发)。
没有加 payable 的函数,则没有方法接受 ETH, 附加 ETH 调用会出错。
说明:在5.0之后,address被分成address payable 和 address, 用于区分是否接收金额,都是使用底层call()方法,
不同点是只有payable修饰的才能调用.transfer()和.send() 。
address payable 可以隐式转为 address,address转为address payable 需要先转化为整数类型(如unit160)
address payable[] 可转address[],但是直接数组转换
solidity的内置变量中,一下都是address payable
- msg.sender
- tx.origin
- block.coinbase