mirror of
				https://github.com/0glabs/0g-storage-node.git
				synced 2025-11-03 16:17:27 +00:00 
			
		
		
		
	
				* Use inner lock in storage.
* Remove mut.
* Remove async lock for storage.
* Fix tests and warnings.
* Use spawn_blocking for storage task.
* Fix clippy.
* Finalize the new tx at last.
* Revert "Finalize the new tx at last."
This reverts commit 
		
	
					 | 
			||
|---|---|---|
| .. | ||
| benches | ||
| examples | ||
| src | ||
| Cargo.toml | ||
| clippy.toml | ||
| README.md | ||
merkle
merkle is a lightweight Rust implementation of a Merkle tree.
Features
- external dependency agnostic
 core::hash::Hashercompatibility- 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 itemstest_xor128.rs: custom hash example xor128test_cmh.rs: custom merkle hasher implementation examplecrypto_bitcoin_mt.rs: bitcoin merkle tree using crypto libcrypto_chaincore_mt.rs: chain core merkle tree using crypto libring_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. 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.