#hash #bitcoin #digest #satsnet #byte-slice #serialization #crypto

no-std satsnet_hashes

Hash functions used by the rust-bitcoin eccosystem

2 releases

0.14.1 Sep 10, 2024
0.14.0 Sep 10, 2024

#500 in Algorithms

Download history 299/week @ 2024-09-09 64/week @ 2024-09-16 33/week @ 2024-09-23 46/week @ 2024-09-30

442 downloads per month
Used in 4 crates (2 directly)

CC0 license

150KB
3K SLoC

Rust hashes library.

This is a simple, no-dependency library which implements the hash functions needed by Bitcoin. These are SHA256, SHA256d, and RIPEMD160. As an ancillary thing, it exposes hexadecimal serialization and deserialization, since these are needed to display hashes anway.

Commonly used operations

Hashing a single byte slice or a string:

use satsnet_hashes::sha256;
use satsnet_hashes::Hash;

let bytes = [0u8; 5];
let hash_of_bytes = sha256::Hash::hash(&bytes);
let hash_of_string = sha256::Hash::hash("some string".as_bytes());

Hashing content from a reader:

use satsnet_hashes::sha256;
use satsnet_hashes::Hash;

#[cfg(std)]
let mut reader: &[u8] = b"hello"; // in real code, this could be a `File` or `TcpStream`
let mut engine = sha256::HashEngine::default();
std::io::copy(&mut reader, &mut engine)?;
let hash = sha256::Hash::from_engine(engine);

#[cfg(not(std))]

Hashing content by std::io::Write on HashEngine:

use satsnet_hashes::sha256;
use satsnet_hashes::Hash;
use std::io::Write;

#[cfg(std)]
let mut part1: &[u8] = b"hello";
let mut part2: &[u8] = b" ";
let mut part3: &[u8] = b"world";
let mut engine = sha256::HashEngine::default();
engine.write_all(part1)?;
engine.write_all(part2)?;
engine.write_all(part3)?;
let hash = sha256::Hash::from_engine(engine);

#[cfg(not(std))]

Dependencies

~125–460KB