sparse_merkle_tree/
blake2b.rs

1use crate::{traits::Hasher, H256};
2use blake2b_rs::{Blake2b, Blake2bBuilder};
3
4const BLAKE2B_KEY: &[u8] = &[];
5const BLAKE2B_LEN: usize = 32;
6const PERSONALIZATION: &[u8] = b"sparsemerkletree";
7
8pub struct Blake2bHasher(Blake2b);
9
10impl Default for Blake2bHasher {
11    fn default() -> Self {
12        let blake2b = Blake2bBuilder::new(BLAKE2B_LEN)
13            .personal(PERSONALIZATION)
14            .key(BLAKE2B_KEY)
15            .build();
16        Blake2bHasher(blake2b)
17    }
18}
19
20impl Hasher for Blake2bHasher {
21    fn write_h256(&mut self, h: &H256) {
22        self.0.update(h.as_slice());
23    }
24    fn write_byte(&mut self, b: u8) {
25        self.0.update(&[b][..]);
26    }
27    fn finish(self) -> H256 {
28        let mut hash = [0u8; 32];
29        self.0.finalize(&mut hash);
30        hash.into()
31    }
32}