当我们谈论区块链时,常常会不自觉地将其与传统数据库进行类比,这种类比有助于理解,但实际上,以太坊(以及大多数区块链)所使用的技术与传统数据库在理念、架构和实现上有着本质的区别,简单回答“以太坊使用什么数据库”可能会引起误解,因为它并非依赖我们通常所说的关系型数据库(如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和
