25 releases (13 breaking)

✓ Uses Rust 2018 edition

new 0.17.0 Mar 25, 2020
0.16.3 Feb 24, 2020
0.14.0 Dec 9, 2019
0.13.0 Nov 26, 2019
0.7.1 Jul 1, 2019

#23 in Cryptography

Download history 385/week @ 2019-12-02 477/week @ 2019-12-09 240/week @ 2019-12-16 115/week @ 2019-12-23 84/week @ 2019-12-30 266/week @ 2020-01-06 527/week @ 2020-01-13 159/week @ 2020-01-20 187/week @ 2020-01-27 236/week @ 2020-02-03 350/week @ 2020-02-10 548/week @ 2020-02-17 566/week @ 2020-02-24 312/week @ 2020-03-02 391/week @ 2020-03-09 567/week @ 2020-03-16

1,548 downloads per month
Used in 5 crates (via storage-proofs)

BSD-3-Clause

235KB
5K SLoC

merkle

Build Status Issues License

merkle is a lightweight Rust implementation of a Merkle tree.

Features

  • external dependency agnostic
  • std::hash::Hasher compatibility
  • standard types hasher implementations
  • #[derive(Hashable)] support for simple struct
  • customizable merkle leaf/node hashing algorithm
  • support for custom hash types (e.g. [u8; 16], [u64; 4], [u128; 2], struct)
  • customizable hashing algorithm
  • linear memory layout, no nodes on heap
  • buildable from iterator, objects or hashes
  • certificate transparency style merkle hashing support
  • SPV included

Documentation

Documentation is available.

Examples

  • test_sip.rs: algorithm implementation example for std sip hasher, u64 hash items
  • test_xor128.rs: custom hash example xor128
  • test_cmh.rs: custom merkle hasher implementation example
  • crypto_bitcoin_mt.rs: bitcoin merkle tree using crypto lib
  • crypto_chaincore_mt.rs: chain core merkle tree using crypto lib
  • ring_bitcoin_mt.rs: bitcoin merkle tree using ring lib

Quick start

extern crate crypto;
extern crate merkletree;

use std::fmt;
use std::hash::Hasher;
use std::iter::FromIterator;
use crypto::sha3::{Sha3, Sha3Mode};
use crypto::digest::Digest;
use merkletree::hash::{Algorithm, Hashable};
use merkletree::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());
}

Bug Reporting

Please report bugs either as pull requests or as issues in the issue tracker. merkle has a full disclosure vulnerability policy. Please do NOT attempt to report any security vulnerability in this code privately to anybody.

License

See LICENSE.

Dependencies

~2.5–5MB
~117K SLoC