Crates.io | merkle-tree-stream |
lib.rs | merkle-tree-stream |
version | 0.12.1 |
source | src |
created_at | 2018-02-24 00:10:46.569838 |
updated_at | 2020-07-09 21:24:20.899118 |
description | A stream that generates a merkle tree based on the incoming data. |
homepage | |
repository | https://github.com/datrs/merkle-tree-stream |
max_upload_size | |
id | 52580 |
size | 72,780 |
A stream that generates a merkle tree based on the incoming data. Adapted from mafintosh/merkle-tree-stream.
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.
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);
}
Node
or Hash
typesIf 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.
$ cargo add merkle-tree-stream
MIT OR Apache-2.0