Skip to content

Commit 954e523

Browse files
refactor!: split crates into multiple to isolate breaking changes (#272)
This is a huge refactor that splits things into sparate crates, so that the core crates will receive less breaking changes. It will also reduce the chance to pull in features accidentally that are not desired. The upgrade path will be documented in a later commit.
1 parent 8e14b19 commit 954e523

25 files changed

+577
-518
lines changed

Cargo.toml

Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[workspace]
2-
members = ["derive", "."]
2+
members = ["derive", "derive-impl", ".", "codetable"]
3+
resolver = "2"
34

45
[package]
56
name = "multihash"
@@ -15,56 +16,28 @@ edition = "2021"
1516
rust-version = "1.59"
1617

1718
[features]
18-
default = ["std", "derive", "multihash-impl", "secure-hashes"]
19-
std = ["unsigned-varint/std", "multihash-derive/std", "alloc"]
20-
alloc = ["core2/alloc"]
21-
multihash-impl = ["derive"]
22-
derive = ["multihash-derive"]
23-
arb = ["quickcheck", "rand", "arbitrary"]
24-
secure-hashes = ["blake2b", "blake2s", "blake3", "sha2", "sha3"]
25-
scale-codec = ["parity-scale-codec"]
26-
serde-codec = ["serde", "serde-big-array"]
27-
28-
blake2b = ["blake2b_simd"]
29-
blake2s = ["blake2s_simd"]
30-
identity = []
31-
sha1 = ["digest", "sha-1"]
32-
sha2 = ["digest", "sha-2"]
33-
sha3 = ["digest", "sha-3"]
34-
strobe = ["strobe-rs"]
35-
ripemd = ["ripemd-rs"]
19+
default = ["std"]
20+
std = ["unsigned-varint/std", "alloc"]
21+
alloc = []
22+
arb = ["dep:quickcheck", "dep:rand", "dep:arbitrary"]
23+
scale-codec = ["dep:parity-scale-codec"]
24+
serde-codec = ["serde"] # Deprecated, don't use.
25+
serde = ["dep:serde", "dep:serde-big-array"]
3626

3727
[dependencies]
3828
parity-scale-codec = { version = "3.0.0", default-features = false, features = ["derive"], optional = true }
3929
quickcheck = { version = "1.0.3", optional = true }
4030
rand = { version = "0.8.5", optional = true, features = ["small_rng"] }
4131
serde = { version = "1.0.116", optional = true, default-features = false, features = ["derive"] }
4232
serde-big-array = { version = "0.3.2", optional = true, features = ["const-generics"] }
43-
multihash-derive = { version = "0.8.0", path = "derive", default-features = false, optional = true }
4433
unsigned-varint = { version = "0.7.1", default-features = false }
4534
arbitrary = {version = "1.1.0", optional = true }
4635

47-
blake2b_simd = { version = "1.0.0", default-features = false, optional = true }
48-
blake2s_simd = { version = "1.0.0", default-features = false, optional = true }
49-
blake3 = { version = "1.2.0", default-features = false, optional = true }
50-
digest = { version = "0.10.1", default-features = false, optional = true }
51-
sha-1 = { version = "0.10.0", default-features = false, optional = true }
52-
sha-2 = { version = "0.10.0", default-features = false, optional = true, package = "sha2" }
53-
sha-3 = { version = "0.10.0", default-features = false, optional = true, package = "sha3" }
54-
strobe-rs = { version = "0.7.0", default-features = false, optional = true }
55-
ripemd-rs = { package = "ripemd", version = "0.1.1", optional = true}
56-
5736
core2 = { version = "0.4.0", default-features = false }
5837

5938
[dev-dependencies]
60-
criterion = "0.3.3"
6139
hex = "0.4.2"
6240
serde_json = "1.0.58"
6341
quickcheck = "1.0.3"
6442
rand = "0.8.5"
6543
arbitrary = "1.1.0"
66-
multihash = { path = ".", features = ["sha1", "strobe"] }
67-
68-
[[bench]]
69-
name = "multihash"
70-
harness = false

codetable/Cargo.toml

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
[package]
2+
name = "multihash-codetable"
3+
description = "Default multihash code-table with cryptographically secure hash implementations"
4+
version = "0.1.0"
5+
repository = "https://github.com/multiformats/rust-multihash"
6+
license = "MIT"
7+
edition = "2021"
8+
9+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
10+
11+
[features]
12+
default = ["std"]
13+
std = ["blake2b_simd?/std", "blake2s_simd?/std", "blake3?/std", "digest?/std", "sha-1?/std", "sha2?/std", "sha3?/std", "strobe-rs?/std", "ripemd?/std", "multihash-derive/std", "core2/std"]
14+
sha1 = ["dep:sha-1"]
15+
strobe = ["dep:strobe-rs"]
16+
blake2b = ["dep:blake2b_simd"]
17+
blake2s = ["dep:blake2s_simd"]
18+
identity = []
19+
20+
[dependencies]
21+
blake2b_simd = { version = "1.0.0", default-features = false, optional = true }
22+
blake2s_simd = { version = "1.0.0", default-features = false, optional = true }
23+
blake3 = { version = "1.2.0", default-features = false, optional = true }
24+
digest = { version = "0.10.1", default-features = false, optional = true }
25+
sha-1 = { version = "0.10.0", default-features = false, optional = true }
26+
sha2 = { version = "0.10.0", default-features = false, optional = true }
27+
sha3 = { version = "0.10.0", default-features = false, optional = true }
28+
strobe-rs = { version = "0.7.0", default-features = false, optional = true }
29+
ripemd = { version = "0.1.1", default-features = false, optional = true }
30+
multihash-derive = { version = "0.8.0", path = "../derive", default-features = false }
31+
core2 = { version = "0.4.0", default-features = false }
32+
serde = { version = "1.0.158", features = ["derive"], optional = true }
33+
34+
[dev-dependencies]
35+
hex = "0.4.2"
36+
unsigned-varint = { version = "0.7.1", default-features = false }
37+
criterion = "0.3.3"
38+
rand = "0.8.5"
39+
40+
[[bench]]
41+
name = "multihash"
42+
harness = false
43+
44+
[[test]]
45+
name = "lib"
46+
required-features = ["sha1", "sha2", "sha3", "ripemd", "strobe", "blake2b", "blake2s", "blake3"]

benches/multihash.rs renamed to codetable/benches/multihash.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use criterion::{black_box, criterion_group, criterion_main, Criterion};
22
use rand::Rng;
33

4-
use multihash::{
5-
Blake2b256, Blake2b512, Blake2s128, Blake2s256, Blake3_256, Hasher, Keccak224, Keccak256,
6-
Keccak384, Keccak512, Sha1, Sha2_256, Sha2_512, Sha3_224, Sha3_256, Sha3_384, Sha3_512,
7-
Strobe256, Strobe512,
4+
use multihash_codetable::{
5+
Blake2b256, Blake2b512, Blake2s128, Blake2s256, Blake3_256, Keccak224, Keccak256, Keccak384,
6+
Keccak512, Sha1, Sha2_256, Sha2_512, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Strobe256,
7+
Strobe512,
88
};
9+
use multihash_derive::Hasher;
910

1011
macro_rules! group_digest {
1112
($criterion:ident, $( $id:expr => $hash:ident, $input:expr)* ) => {{

examples/custom_table.rs renamed to codetable/examples/custom_table.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::convert::TryFrom;
22

3-
use multihash::derive::Multihash;
4-
use multihash::{Error, Hasher, MultihashDigest, MultihashGeneric, Sha2_256};
3+
use multihash_codetable::Sha2_256;
4+
use multihash_derive::{Hasher, MultihashDigest};
55

66
// You can implement a custom hasher. This is a SHA2 256-bit hasher that returns a hash that is
77
// truncated to 160 bits.
@@ -19,14 +19,14 @@ impl Hasher for Sha2_256Truncated20 {
1919
}
2020
}
2121

22-
#[derive(Clone, Copy, Debug, Eq, Multihash, PartialEq)]
22+
#[derive(Clone, Copy, Debug, Eq, MultihashDigest, PartialEq)]
2323
#[mh(alloc_size = 64)]
2424
pub enum Code {
2525
/// Example for using a custom hasher which returns truncated hashes
2626
#[mh(code = 0x12, hasher = Sha2_256Truncated20)]
2727
Sha2_256Truncated20,
2828
/// Example for using a hasher with a bit size that is not exported by default
29-
#[mh(code = 0xb219, hasher = multihash::Blake2bHasher::<25>)]
29+
#[mh(code = 0xb219, hasher = multihash_codetable::Blake2bHasher::<25>)]
3030
Blake2b200,
3131
}
3232

examples/manual_mh.rs renamed to codetable/examples/manual_mh.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use multihash::{Code, MultihashDigest};
1+
use multihash_codetable::Code;
2+
use multihash_derive::MultihashDigest;
23

34
/// prefix/multihash generating tool to aid when adding new tests
45
fn prefix_util() {

src/hasher_impl.rs renamed to codetable/src/hasher_impl.rs

Lines changed: 38 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1-
use crate::hasher::Hasher;
2-
3-
#[cfg(feature = "std")]
4-
use std::io;
5-
6-
#[cfg(not(feature = "std"))]
7-
use core2::io;
8-
1+
#[cfg(any(feature = "strobe", feature = "identity", feature = "blake3"))]
92
macro_rules! derive_write {
103
($name:ident) => {
11-
impl<const S: usize> io::Write for $name<S> {
12-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
4+
impl<const S: usize> core2::io::Write for $name<S> {
5+
fn write(&mut self, buf: &[u8]) -> core2::io::Result<usize> {
6+
use multihash_derive::Hasher as _;
7+
138
self.update(buf);
149
Ok(buf.len())
1510
}
1611

17-
fn flush(&mut self) -> io::Result<()> {
12+
fn flush(&mut self) -> core2::io::Result<()> {
1813
Ok(())
1914
}
2015
}
2116
};
2217
}
2318

24-
#[cfg(any(feature = "blake2b", feature = "blake2s"))]
19+
#[cfg(any(feature = "blake2b", feature = "blake2s", feature = "blake3"))]
2520
macro_rules! derive_hasher_blake {
2621
($module:ident, $name:ident) => {
2722
/// Multihash hasher.
@@ -42,7 +37,7 @@ macro_rules! derive_hasher_blake {
4237
}
4338
}
4439

45-
impl<const S: usize> Hasher for $name<S> {
40+
impl<const S: usize> multihash_derive::Hasher for $name<S> {
4641
fn update(&mut self, input: &[u8]) {
4742
self.state.update(input);
4843
}
@@ -67,8 +62,6 @@ macro_rules! derive_hasher_blake {
6762

6863
#[cfg(feature = "blake2b")]
6964
pub mod blake2b {
70-
use super::*;
71-
7265
derive_hasher_blake!(blake2b_simd, Blake2bHasher);
7366

7467
/// 256 bit blake2b hasher.
@@ -80,8 +73,6 @@ pub mod blake2b {
8073

8174
#[cfg(feature = "blake2s")]
8275
pub mod blake2s {
83-
use super::*;
84-
8576
derive_hasher_blake!(blake2s_simd, Blake2sHasher);
8677

8778
/// 256 bit blake2b hasher.
@@ -93,8 +84,6 @@ pub mod blake2s {
9384

9485
#[cfg(feature = "blake3")]
9586
pub mod blake3 {
96-
use super::*;
97-
9887
/// Multihash hasher.
9988
#[derive(Debug)]
10089
pub struct Blake3Hasher<const S: usize> {
@@ -121,7 +110,7 @@ pub mod blake3 {
121110
}
122111
}
123112

124-
impl<const S: usize> Hasher for Blake3Hasher<S> {
113+
impl<const S: usize> multihash_derive::Hasher for Blake3Hasher<S> {
125114
fn update(&mut self, input: &[u8]) {
126115
self.hasher.update(input);
127116
}
@@ -143,7 +132,12 @@ pub mod blake3 {
143132
pub type Blake3_256 = Blake3Hasher<32>;
144133
}
145134

146-
#[cfg(feature = "digest")]
135+
#[cfg(any(
136+
feature = "sha1",
137+
feature = "sha2",
138+
feature = "sha3",
139+
feature = "ripemd"
140+
))]
147141
macro_rules! derive_rustcrypto_hasher {
148142
($module:ty, $name:ident, $size:expr) => {
149143
/// Multihash hasher.
@@ -162,7 +156,7 @@ macro_rules! derive_rustcrypto_hasher {
162156
}
163157
}
164158

165-
impl $crate::hasher::Hasher for $name {
159+
impl ::multihash_derive::Hasher for $name {
166160
fn update(&mut self, input: &[u8]) {
167161
use digest::Digest;
168162
self.state.update(input)
@@ -183,13 +177,15 @@ macro_rules! derive_rustcrypto_hasher {
183177
}
184178
}
185179

186-
impl io::Write for $name {
187-
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
180+
impl core2::io::Write for $name {
181+
fn write(&mut self, buf: &[u8]) -> core2::io::Result<usize> {
182+
use multihash_derive::Hasher as _;
183+
188184
self.update(buf);
189185
Ok(buf.len())
190186
}
191187

192-
fn flush(&mut self) -> io::Result<()> {
188+
fn flush(&mut self) -> core2::io::Result<()> {
193189
Ok(())
194190
}
195191
}
@@ -198,47 +194,37 @@ macro_rules! derive_rustcrypto_hasher {
198194

199195
#[cfg(feature = "sha1")]
200196
pub mod sha1 {
201-
use super::*;
202-
203197
derive_rustcrypto_hasher!(::sha1::Sha1, Sha1, 20);
204198
}
205199

206200
#[cfg(feature = "sha2")]
207201
pub mod sha2 {
208-
use super::*;
209-
210-
derive_rustcrypto_hasher!(sha_2::Sha256, Sha2_256, 32);
211-
derive_rustcrypto_hasher!(sha_2::Sha512, Sha2_512, 64);
202+
derive_rustcrypto_hasher!(::sha2::Sha256, Sha2_256, 32);
203+
derive_rustcrypto_hasher!(::sha2::Sha512, Sha2_512, 64);
212204
}
213205

214206
#[cfg(feature = "sha3")]
215207
pub mod sha3 {
216-
use super::*;
217-
218-
derive_rustcrypto_hasher!(sha_3::Sha3_224, Sha3_224, 28);
219-
derive_rustcrypto_hasher!(sha_3::Sha3_256, Sha3_256, 32);
220-
derive_rustcrypto_hasher!(sha_3::Sha3_384, Sha3_384, 48);
221-
derive_rustcrypto_hasher!(sha_3::Sha3_512, Sha3_512, 64);
222-
223-
derive_rustcrypto_hasher!(sha_3::Keccak224, Keccak224, 28);
224-
derive_rustcrypto_hasher!(sha_3::Keccak256, Keccak256, 32);
225-
derive_rustcrypto_hasher!(sha_3::Keccak384, Keccak384, 48);
226-
derive_rustcrypto_hasher!(sha_3::Keccak512, Keccak512, 64);
208+
derive_rustcrypto_hasher!(::sha3::Sha3_224, Sha3_224, 28);
209+
derive_rustcrypto_hasher!(::sha3::Sha3_256, Sha3_256, 32);
210+
derive_rustcrypto_hasher!(::sha3::Sha3_384, Sha3_384, 48);
211+
derive_rustcrypto_hasher!(::sha3::Sha3_512, Sha3_512, 64);
212+
213+
derive_rustcrypto_hasher!(::sha3::Keccak224, Keccak224, 28);
214+
derive_rustcrypto_hasher!(::sha3::Keccak256, Keccak256, 32);
215+
derive_rustcrypto_hasher!(::sha3::Keccak384, Keccak384, 48);
216+
derive_rustcrypto_hasher!(::sha3::Keccak512, Keccak512, 64);
227217
}
228218

229219
#[cfg(feature = "ripemd")]
230220
pub mod ripemd {
231-
232-
use super::*;
233-
234-
derive_rustcrypto_hasher!(ripemd_rs::Ripemd160, Ripemd160, 20);
235-
derive_rustcrypto_hasher!(ripemd_rs::Ripemd256, Ripemd256, 32);
236-
derive_rustcrypto_hasher!(ripemd_rs::Ripemd320, Ripemd320, 40);
221+
derive_rustcrypto_hasher!(::ripemd::Ripemd160, Ripemd160, 20);
222+
derive_rustcrypto_hasher!(::ripemd::Ripemd256, Ripemd256, 32);
223+
derive_rustcrypto_hasher!(::ripemd::Ripemd320, Ripemd320, 40);
237224
}
238225

226+
#[cfg(feature = "identity")]
239227
pub mod identity {
240-
use super::*;
241-
242228
/// Identity hasher with a maximum size.
243229
///
244230
/// # Panics
@@ -259,7 +245,7 @@ pub mod identity {
259245
}
260246
}
261247

262-
impl<const S: usize> Hasher for IdentityHasher<S> {
248+
impl<const S: usize> multihash_derive::Hasher for IdentityHasher<S> {
263249
fn update(&mut self, input: &[u8]) {
264250
let start = self.i.min(self.bytes.len());
265251
let end = (self.i + input.len()).min(self.bytes.len());
@@ -288,7 +274,6 @@ pub mod identity {
288274

289275
#[cfg(feature = "strobe")]
290276
pub mod strobe {
291-
use super::*;
292277
use strobe_rs::{SecParam, Strobe};
293278

294279
/// Strobe hasher.
@@ -308,7 +293,7 @@ pub mod strobe {
308293
}
309294
}
310295

311-
impl<const S: usize> Hasher for StrobeHasher<S> {
296+
impl<const S: usize> multihash_derive::Hasher for StrobeHasher<S> {
312297
fn update(&mut self, input: &[u8]) {
313298
self.strobe.ad(input, self.initialized);
314299
self.initialized = true;

0 commit comments

Comments
 (0)