logo头像
Snippet 博客主题

solidity数据结构

数据结构

基础类型

  1. bool:布尔类型
  2. int / uint:整数类型
  3. address:地址类型
  4. bytes1 到 bytes32:固定大小字节数组
  5. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
contract Vote{
// 用户投票数
mapping(address => uint256) private _userVote;
address[] private _voters;
// 记录某个地址是否已在当前版本的_voters数组中
mapping(address => bool) private _isInVoters;

//投票给某个用户
function vote(address voter) external {
if(!_isInVoters[voter]){
_voters.push(voter);
_isInVoters[voter]=true;
}
_userVote[voter] += 1;
}

// 返回某个候选人的投票数
function getVotes(address voter) view public returns (uint256) {
return _userVote[voter];
}

// 重置所有候选人的得票数
function resetVotes() external {
uint voterCount = _voters.length;
for(uint i=0;i < voterCount;i++){
_userVote[_voters[i]] = 0;
}
}

}

bytes

优化

为什么uint256最常用

既然有uint8、uint16等更小的类型,为什么不用它们来节省空间?
答案:EVM的设计特性
以太坊虚拟机(EVM)是按照256位设计的,这意味着:
EVM原生处理256位数据:EVM内部的所有操作都是基于256位的
使用较小类型需要额外操作:当使用uint8、uint16等类型时,EVM需要进行额外的截断和转换操作
截断操作消耗更多gas:这些额外操作反而会增加gas消耗

结论:

默认使用 uint256
需要负数时使用 int256
只有在变量打包的时候才需要考虑使用更小的字段,因为更小的字段在变量打包的时候可以节省空间,减少gas