#key-value-store #state #blockchain #recent #retrieval #wal #disk

cordwood

Cordwood:非归档区块链键值存储,具有快速最近状态检索

4个版本

0.0.4 2024年2月6日
0.0.3 2024年2月6日
0.0.2 2024年2月6日
0.0.1 2024年2月6日

#12 in #recent

MIT许可证

165KB
3.5K SLoC

注意:此存储库以我在Ava Labs工作时编写的代码部分开始。它完全由我自己从头开始编写,并实现了一个基于我设计的新设计的MVP键值存储。Avalanche社区许可的firewood的代码源自此。由于MIT许可证,我鼓励对此存储库进行开源贡献。我现在可能没有时间专门为此存储库工作,但如果您对此项目感兴趣进行研究/贡献,请随时与我联系。

Firewood的MIT版本已将其包名重命名为Cordwood。众所周知,cordwood是firewood。这是切割成块以燃烧的木材,对于系统设计来说是一个更好的名字。 :)

Cordwood:非归档区块链键值存储,具有快速最近状态检索。

Cordwood是一个嵌入式键值存储,优化用于存储区块链状态。它通过提供极快的读取速度来优先访问最新状态,但也提供了对过去状态的有限视图。它不会像EVM那样将Merkle Patricia Trie (MPT)复制以生成不断增长的tries森林,而是将MPT索引的一个最新版本保留在磁盘上,并对其应用原地更新。这确保了在Cordwood运行过程中数据库大小保持小且稳定。Cordwood最初是为了为EVM提供一个非常快的存储层而构思的,以实现一个快速、完整的EVM系统,并且从零开始做出完全正确的选择,但它也作为任何EVM兼容区块链存储系统的直接替代品,并且适合用于任意数据的认证键值存储的通用用途。

Cordwood是一个从头开始实现的健壮数据库,用于直接存储MPT节点和用户数据。与该领域中的大多数(如果不是所有)解决方案不同,它不是建立在LevelDB/RocksDB等通用KV存储之上。像基于B+-树的存储一样,cordwood直接使用树结构作为磁盘上的索引。因此,没有必要对逻辑MPT进行额外的“模拟”,以将数据结构扁平化,以馈送到对存储的数据一无所知的底层数据库。

Cordwood通过预写日志(WAL)提供操作系统级别的崩溃恢复。WAL保证了数据库的原子性和持久性,同时还提供了“可逆性”:可以选择性地保留部分旧WAL,以便快速回滚到内存中的一些过去版本。在运行存储过程中,新的更改也将贡献到配置的更改窗口(以批量粒度),以零额外成本访问任何过去的版本。

Cordwood的磁盘占用空间比geth更紧凑。它提供两个独立的存储空间,用户可以选择使用其中一个或两个。存储空间中的账户模型部分提供与geth中的StateDB非常相似的功能,它捕获了账户(智能合约)状态的地址-“状态键”风格的二级访问方式。因此,将所有状态存储从EVM实现委托给cordwood需要最少的努力。存储空间的另一部分支持通用的MPT存储,用于任意键和值。当未使用时,没有额外成本。

Cordwood是一个嵌入式键值存储,针对存储区块链状态进行了优化。它优先访问最新状态,通过提供极快的读取速度,但也提供对过去状态的有限视图。它不像EVM那样复制写入,而是对状态树进行原地更改。这确保了在运行cordwood的过程中,数据库大小保持小且稳定。

构建

Cordwood目前仅支持Linux,因为它依赖于Linux内核提供的异步I/O(请参阅libaio)。不幸的是,Docker无法成功模拟libaio依赖的系统调用,因此必须使用Linux或Linux虚拟机来运行cordwood。鼓励增强项目,为其他操作系统提供I/O支持,例如OSX(在该系统中需要使用kqueue进行异步I/O)和Windows。如果您对这样的贡献感兴趣,请与我们联系。

Cordwood是用稳定的Rust编写的,但依赖于Rust nightly工具链进行代码 linting/格式化。

运行

在examples目录中有一些示例,模拟了现实世界的用例。尝试通过命令行运行它们,通过cargo run --release --example simple

测试

cargo test --release

依赖项

~11–19MB
~230K SLoC