5个版本 (3个重大更新)

0.4.0 2022年6月21日
0.3.1 2017年12月13日
0.3.0 2017年11月30日
0.2.0 2017年11月25日
0.1.0 2017年11月22日

#746 in 加密学

Download history 324/week @ 2024-04-23 232/week @ 2024-04-30 348/week @ 2024-05-07 142/week @ 2024-05-14 173/week @ 2024-05-21 188/week @ 2024-05-28 138/week @ 2024-06-04 105/week @ 2024-06-11 125/week @ 2024-06-18 154/week @ 2024-06-25 78/week @ 2024-07-02 108/week @ 2024-07-09 197/week @ 2024-07-16 145/week @ 2024-07-23 310/week @ 2024-07-30 223/week @ 2024-08-06

每月891次下载
用于 merkle_light_derive

BSD-3-Clause

42KB
815

merkle

Build Status Issues License Crates.io

merkle 是一个轻量级的Rust实现,用于默克尔树

功能

  • 外部依赖无关
  • core::hash::Hasher 兼容性
  • 标准类型哈希实现
  • #[derive(Hashable)] 支持简单的结构体
  • 可定制的默克尔叶/节点哈希算法
  • 支持自定义哈希类型(例如 [u8; 16], [u64; 4], [u128; 2], 结构体)
  • 可定制的哈希算法
  • 线性内存布局,无节点在堆上
  • 可从迭代器、对象或哈希构建
  • 支持证书透明度风格的默克尔哈希
  • 包含SPV

文档

文档可在此处找到

示例

  • test_sip.rs:std sip哈希器的算法实现示例,u64哈希项
  • test_xor128.rs:自定义哈希示例 xor128
  • test_cmh.rs:自定义默克尔哈希器实现示例
  • crypto_bitcoin_mt.rs:使用crypto库的bitcoin默克尔树
  • crypto_chaincore_mt.rs:使用crypto库的chain core默克尔树
  • ring_bitcoin_mt.rs:使用ring库的bitcoin默克尔树

快速开始

extern crate crypto;
extern crate merkle_light;

use std::fmt;
use std::hash::Hasher;
use std::iter::FromIterator;
use crypto::sha3::{Sha3, Sha3Mode};
use crypto::digest::Digest;
use merkle_light::hash::{Algorithm, Hashable};
use merkle_light::merkle::MerkleTree;

pub struct ExampleAlgorithm(Sha3);

impl ExampleAlgorithm {
    pub fn new() -> ExampleAlgorithm {
        ExampleAlgorithm(Sha3::new(Sha3Mode::Sha3_256))
    }
}

impl Default for ExampleAlgorithm {
    fn default() -> ExampleAlgorithm {
        ExampleAlgorithm::new()
    }
}

impl Hasher for ExampleAlgorithm {
    #[inline]
    fn write(&mut self, msg: &[u8]) {
        self.0.input(msg)
    }

    #[inline]
    fn finish(&self) -> u64 {
        unimplemented!()
    }
}

impl Algorithm<[u8; 32]> for ExampleAlgorithm {
    #[inline]
    fn hash(&mut self) -> [u8; 32] {
        let mut h = [0u8; 32];
        self.0.result(&mut h);
        h
    }

    #[inline]
    fn reset(&mut self) {
        self.0.reset();
    }
}

fn main() {
    let mut h1 = [0u8; 32];
    let mut h2 = [0u8; 32];
    let mut h3 = [0u8; 32];
    h1[0] = 0x11;
    h2[0] = 0x22;
    h3[0] = 0x33;

    let t: MerkleTree<[u8; 32], ExampleAlgorithm> = MerkleTree::from_iter(vec![h1, h2, h3]);
    println!("{:?}", t.root());
}

错误报告

请通过拉取请求或问题跟踪器中的问题报告错误。《merkle》具有完整的披露漏洞政策。请勿尝试将任何安全漏洞私下告知任何人。

许可证

请参阅LICENSE

依赖项

~0–4MB
~86K SLoC