26个版本 (9个重大更新)
0.11.0 | 2019年8月15日 |
---|---|
0.9.0 | 2019年7月26日 |
#44 in #修改
每月 97 次下载
在 6 个 crate 中使用 6 (直接使用 3 个)
75KB
2K SLoC
bm
支持默克尔化、反默克尔化和原地树修改的二进制默克尔树实现。
- 符合SimpleSerialize (ssz) 规范。
- 支持垃圾回收。
概念
我们区分了 Intermediate
值和 End
值,以便实现能够更好地处理预图像攻击。
Intermediate
:具有两个直接子节点left
和right
的节点。End
:没有子节点的节点。
后端
库 bm
提供了两个基本后端
InMemoryBackend
:将所有默克尔节点存储在内存中的后端。NoopBackend
:丢弃任何set
操作,并在任何get
操作上返回错误。如果你只对默克尔根感兴趣,但实际上不需要默克尔树,这很有用。
原地树修改
你可以使用 bm
库进行原地树修改。要使用符合ssz规范的变体,在创建后端时选择 new_with_inherited_empty
,并将 List
、PackedList 的最大长度设置为一个合适的值。
Raw
:允许直接操作通用默克尔索引的原始二进制默克尔树。List
:可变大小的向量列表。Vector
:固定大小的元组列表。PackedList
:打包的可变大小向量列表。PackedVector
:打包的固定大小元组列表。
默克尔化
你可以使用 bm-le
库进行默克尔化。它与ssz兼容,并在某些环境中添加了一些扩展以使其更好地工作。如果你只对默克尔根感兴趣,请使用 tree_root
函数。否则,请使用 IntoTree
特性。
为了默克尔化向量和列表,请使用 FixedVec
和 VariableVec
包装类型。为了默克尔化位向量位列表,请使用 FixedVec<bool>
和 VariableVec<bool>
。
反默克尔化
由于某些信息在类型上不可用(例如向量的长度和向量以及列表的最大长度),我们使用了三个特性来支持去梅克尔化 —— FromTree
、FromListTree
和 FromVectorTree
。
基本用法
有关基本用法示例,请参阅 tests/ssz.rs
。
依赖关系
~295–740KB
~17K SLoC