以太坊,作为全球第二大加密货币平台以及最具智能合约功能的区块链之一,其强大的能力和灵活性很大程度上归功于其精心设计的底层基本数据结构,这些数据结构不仅是构建区块链账本的基础,更是支撑智能合约执行、状态管理、交易处理等核心功能的骨架,理解这些基本数据结构,是深入掌握以太坊工作原理的关键,本文将对以太坊中几个核心的基本数据结构进行分析。

数组是几乎所有编程语言中最基础的数据结构,以太坊也不例外,在以太坊的上下文中,数组用于存储一系列有序的元素。
uint256[5] 表示包含5个256位无符号整数的数组,访问和修改固定大小数组的元素效率较高。uint256[],可以通过 push() 方法添加元素,通过 pop() 方法移除末尾元素,智能合约中广泛使用动态数组来存储可变数量的数据,如用户地址列表、交易历史记录等。bytes) 的一种特殊形式,用于存储UTF-8编码的文本数据,与数组类似,字符串也分为固定长度 (string,实际上更接近动态字节数组) 和字面量形式,字符串在智能合约中常用于存储合约名称、符号、描述信息或用户输入的文本。映射是以太坊中一种非常强大且常用的数据结构,它实现了键值对(Key-Value Pair)的存储,类似于其他编程语言中的哈希表(Hash Table)或字典(Dictionary)。

mapping(keyType => valueType),keyType 可以是任何内置的值类型(如 uint, address, bytes32 等,但不能是复杂的复合类型如数组或另一个映射),valueType 则可以是包括数组、映射、结构体在内的任意类型。uint 的默认值是 0,bool 的默认值是 false,address 的默认值是 0x000...)。mapping(address => uint256) public balances;)、用户权限 (mapping(address => bool) public isWhitelisted;) 等。结构体允许开发者将不同类型的数据组合成一个单一的、自定义的数据类型,这对于建模复杂的数据实体非常有用。
struct 关键字定义,struct User {
address walletAddress;
uint256 balance;
string username;
bool isActive;
} 地址是以太坊中一种独特且基本的数据类型,它代表一个 20 字节的值,通常用于标识外部拥有账户 (EOA) 或智能合约账户。
.balance(获取地址余额)、.transfer()(发送以太币,会抛出异常)、.send()(发送以太币,返回布尔值)、.call()(低级调用,用于与其他合约交互或发送数据)。字节类型用于存储原始字节数据,在以太坊中处理低级数据、合约交互、加密操作时非常重要。
bytes1, bytes2, ..., bytes32,分别表示 1 到 32 字节的固定长度数组,适用于已知固定大小的数据,如哈希值的前几个字节。bytes,长度可变,最大可达 32MB,类似于 byte[],但 bytes 在存储和 Gas 消耗上更优。"hello",会被隐式转换为 bytes 类型。concat()(拼接)、slice()(切片)、length(获取长度)等。keccak256 的结果)、以及需要处理原始字节数据的场景。枚举是一种用户定义的类型,它允许一个变量是一组预定义的常量值之一,这有助于提高代码的可读性,并限制变量只能取特定的值。
enum 关键字,enum State { Pending, Approved, Rejected } uint8 类型,默认从 0 开始递增赋值。以太坊的基本数据结构——数组、字符串、映射、结构体、地址、字节和枚举——共同构成了智能合约开发和区块链运行的基石,它们各自承担着不同的职责,从简单的数据存储到复杂的状态建模,再到高效的键值查找,无不体现出以太坊在设计上的严谨与高效,深入理解这些数据特性、存储方式、操作方法以及 Gas 消耗影响,对于编写安全、高效、优化的智能合约至关重要,对于任何希望深入研究以太坊底层原理或进行智能合约开发的开发者而言,掌握这些基本数据结构是必不可少的第一步,它们不仅是代码的砖瓦,更是以太坊生态繁荣与创新的底层支撑。