#merkle-tree #tree-hash #stream #data-integrity #generate #incoming #node

merkle-tree-stream

根据传入数据生成梅克尔树的流

18 个版本 (11 个破坏性版本)

0.12.1 2020年7月9日
0.12.0 2020年3月3日
0.11.0 2020年2月18日
0.10.0 2019年7月18日
0.1.1 2018年3月16日

#577 in 密码学

Download history 24/week @ 2024-03-13 32/week @ 2024-03-20 52/week @ 2024-03-27 189/week @ 2024-04-03 47/week @ 2024-04-10 33/week @ 2024-04-17 44/week @ 2024-04-24 786/week @ 2024-05-01 958/week @ 2024-05-08 634/week @ 2024-05-15 654/week @ 2024-05-22 228/week @ 2024-05-29 109/week @ 2024-06-05 196/week @ 2024-06-12 471/week @ 2024-06-19 213/week @ 2024-06-26

每月1,046次下载
6 个crate中使用 (通过 hypercore)

MIT/Apache

24KB
204

merkle-tree-stream

crates.io version build status downloads docs.rs docs

根据传入数据生成梅克尔树的流。改编自 mafintosh/merkle-tree-stream

为什么?

签名和完整性检查是 Dat 协议出色的组成部分。每个通过系统的数据块都会被哈希并成为哈希树的组成部分。通过 flat-tree,我们最终能够验证我们的整个数据集,从而创建出哈希的哈希。

此模块仅用于创建新的 Dat 归档,而不用于读取。

使用方法

extern crate merkle_tree_stream;
extern crate rust_sodium;

use merkle_tree_stream::{HashMethods, DefaultNode, MerkleTreeStream, Node,
                        PartialNode};
use rust_sodium::crypto::hash::sha256;
use std::sync::Arc;

struct H;
impl HashMethods for H {
  type Node = DefaultNode;
  type Hash = Vec<u8>;

  fn leaf(&self, leaf: &PartialNode, _roots: &[Arc<Self::Node>]) -> Self::Hash {
    let data = leaf.as_ref().unwrap();
    sha256::hash(&data).0.to_vec()
  }

  fn parent(&self, a: &Self::Node, b: &Self::Node) -> Self::Hash {
    let mut buf = Vec::with_capacity(a.hash().len() + b.hash().len());
    buf.extend_from_slice(a.hash());
    buf.extend_from_slice(b.hash());
    sha256::hash(&buf).0.to_vec()
  }
}

fn main() {
  let roots = Vec::new();
  let mut mts = MerkleTreeStream::new(H, roots);
  let mut nodes = vec![];
  mts.next(b"hello", &mut nodes);
  mts.next(b"hashed", &mut nodes);
  mts.next(b"world", &mut nodes);
  println!("nodes {:?}", nodes);
}

自定义 NodeHash 类型

如果您需要一个不是由 DefaultNode 类型覆盖的特定 Node 类型,您可以定义自己的类型,通过实现 Node 特性和为您的新类型适当的 From<NodeParts<Self::Hash>> 特性。您可以将 DefaultNode 实现作为指导。

安装

$ cargo add merkle-tree-stream

许可证

MIT OR Apache-2.0

依赖关系

~26KB