定长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) 当前区块矿工的地址