solidity数据结构
数据结构
基础类型
- bool:布尔类型
- int / uint:整数类型
- address:地址类型
- bytes1 到 bytes32:固定大小字节数组
- enum:枚举类型
引用类型
array
定长数组(Fixed-size Array):
1 | uint[5] public fixedArray; // 长度固定为5 |
特点:
长度在声明时确定
长度永远不可改变
所有元素初始化为默认值(数字类型为0)
不能使用push或pop方法
动态数组(Dynamic Array):
1 | uint[] public dynamicArray; // 长度可变 |
特点:
长度可以动态改变
可以使用push添加元素
可以使用pop删除最后一个元素
length是可变属性
string
struct
mapping
注意事项
solidity 里面的mapping和java,python这些常用语言的区别是没有迭代器,所以对mapping的迭代需要优化的代码去维护。参考下投票相关的代码,需要另外的字段来辅助实现,而不能通过新生成的对象直接替换,或者通过迭代器来实现
1 | contract Vote{ |
bytes
优化
为什么uint256最常用
既然有uint8、uint16等更小的类型,为什么不用它们来节省空间?
答案:EVM的设计特性
以太坊虚拟机(EVM)是按照256位设计的,这意味着:
EVM原生处理256位数据:EVM内部的所有操作都是基于256位的
使用较小类型需要额外操作:当使用uint8、uint16等类型时,EVM需要进行额外的截断和转换操作
截断操作消耗更多gas:这些额外操作反而会增加gas消耗
结论:
默认使用 uint256
需要负数时使用 int256
只有在变量打包的时候才需要考虑使用更小的字段,因为更小的字段在变量打包的时候可以节省空间,减少gas