17 个版本 (4 个稳定版本)
2.0.1 | 2021年1月27日 |
---|---|
1.0.1 | 2020年11月14日 |
1.0.0 | 2020年4月22日 |
1.0.0-alpha.10 | 2020年3月17日 |
0.2.0 | 2019年6月1日 |
#2150 在 数据库接口 中
56 每月下载量
在 orga 中使用
155KB
3.5K SLoC
merk
高性能 Merkle 键值存储
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
依赖项
~28–38MB
~679K SLoC