概要
MonadDb 是 Monad 在保持与以太坊完全兼容的同时实现高性能的关键组件。它是一个专为存储,经过验证的区块链数据而设计的定制键值数据库。具体而言,MonadDb 针对在磁盘上高效存储默克尔帕特里夏树 (Merkle Patricia Trie) 节点进行了优化。默克尔帕特里夏树结构化数据库
大多数以太坊客户端使用通用的键值数据库,这些数据库要么以 B 树(例如 LMDB)形式实现,要么以 LSM 树(例如 LevelDB, RocksDB)形式实现。然而,以太坊使用默克尔帕特里夏树 (MPT) 数据结构来存储状态和其他经过认证的字段,如收据和交易。这导致了一个次优的解决方案,即一个数据结构被嵌入到另一个数据结构中。MonadDb 原生实现了帕特里夏树(基数树的一种特定变体)数据结构,无论在磁盘上还是在内存中。尽管有明确的设计倾向,MonadDb 是一个灵活的键值存储,能够存储任何类型的数据。例如,MonadDb 也用于存储 Monad 的区块头和负载。基于页的存储状态
在 MIP-8 中,存储 trie 承诺的是页而不是单个 slot。一页是由 128 个连续存储 slot 组成的连续区域(4096 字节),每个存储叶节点保存对某一页内容的 32 字节承诺,因此 trie 存储的是{page_index, page_commitment} 对。trie 的其他部分保持不变:key 使用 keccak 哈希,分支、扩展和叶节点遵循标准 MPT 规则。读取单个 32 字节 slot 时,本来就会从 SSD 拉取整页,所以承诺现在覆盖的正是一次磁盘读取所对应的单位。
页承诺是一棵仅覆盖该页已占用 slot 的 BLAKE3 Merkle 根。计算它的开销以及针对它的证明大小,与页内实际占用的多少成正比,而不与 4096 字节的页大小成正比。相应的 gas 计价请参见存储页,现有数据库如何迁移请参见 MIP-8 激活与存储页迁移。

