4 个版本 (2 个稳定版)

新增 2.0.0 2024 年 8 月 24 日
1.0.0 2024 年 7 月 28 日
1.0.0-rc.22024 年 7 月 12 日
1.0.0-rc.12023 年 6 月 26 日

#501密码学 分类中

Download history 98/week @ 2024-07-07 26/week @ 2024-07-14 17/week @ 2024-07-21 271/week @ 2024-07-28 66/week @ 2024-08-04 39/week @ 2024-08-11

396 每月下载量
用于 grovedb

MIT 许可证

1MB
23K SLoC

merk

高性能 Merkle 键值存储

CI codecov Crate API

Merk 是一个加密键值存储 - 更具体地说,它是在 RocksDB(Facebook 对 LevelDB 的分支)之上构建的 Merkle AVL 树。

其优先考虑的是性能和可靠性。虽然 Merk 被设计为区块链的状态数据库,但它也可以在任何需要可审计的键值存储的地方使用。

特性

  • 快速读写 - 与常规 RocksDB 存储相比,读取没有开销,并且写入针对批量操作进行了优化(例如区块链中的区块)。
  • 快速证明生成 - 由于 Merk 实现了 AVL 树而不是 trie,因此它对于创建和验证键范围的证明非常高效。
  • 并发性 - 与大多数其他 Merkle 存储不同,所有操作都利用所有可用的核心,从而提供了巨大的性能提升,并允许节点随着摩尔定律的增长而扩展。
  • 复制 - 该树被优化以高效构建大型块段的证明,允许节点下载整个状态(例如“状态同步”)。
  • 检查点 - Merk 可以在磁盘上创建检查点(在某个时间点的整个存储的不变视图),而不会阻塞,因此没有延迟可用性或活动性。
  • Web 友好 - 由于使用 Rust 编写,因此它可以在浏览器中使用 WebAssembly 运行证明验证代码,允许轻客户端自行验证数据。
  • 适用于任何配置 - 在内存受限的树莓派和强大的验证器上均表现出高性能。

用法

安装

cargo add merk

示例

extern crate merk;
use merk::*;

// load or create a Merk store at the given path
let mut merk = Merk::open("./merk.db").unwrap();

// apply some operations
let batch = [
    (b"key", Op::Put(b"value")),
    (b"key2", Op::Put(b"value2")),
    (b"key3", Op::Put(b"value3")),
    (b"key4", Op::Delete)
];
merk.apply(&batch).unwrap();

状态

Merk 正在被用于 Nomic 比特币侧链。

代码库尚未经过审计,但经过彻底测试,证明是稳定的。

基准测试

基准测试是在一个1M节点的树上进行测量的,每个节点具有16字节的键长度和40字节的价值长度。所有测试都是单线程的(不包括RocksDB后台线程)。

您可以通过运行以下命令自行测试:cargo bench

2017款Macbook Pro

(使用1个Merk线程和4个RocksDB压缩线程)

修剪(不在内存中保留任何状态)

RAM使用量: 平均约20MB,最大约26MB

测试 每秒操作数
随机插入 23,000
随机更新 32,000
随机删除 26,000
随机读取 210,000
随机证明生成 133,000

缓存(所有状态保留在内存中)

RAM使用量: 平均约400MB,最大约1.1GB

测试 每秒操作数
随机插入 58,000
随机更新 81,000
随机删除 72,000
随机读取 1,565,000
随机证明生成 311,000

i9-9900K台式机

(使用1个Merk线程和16个RocksDB压缩线程)

修剪(不在内存中保留任何状态)

RAM使用量: 平均约20MB,最大约26MB

测试 每秒操作数
随机插入 40,000
随机更新 55,000
随机删除 45,000
随机读取 383,000
随机证明生成 249,000

缓存(所有状态保留在内存中)

RAM使用量: 平均约400MB,最大约1.1GB

测试 每秒操作数
随机插入 93,000
随机更新 123,000
随机删除 111,000
随机读取 2,370,000
随机证明生成 497,000

算法细节

这些算法基于AVL,但针对操作批量和从后端存储的随机提取进行了优化。有关算法的更多信息,请参阅此处:https://github.com/nomic-io/merk/blob/develop/docs/algorithms.md

依赖关系

约2-18MB
约221K SLoC