mirror of
https://github.com/0glabs/0g-storage-node.git
synced 2024-12-27 08:45:19 +00:00
114 lines
3.1 KiB
Markdown
114 lines
3.1 KiB
Markdown
# merkle
|
|
|
|
[![Build Status](https://travis-ci.org/sitano/merkle_light.svg?branch=master&style=flat)](https://travis-ci.org/sitano/merkle_light)
|
|
[![Issues](http://img.shields.io/github/issues/sitano/merkle.svg?style=flat)](https://github.com/sitano/merkle_light/issues)
|
|
![License](https://img.shields.io/badge/license-bsd3-brightgreen.svg?style=flat)
|
|
[![Crates.io](https://img.shields.io/crates/v/merkle_light.svg)](https://crates.io/crates/merkle_light)
|
|
|
|
*merkle* is a lightweight Rust implementation of a [Merkle tree](https://en.wikipedia.org/wiki/Merkle_tree).
|
|
|
|
## Features
|
|
|
|
- external dependency agnostic
|
|
- `core::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](https://sitano.github.io/merkle_light/merkle_light/index.html).
|
|
|
|
# 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 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());
|
|
}
|
|
```
|
|
|
|
## Bug Reporting
|
|
|
|
Please report bugs either as pull requests or as issues in [the issue
|
|
tracker](https://github.com/sitano/merkle_light). *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](LICENSE).
|