当我们谈论以太坊时,常常会将其描述为一个去中心化的世界计算机,一个智能合约平台,支撑这个庞大系统的“数据库”究竟是什么呢?这是一个非常有趣且常见的问题,以太坊并没有采用我们通常意义上所说的那种单一的传统数据库(如MySQL、PostgreSQL或MongoDB),它的数据存储和管理方式更为独特和复杂,是区块链本身状态数据库协同工作的结果。

区块链:以太坊的“账本”与“历史记录”

我们需要理解以太坊最核心的组成部分——区块链,区块链可以看作是一个公开的、分布式的、不可篡改的巨型账本日志数据库,它的主要职责是记录和存储所有发生过的交易历史以及智能合约的代码。

  • 数据结构:区块链由一系列按时间顺序链接起来的“区块”组成,每个区块都包含了一批交易数据、前一区块的哈希值(确保链接的完整性)、时间戳等信息。
  • 核心功能
    • 交易记录:每一笔在以太坊网络上发起的转账、合约调用等都被封装在一个交易中,并被永久记录在区块链上,这构成了以太坊的“历史数据”。
    • 合约代码存储:智能合约的源代码(经过编译后)也作为交易数据的一部分被部署到特定的区块中,并永久存储。
    • 不可篡改性:一旦数据被写入并确认,由于区块链的分布式存储和共识机制(如以太坊从PoW转向PoS),任何单一实体都难以篡改历史记录,确保了数据的可信度。
    • 去中心化:区块链的副本由网络中的全节点(Full Nodes)共同维护,没有单一的中心化控制机构。

从这个角度看,区块链是以太坊的“事实来源”(Source of Truth)和“历史数据库”,它记录了所有曾经发生过的“事件”。

状态数据库:以太坊的“当前快照”与“动态视图”

仅仅有区块链记录所有历史交易是不够的,如果我们想知道一个特定账户当前的余额是多少,或者一个智能合约当前的内部状态是怎样的,难道需要从创世区块开始重新计算所有交易吗?这显然效率极低。

为了解决这个问题,以太坊引入了状态数据库(State Database)的概念,状态数据库保存的是以太坊网络在当前时刻的“快照”,即所有账户和智能合约的状态。

  • 什么是状态? 以太坊的状态由两部分组成:
    • 账户状态:包括外部账户(EOA,用户控制的账户)的余额、nonce值,以及合约账户(智能合约)的代码、存储数据等。
    • 存储状态:特指智能合约内部存储的数据,例如一个投票合约记录的投票者名单和投票结果。
  • 状态数据库的作用
    • 快速查询当前状态:状态数据库使得以太坊节点能够快速响应关于当前余额、合约变量值等查询,而无需遍历整个历史区块链。
    • 状态转换:当一笔新的交易被处理时,它会改变当前的状态(转账会改变两个账户的余额),以太坊节点会根据交易执行状态转换,然后将更新后的状态写入状态数据库。
    • 提高效率:状态数据库极大地提高了以太坊节点的运行效率和响应速度。

以太坊实际使用的状态数据库类型:Merkle Patricia Trie (MPT)

以太坊并没有直接使用像LevelDB或RocksDB这样的通用键值数据库作为状态数据库,而是设计了一种专门的数据结构——Merkle Patricia Trie (Merkle Patricia 前缀树,简称MPT)

  • MPT是什么? MPT是一种结合了Merkle Tree和Patricia Trie优化的数据结构。
    • 随机配图