定长bytes
可以存一些数据,消耗gas
比较少
pure/view/payable
包含pure
关键字的函数,不能读取也不能写入存储在链上的状态变量
包含view
关键字的函数,能读取但也不能写入状态变量
不写pure
也不写view
,函数既可以读取也可以写入状态变量
包含pure
跟view
关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的
solidity数据存储位置有三类:storage
,memory
和calldata
。
不同存储位置的gas
成本不同。storage
类型的数据存在链上,类似计算机的硬盘,消耗gas
多;memory
和calldata
类型的临时存在内存里,消耗gas
少。
storage
:合约里的状态变量默认都是**storage
**,存储在链上。memory
:函数里的参数和临时变量一般用**memory
**,存储在内存中,不上链。calldata
:和**memory
类似,存储在内存中,不上链。与memory
的不同点在于calldata
变量不能修改(immutable
**),一般用于函数的参数。Solidity
中变量按作用域划分有三种,分别是状态变量(state variable),局部变量(local variable)和全局变量(global variable)
状态变量是数据存储在链上的变量,所有合约内函数都可以访问 ,gas
消耗高。状态变量在合约内、函数外声明
局部变量是仅在函数执行过程中有效的变量,函数退出后,变量无效。局部变量的数据存储在内存里,不上链,gas
低。局部变量在函数内声明
全局变量是全局范围工作的变量,都是solidity
预留关键字。他们可以在函数内不声明直接使用
下面是一些常用的全局变量,更完整的列表请看这个链接:
blockhash(uint blockNumber)
: (bytes32
)给定区块的哈希值 – 只适用于256最近区块, 不包含当前区块。block.coinbase
: (address payable
) 当前区块矿工的地址