定长bytes可以存一些数据,消耗gas比较少

pure/view/payable

包含pure关键字的函数,不能读取也不能写入存储在链上的状态变量

包含view关键字的函数,能读取但也不能写入状态变量

不写pure也不写view,函数既可以读取也可以写入状态变量

包含pureview关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的

数据存储

solidity数据存储位置有三类:storagememorycalldata

不同存储位置的gas成本不同。storage类型的数据存在链上,类似计算机的硬盘,消耗gas多;memorycalldata类型的临时存在内存里,消耗gas少。

  1. storage:合约里的状态变量默认都是**storage**,存储在链上。
  2. memory:函数里的参数和临时变量一般用**memory**,存储在内存中,不上链。
  3. calldata:和**memory类似,存储在内存中,不上链。与memory的不同点在于calldata变量不能修改(immutable**),一般用于函数的参数。

作用域

Solidity中变量按作用域划分有三种,分别是状态变量(state variable),局部变量(local variable)和全局变量(global variable)

状态变量是数据存储在链上的变量,所有合约内函数都可以访问 ,gas消耗高。状态变量在合约内、函数外声明

局部变量是仅在函数执行过程中有效的变量,函数退出后,变量无效。局部变量的数据存储在内存里,不上链,gas低。局部变量在函数内声明

全局变量是全局范围工作的变量,都是solidity预留关键字。他们可以在函数内不声明直接使用

下面是一些常用的全局变量,更完整的列表请看这个链接