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 密码学
每月1,046次下载
在 6 个crate中使用 (通过 hypercore)
24KB
204 行
merkle-tree-stream
根据传入数据生成梅克尔树的流。改编自 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);
}
自定义 Node
或 Hash
类型
如果您需要一个不是由 DefaultNode
类型覆盖的特定 Node
类型,您可以定义自己的类型,通过实现 Node
特性和为您的新类型适当的 From<NodeParts<Self::Hash>>
特性。您可以将 DefaultNode
实现作为指导。
安装
$ cargo add merkle-tree-stream
许可证
MIT OR Apache-2.0
依赖关系
~26KB