数值类型
solidity中常用的基本数值类型(value types)有以下几种
- uint: 正整数,可以通过添加数字的方式声明取值范围。 uint8,16,…256, 以8为步长, 默认是 uint256 [0 - 2256 - 1]。
- int: 整数可以为负数。 int8,16,…256, 以8为步长, 默认是int256 [-2256 ~ +2256-1]
- string: 字符串,实际是bytes数组。
- boolean: 布尔类型,true/false
- address: solidity特有的数据类型,以0x开头的20个字节用来声明以太坊地址,比如0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9
- bytes:声明字节,bytes1,2,3…32
常用的引用类型(reference types)有
- struct: 结构体,类似于类的定义和使。可以包含不同的数据类型。
- array: 数组。默认是动态数组,长度不固定。当然也可以声明固定长度的数组,比如
People[3] public threePeople
- mapping: 映射。可用来定义key, value的映射。
变量类型
Solidity中有三种变量类型:状态变量,局部变量,全局变量
- 状态变量: 在合约函数外声明的变量,在函数内更改。存储在区块链的内存里,gas的消耗较高。
- 局部变量:函数执行过程中的变量,不上链,gas消耗较低。
- 全局变量:全局范围工作的变量,不上链,都是solidity预留关键字,可以在函数内不声明直接使用,比如
msg.sender
,block.number
数据位置
Solidity有可以声明数据存储的位置: storage
, memory
, calldata
storage
: 合约里的状态变量默认都是storage,存储在链上memory
: 函数里的参数和临时变量存在memory, 不上链calldata
: 跟memory一样,唯一区别是calldata不能修改immutable,一般用于函数参数。
这里有一个节省gas的小技巧: 如果在函数中频繁的对状态变量进行读写操作的话,可以将状态变量赋给一个memory
变量,因为读写操作比较耗费gas,具体多少可以查阅执行的机器指令来得出,跟别的指令相比,SLOAD
和SSTORE
还是非常昂贵的操作。
完整的机器指令gas消耗表可以参考这里: EVM opcodes