merkle-tree-stream

Crates.iomerkle-tree-stream
lib.rsmerkle-tree-stream
version0.12.1
sourcesrc
created_at2018-02-24 00:10:46.569838
updated_at2020-07-09 21:24:20.899118
descriptionA stream that generates a merkle tree based on the incoming data.
homepage
repositoryhttps://github.com/datrs/merkle-tree-stream
max_upload_size
id52580
size72,780
Maintainers (github:datrs:maintainers)

documentation

https://docs.rs/merkle-tree-stream

README

merkle-tree-stream

crates.io version build status downloads docs.rs docs

A stream that generates a merkle tree based on the incoming data. Adapted from mafintosh/merkle-tree-stream.

Why?

Signatures & integrity checks are part of what makes Dat a great protocol. Each chunk that passes through the system is hashed and made part of a tree of hashes. We end up creating hashes of hashes thanks to flat-tree, which in the end allows us to validate our complete data set.

This module is only needed to create new Dat archives, but not to read them.

Usage

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);
}

Custom Node or Hash types

If you have a specific need for a Node type that is not covered by the DefaultNode type, you can define your own by implementing the Node trait and the appropriate From<NodeParts<Self::Hash>> trait for your new type. You can use the DefaultNode implementation as a guide.

Installation

$ cargo add merkle-tree-stream

License

MIT OR Apache-2.0

Commit count: 96

cargo fmt