当我们谈论区块链时,常常会不自觉地将其与传统数据库进行类比,这种类比有助于理解,但实际上,以太坊(以及大多数区块链)所使用的技术与传统数据库在理念、架构和实现上有着本质的区别,简单回答“以太坊使用什么数据库”可能会引起误解,因为它并非依赖我们通常所说的关系型数据库(如MySQL、PostgreSQL)或NoSQL数据库(如MongoDB、Cassandra)。
以太坊的“数据”究竟存储在哪里,又是如何组织的呢?
核心概念:状态而非传统数据
我们需要转变一个观念:以太坊的核心不是存储“数据记录”,而是维护一个全球共享的、不断变化的状态,这个状态包含了以太坊网络上的所有信息,
- 账户状态:每个外部账户(EOA)的余额、nonce值,以及合约账户的代码和存储数据。
- 账户余额:每个地址拥有多少以太币。
- 合约存储:智能合约内部变量持久化存储的数据。
- 区块链状态:包括所有区块头、交易列表、收据等。
这个状态可以看作是一个巨大的、分布式的、不可篡改的状态机快照,每一次新的区块被验证并添加到链上,状态就会发生一次“状态转换”,更新到最新的快照。
以太坊的“数据库”实现:LevelDB与RocksDB
既然不是传统数据库,那以太坊节点是如何存储这些庞大的状态数据呢?这就要提到以太坊客户端的实现了。
以太坊的不同客户端实现可能会采用不同的底层存储技术,但最广泛使用的是基于Google的LevelDB及其改进版RocksDB。
-
LevelDB:
- 这是一个由Google开发的快速、轻量级的键值(Key-Value, KV)存储库。
- 它提供了持久化的、有序的KV存储功能,数据以字节串的形式存储。
- 以太坊早期的一些客户端,如Go-Eth客户端的早期版本,就使用了LevelDB作为默认的数据库后端。
-
RocksDB:
- 这是Facebook基于LevelDB开发的一个高性能KV存储引擎,是LevelDB的一个分支。
- RocksDB在LevelDB的基础上做了大量优化,特别是针对多核CPU和高速闪存(SSD)的场景,提供了更高的读写性能和更好的压缩效率。
- 许多主流的以太坊客户端,如Prysm、Lodestar(用于以太坊2.0信标链),以及Go-Eth的最新版本,都将RocksDB作为默认或推荐的数据库后端,这对于需要处理高吞吐量和大量状态数据的以太坊网络来说至关重要。
为什么选择KV数据库而不是关系型数据库?
以太坊的状态本质上就是一个巨大的、复杂的键值映射。
- 键:账户地址
- 值:账户的序列化状态(包括余额、nonce、合约代码哈希、存储根等)
使用KV数据库能够非常直接、高效地存储和查询这种结构化的状态数据,而关系型数据库的表结构、事务ACID特性等,对于以太坊这种追求最终一致性、去中心化和高吞吐量的场景来说,反而显得笨重和不适用。
不仅仅是数据库:Merkle Patricia Trie (MPT)
仅仅有数据库存储还不够,以太坊还需要一种高效的方式来验证状态的完整性,并确保节点间的状态一致性,这就是Merkle Patricia Trie (MPT,梅克尔帕特里夏前缀树)发挥作用的地方。
MPT是一种结合了Merkle树和Patricia Trie(前缀压缩树)数据结构的特殊树。
- Patricia Trie:一种前缀树,能够高效地存储和检索键值对,并且通过共享公共前缀来节省空间。
- Merkle Tree:一种树形数据结构,其中每个叶节点的值都是其对应数据块的哈希,而非叶节点的值是其子节点哈希值的哈希,这使得任何数据的微小改动都会导致根哈希的显著变化(雪崩效应)。
在以太坊中:
- 状态树:存储所有账户的状态。
- 交易树:存储区块中的所有交易。
- 收据树:存储每笔交易执行后的收据(如日志、状态变化等)。
这三个树的根哈希会被包含在区块头中,由于区块头的哈希包含了状态树的根哈希,因此任何人都可以通过计算状态树的根哈希并与区块头中的哈希进行比对,来快速验证某个状态的完整性,而无需下载整个状态数据,这是以太坊实现轻客户端(轻节点)高效验证和状态同步的关键技术。
以太坊的“数据库”是一个组合系统
以太坊并没有使用单一的传统“数据库”,它的数据存储和管理是一个复杂的组合系统:
- 底层存储引擎:主要采用LevelDB或RocksDB这样的高性能键值数据库,负责持久化存储状态数据、区块数据等原始信息。
- 数据组织结构:采用Merkle Patricia Trie (MPT) 来组织和管理状态、交易、收据等数据,确保数据的高效检索、完整性验证和节点间的一致性。

- 分布式共识:通过共识机制(如以太坊2.0的PoS)和P2P网络,确保所有节点对状态的变化达成一致,并共同维护这个全球共享的状态机。
与其说以太坊使用了一个“数据库”,不如说它构建了一个基于密码学、分布式共识和高效数据结构(结合KV存储和MPT)的全球共享状态机,这个“状态机”的“数据库”特性体现在其持久化存储和状态管理能力上,但其核心目标与传统数据库截然不同——它追求的是去中心化、安全、透明和不可篡改,而非传统数据库的强一致性、高并发事务处理和复杂查询能力,理解这一点,才能真正把握以太坊的技术精髓。