#merkle-tree #merkle #tree #hash #structure #data #data-structures

无 std dusk-merkle

实现 Dusk Network 的默克尔树的包

8 个版本 (4 个破坏性更新)

0.5.2 2023年10月27日
0.5.1 2023年10月12日
0.5.0 2023年6月28日
0.4.1-rc.02023年6月23日
0.1.0 2023年4月26日

#161 in 神奇豆子

Download history 46/week @ 2024-04-15 63/week @ 2024-04-22 42/week @ 2024-04-29 49/week @ 2024-05-06 50/week @ 2024-05-13 63/week @ 2024-05-20 71/week @ 2024-05-27 56/week @ 2024-06-03 60/week @ 2024-06-10 43/week @ 2024-06-17 54/week @ 2024-06-24 35/week @ 2024-07-01 29/week @ 2024-07-08 47/week @ 2024-07-15 47/week @ 2024-07-22 97/week @ 2024-07-29

每月下载量 220 次
8 个包中使用(直接使用 2 个)

MPL-2.0 许可证

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