26个版本 (9个重大更新)

0.11.0 2019年8月15日
0.9.0 2019年7月26日

#44 in #修改

Download history 7/week @ 2024-03-28 7/week @ 2024-04-04 4/week @ 2024-04-11 1/week @ 2024-04-18 1/week @ 2024-04-25 2/week @ 2024-05-16 2/week @ 2024-05-23 4/week @ 2024-06-06 4/week @ 2024-06-13 9/week @ 2024-06-27 88/week @ 2024-07-04

每月 97 次下载
6 crate 中使用 6 (直接使用 3 个)

Apache-2.0

75KB
2K SLoC

bm

Crates.io Docs

支持默克尔化、反默克尔化和原地树修改的二进制默克尔树实现。

  • 符合SimpleSerialize (ssz) 规范。
  • 支持垃圾回收。

概念

我们区分了 Intermediate 值和 End 值,以便实现能够更好地处理预图像攻击。

  • Intermediate:具有两个直接子节点 leftright 的节点。
  • End:没有子节点的节点。

后端

bm 提供了两个基本后端

  • InMemoryBackend:将所有默克尔节点存储在内存中的后端。
  • NoopBackend:丢弃任何 set 操作,并在任何 get 操作上返回错误。如果你只对默克尔根感兴趣,但实际上不需要默克尔树,这很有用。

原地树修改

你可以使用 bm 库进行原地树修改。要使用符合ssz规范的变体,在创建后端时选择 new_with_inherited_empty,并将 ListPackedList 的最大长度设置为一个合适的值。

  • Raw:允许直接操作通用默克尔索引的原始二进制默克尔树。
  • List:可变大小的向量列表。
  • Vector:固定大小的元组列表。
  • PackedList:打包的可变大小向量列表。
  • PackedVector:打包的固定大小元组列表。

默克尔化

你可以使用 bm-le 库进行默克尔化。它与ssz兼容,并在某些环境中添加了一些扩展以使其更好地工作。如果你只对默克尔根感兴趣,请使用 tree_root 函数。否则,请使用 IntoTree 特性。

为了默克尔化向量和列表,请使用 FixedVecVariableVec 包装类型。为了默克尔化位向量位列表,请使用 FixedVec<bool>VariableVec<bool>

反默克尔化

由于某些信息在类型上不可用(例如向量的长度和向量以及列表的最大长度),我们使用了三个特性来支持去梅克尔化 —— FromTreeFromListTreeFromVectorTree

基本用法

有关基本用法示例,请参阅 tests/ssz.rs

依赖关系

~295–740KB
~17K SLoC