当我们谈论像以太坊这样的区块链时,一个自然而然的问题会浮现:它用什么数据库来存储海量的交易数据和账户信息?毕竟,任何大规模的应用都需要一个可靠、高效的数据库系统来支撑其运行,对于以太坊来说,答案并非一个我们熟知的传统数据库,如MySQL或MongoDB,以太坊的“数据库”是一个独特的、由多个组件构成的混合体,其核心设计哲学与中心化数据库截然不同。

要理解以太坊的存储机制,我们首先需要摒弃“数据库”这个词的传统含义,以太坊没有一个单一的中心化数据库,而是通过一种被称为状态数据库(State Database)的抽象层,结合了多种底层技术来实现其功能。

核心组件: Patricia Merkle Trie(帕特里夏·默克尔前缀树)

以太坊存储的基石是 Patricia Merkle Trie,这是一种专门为区块链设计的、高效且加密安全的树形数据结构,你可以把它想象成一个极其复杂且有序的“账本索引”,它组织了以太坊的两种核心状态:

  1. 账户状态(Account State):存储每个账户的信息,包括余额、 nonce(交易次数)、代码(智能合约代码)和存储根。
  2. 合约存储(Contract Storage):存储智能合约内部变量的数据。

Patricia Merkle Trie 的工作原理和优势如下:

  • 高效查找:作为一种前缀树,它可以快速地插入、查找和删除任意长度的键值对(在以太坊中是“键”到“值”的映射)。
  • 数据完整性:这是它最关键的特性,树的每个节点都会根据其内容计算出一个唯一的哈希值,这个哈希值会作为父节点的数据的一部分,一直向上传递,最终形成整个状态树的根哈希(State Root),这个根哈希被打包进每一个区块头中。
  • 防篡改:任何微小的数据变动,都会导致其所在节点的哈希值改变,并像多米诺骨牌一样一直影响到最终的根哈希,由于每个区块头都包含了前一个区块的哈希,这意味着任何对历史状态的篡改都会导致之后所有区块的哈希失效,从而被网络轻易识别和拒绝,这保证了整个区块链状态的不可篡改性。

从数据结构和完整性保证的角度看,Patricia Merkle Trie 就是以太坊的“核心数据库”

持久化存储:LevelDB

这些庞大的 Patricia Merkle Trie 数据结构本身又存储在哪里呢?以太坊客户端(如Geth、Parity)在本地硬盘上使用了一个高效的键值对数据库来实现持久化存储,而这个数据库就是 LevelDB随机配图