2 个发布版
0.0.2 | 2023年4月21日 |
---|---|
0.0.1 | 2023年4月14日 |
#16 in #wal
285KB
6.5K SLoC
木柴:非归档区块链键值存储,具有超快的最新状态检索。
⚠️ 木柴是alpha级软件,尚未准备好用于生产使用。不要使用木柴存储生产数据。有关木柴使用的更多信息,请参阅许可证。
木柴是一个嵌入式键值存储,优化用于存储区块链状态。它优先访问最新状态,通过提供极快的读取,但也提供对过去状态的有限视图。它不会像其他数据库那样将状态 trie 复制以生成不断增长的 trie 树,而是将最新的 trie 索引保存在磁盘上,并就地更新它。这确保了木柴运行过程中的数据库大小小且稳定。木柴最初是为提供非常快的存储层给 EVM 而构思的,但可用于任何需要经过验证状态的区块链。
木柴是一个从底层构建的健壮数据库,直接存储 trie 节点和用户数据。与该领域中的大多数(如果不是所有)解决方案不同,它不是建立在通用 KV 存储之上,如 LevelDB/RocksDB。像基于 B+-tree 的存储一样,木柴直接使用树结构作为磁盘上的索引。因此,没有必要对逻辑 trie 进行额外的“模拟”,以便将数据结构扁平化以供不知情的数据存储的底层 DB 使用。
木柴通过写入前日志(WAL)提供操作系统级别的崩溃恢复。WAL 保证数据库中的原子性和持久性,但也提供“可逆性”:可以保留部分旧 WAL,以便快速回滚到内存中以恢复存储的某些过去版本。在运行存储时,新的更改还将贡献到配置的更改窗口(以批处理粒度),无需任何额外成本即可访问任何过去版本。
木柴提供了两个隔离的存储空间,用户可以同时或选择性使用。存储的账户模型部分提供了类似于geth中的StateDB的功能,它捕获了账户(智能合约)状态的地址-“状态键”的两级访问方式。因此,将所有状态存储从EVM实现委托到木柴上需要做的工作很少。存储的另一个部分支持通用的trie存储,用于任意键和值。当未使用时,没有额外的成本。
许可证
firewood由生态系统许可证授权。更多信息请参阅LICENSE文件。
库仓
以下库仓存储在此存储库中,以便在不要求上游批准的情况下进行修改
这些库仓在firewood的生产发布之前将被大量修改或删除。如果保留,所有更改都将向上游共享。
路线图
绿色里程碑
这个里程碑将专注于额外的代码清理,包括支持对特定修订版的并发访问,以及清理基本读取器和写入器接口,以保持一致的读写语义。
- 在允许额外批次提交的同时,将读取器固定到特定修订版,以支持对过去一致状态的并行读取。修订版通过根哈希唯一标识。
- 将读取器固定到特定修订版,以便未来的提交或其他操作不会看到任何更改。
- 能够在未提交的批次中进行读写操作。未提交的更改不会显示给任何其他并发读取器。
熟成里程碑
这个里程碑将添加对提案的支持,包括提案的未来分支,并使用缓存来提高提交这些分支的效率。
- 能够针对现有的已提交修订版提出批次,或针对任何现有的已提出修订版提出批次。
- 能够快速提交已提出的批次。请注意,这会无效化所有其他不是提交的提案批次的子提案。
干燥里程碑
这个里程碑的重点是支持与其他实例的同步,以复制状态。还应为此里程碑开发同步库。
- 支持使用相应的范围证明复制完整状态,以验证数据的正确性。
- 支持从上次同步点复制增量状态,并使用相应的范围证明验证数据的正确性。
- 对范围证明的大小以及键进行限制,以使客户端的同步更容易。
构建
firewood目前仅限于Linux,因为它依赖于Linux内核提供的异步I/O(请参阅libaio
)。不幸的是,Docker无法成功模拟libaio
依赖的syscalls,因此必须使用Linux或Linux VM来运行firewood。鼓励通过为其他操作系统(如OSX(其中需要使用kqueue
进行异步I/O)和Windows)提供I/O支持来增强项目。如果您对此类贡献感兴趣,请与我们联系。
运行
在examples目录中有几个示例,模拟真实世界的用例。尝试通过命令行运行它们,通过cargo run --release --example simple
。
要将firewood集成到自定义VM或其他项目中,请参阅firewood-connection,以了解通过自定义消息传递使用firewood的简单方法。
发布
请参阅发布文档以获取有关如何发布木柴的详细信息。
命令行界面(CLI)
Firewood附带了名为fwdctl
的命令行工具,它允许您创建并与Firewood数据库的本地实例进行交互。更多信息,请参阅fwdctl README。
测试
cargo test --release
依赖项
~12–22MB
~293K SLoC