8 个版本 (4 个破坏性更新)
0.5.2 | 2023年10月27日 |
---|---|
0.5.1 | 2023年10月12日 |
0.5.0 | 2023年6月28日 |
0.4.1-rc.0 | 2023年6月23日 |
0.1.0 | 2023年4月26日 |
#161 in 神奇豆子
每月下载量 220 次
在 8 个包中使用(直接使用 2 个)
39KB
824 行
dusk-merkle
一个稀疏的默克尔树,其高度和度是参数化的。
Height 0 h
/ \
/ \
/ \
/ \
/ \
Height 1 h h
/ \ / \
/ \ / \
Height 2 h x h h
/ \ / \ / \
Height 3 h x x h h h
Position 0 5 6 7
Aggregate
特质定义了如何从其子节点计算父节点。对子节点的聚合方式没有限制,可以使用哈希函数或任何其他自定义聚合。空子树(在上面的树中表示为 x
)用来自 Aggregate
的常量 EMPTY_SUBTREE
填充。
以下是一个父节点是其子节点总和的例子
用法
use dusk_merkle::{Tree, Aggregate};
#[derive(Debug, Clone, Copy, PartialEq)]
struct U8(u8);
impl From<u8> for U8 {
fn from(n: u8) -> Self {
Self(n)
}
}
const EMPTY_ITEM: U8 = U8(0);
impl Aggregate<A> for U8 {
const EMPTY_SUBTREE: U8 = EMPTY_ITEM;
fn aggregate(items: [&Self; A]) -> Self
{
items.into_iter().fold(U8(0), |acc, c| U8(acc.0 + c.0))
}
}
// Set the height and arity of the tree.
const H: usize = 3;
const A: usize = 2;
let mut tree = Tree::<U8, H, A>::new();
// No elements have been inserted so the root is the empty subtree.
assert_eq!(*tree.root(), U8::EMPTY_SUBTREE);
tree.insert(4, 21);
tree.insert(7, 21);
// After elements have been inserted, the root will be modified.
assert_eq!(*tree.root(), U8(42));
包含一个使用 blake3
哈希算法实现的默克尔树的示例。
包含一个使用 poseidon252
哈希并在 PLONK 中创建零知识证明的默克尔树的另一个实现,作为此工作区 poseidon_merkle
的成员。
基准测试
还包含基准测试,可以使用以下方式运行
对于 blake3 树
cargo bench
对于 poseidon 树
cargo bench -p poseidon-merkle
对于零知识证明的创建
cargo bench -p poseidon-merkle --features zk
这需要夜间的工具链。
实现
在“poseidon-merkle”目录下,您可以找到使用poseidon散列函数进行聚合和plonk在零知识下生成开证明的默克尔树。
许可证
本项目采用Mozilla公共许可证版本2.0授权。有关更多详细信息,请参阅许可证文件。
依赖项
~1.2–2.1MB
~49K SLoC