diff --git a/Cargo.lock b/Cargo.lock index 2af0f7e70ef29ab57907b85081c558336ac0f201..7eb46ffc6de187d81fd37edb721773d84c5d5523 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -27,6 +27,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a2f58b0bb10c380af2b26e57212856b8c9a59e0925b4c20f4a174a49734eaf7" + [[package]] name = "async-attributes" version = "1.1.2" @@ -243,7 +249,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "cc", "cfg-if 0.1.10", "constant_time_eq", @@ -812,7 +818,7 @@ name = "duniter-dbs" version = "0.1.0" dependencies = [ "anyhow", - "arrayvec", + "arrayvec 0.7.0", "bincode", "byteorder", "chrono", diff --git a/bc-reader/Cargo.toml b/bc-reader/Cargo.toml index d2e09579024c7a67bc54201d6606915e02af690b..bc421b9137303d4f6858d5ee9eb7420ee64d2d36 100644 --- a/bc-reader/Cargo.toml +++ b/bc-reader/Cargo.toml @@ -18,4 +18,4 @@ dubp = { version = "0.53.1", features = ["duniter"] } resiter = "0.4.0" [dev-dependencies] -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } diff --git a/dbs/Cargo.toml b/dbs/Cargo.toml index 6dfe970252e866d740818837d8108f7ab86f0a41..332848dd3f729c9ff242996f0df383f3e8158e6b 100644 --- a/dbs/Cargo.toml +++ b/dbs/Cargo.toml @@ -12,7 +12,7 @@ edition = "2018" path = "src/lib.rs" [dependencies] -arrayvec = "0.5.1" +arrayvec = "0.7" bincode = "1.2.1" byteorder = "1.3.4" chrono = { version = "0.4.15", optional = true } @@ -25,7 +25,7 @@ paste = "1.0.2" rand = "0.8.3" serde = { version = "1.0.105", features = ["derive"] } serde_json = "1.0.53" -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } thiserror = "1.0.20" uninit = "0.4.0" zerocopy = "0.3.0" diff --git a/dbs/src/keys/blockstamp.rs b/dbs/src/keys/blockstamp.rs index 6b4a8df39c85170914561346d9e6b16349b89f44..aa2e23c5ce1edb509d8ba47f0671f5e162242faf 100644 --- a/dbs/src/keys/blockstamp.rs +++ b/dbs/src/keys/blockstamp.rs @@ -28,7 +28,7 @@ impl kv_typed::prelude::FromBytes for BlockstampKeyV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - let blockstamp_strs: ArrayVec<[&str; 2]> = std::str::from_utf8(bytes) + let blockstamp_strs: ArrayVec<&str, 2> = std::str::from_utf8(bytes) .map_err(|e| CorruptedBytes(e.to_string()))? .split('-') .collect(); diff --git a/dbs/src/keys/pubkey_and_sig.rs b/dbs/src/keys/pubkey_and_sig.rs index 47a14c90c0e2ec5805cd09cc272ba04c5c519d9f..9c6a01091abbe0e1e13cbdf59e26780cf5a03ec7 100644 --- a/dbs/src/keys/pubkey_and_sig.rs +++ b/dbs/src/keys/pubkey_and_sig.rs @@ -42,7 +42,7 @@ impl kv_typed::prelude::FromBytes for PubKeyAndSigV1 { if raw_str == "ALL" { Ok(PubKeyAndSigV1::all()) } else { - let array_str: ArrayVec<[&str; 2]> = raw_str.split(':').collect(); + let array_str: ArrayVec<&str, 2> = raw_str.split(':').collect(); let pubkey = PublicKey::from_base58(array_str[0]).map_err(|e| CorruptedBytes(e.to_string()))?; let sig = diff --git a/dbs/src/keys/source_key.rs b/dbs/src/keys/source_key.rs index accb5c9a972212a9f767102bdcfc83a1c724b7ff..fbdb1d6ed55a6c9b51ec0a842b4fc752b7f52bff 100644 --- a/dbs/src/keys/source_key.rs +++ b/dbs/src/keys/source_key.rs @@ -47,7 +47,7 @@ impl kv_typed::prelude::FromBytes for SourceKeyV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - let strs: ArrayVec<[&str; 3]> = std::str::from_utf8(bytes) + let strs: ArrayVec<&str, 3> = std::str::from_utf8(bytes) .map_err(|e| CorruptedBytes(e.to_string()))? .split('-') .collect(); diff --git a/dbs/src/keys/uid.rs b/dbs/src/keys/uid.rs index a5e4bd7dde0f5cb8642dbb2987a4d10b9db8feae..968d7e877ff929f66e2a755aab01fac6a075b6d6 100644 --- a/dbs/src/keys/uid.rs +++ b/dbs/src/keys/uid.rs @@ -18,7 +18,7 @@ use crate::*; const USERNAME_MAX_LEN: usize = 100; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] -pub struct UidKeyV1(pub ArrayString<[u8; USERNAME_MAX_LEN]>); +pub struct UidKeyV1(pub ArrayString<USERNAME_MAX_LEN>); impl AsBytes for UidKeyV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { @@ -32,7 +32,7 @@ impl kv_typed::prelude::FromBytes for UidKeyV1 { fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { let uid_str = std::str::from_utf8(bytes).map_err(|e| CorruptedBytes(e.to_string()))?; Ok(Self( - ArrayString::<[u8; USERNAME_MAX_LEN]>::from_str(uid_str) + ArrayString::<USERNAME_MAX_LEN>::from_str(uid_str) .map_err(|e| CorruptedBytes(e.to_string()))?, )) } @@ -42,9 +42,7 @@ impl FromStr for UidKeyV1 { type Err = arrayvec::CapacityError; fn from_str(source: &str) -> std::result::Result<Self, Self::Err> { - Ok(UidKeyV1(ArrayString::<[u8; USERNAME_MAX_LEN]>::from_str( - source, - )?)) + Ok(UidKeyV1(ArrayString::<USERNAME_MAX_LEN>::from_str(source)?)) } } diff --git a/dbs/src/keys/wallet_conditions.rs b/dbs/src/keys/wallet_conditions.rs index 56af52a2a82b95555acf4934bff7743badcd56bb..d7a8cb7a63200506525861d9ddac664a1e5e1c33 100644 --- a/dbs/src/keys/wallet_conditions.rs +++ b/dbs/src/keys/wallet_conditions.rs @@ -18,7 +18,7 @@ use crate::*; const CONDITIONS_MAX_LEN: usize = 256; #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd)] -pub struct WalletConditionsV1(pub ArrayString<[u8; CONDITIONS_MAX_LEN]>); +pub struct WalletConditionsV1(pub ArrayString<CONDITIONS_MAX_LEN>); impl AsBytes for WalletConditionsV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { @@ -32,7 +32,7 @@ impl kv_typed::prelude::FromBytes for WalletConditionsV1 { fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { let uid_str = std::str::from_utf8(bytes).map_err(|e| CorruptedBytes(e.to_string()))?; Ok(Self( - ArrayString::<[u8; CONDITIONS_MAX_LEN]>::from_str(uid_str) + ArrayString::<CONDITIONS_MAX_LEN>::from_str(uid_str) .map_err(|e| CorruptedBytes(e.to_string()))?, )) } @@ -43,7 +43,7 @@ impl FromStr for WalletConditionsV1 { fn from_str(source: &str) -> std::result::Result<Self, Self::Err> { Ok(WalletConditionsV1( - ArrayString::<[u8; CONDITIONS_MAX_LEN]>::from_str(source)?, + ArrayString::<CONDITIONS_MAX_LEN>::from_str(source)?, )) } } @@ -79,7 +79,9 @@ impl WalletConditionsV2 { impl AsBytes for WalletConditionsV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { let mut buffer = SmallVec::<[u8; 256]>::new(); - bincode::serialize_into(&mut buffer, &self.0).unwrap_or_else(|_| unreachable!()); + bincode_db() + .serialize_into(&mut buffer, &self.0) + .unwrap_or_else(|_| unreachable!()); f(buffer.as_ref()) } } @@ -88,7 +90,7 @@ impl kv_typed::prelude::FromBytes for WalletConditionsV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - Ok(Self(bincode::deserialize(bytes)?)) + Ok(Self(bincode_db().deserialize(bytes)?)) } } diff --git a/dbs/src/lib.rs b/dbs/src/lib.rs index 63d8a82ad9b4898917bd8ab75e75c18f5ec0bdfb..863221c4167376e342274d6c93b12175940f4b6c 100644 --- a/dbs/src/lib.rs +++ b/dbs/src/lib.rs @@ -89,6 +89,7 @@ pub use values::wallet_script_with_sa::WalletScriptWithSourceAmountV1Db; // Crate imports pub(crate) use arrayvec::{ArrayString, ArrayVec}; +pub(crate) use bincode::Options; #[cfg(feature = "explorer")] use chrono::NaiveDateTime; pub(crate) use dubp::common::crypto::bases::b58::ToBase58 as _; @@ -142,3 +143,8 @@ impl SharedDbs<Mem> { }) } } + +// Bincode db configuration +pub fn bincode_db() -> impl bincode::Options { + bincode::options() +} diff --git a/dbs/src/values/block_db.rs b/dbs/src/values/block_db.rs index c288cda97974ec5f519938f1b5bc76a813f8cdd7..2c6c508cb06c7d6f60f71948278ed8b9c90825a1 100644 --- a/dbs/src/values/block_db.rs +++ b/dbs/src/values/block_db.rs @@ -122,7 +122,9 @@ pub struct BlockDbV2(pub dubp::block::DubpBlockV10); impl AsBytes for BlockDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -131,7 +133,9 @@ impl kv_typed::prelude::FromBytes for BlockDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/block_meta.rs b/dbs/src/values/block_meta.rs index 949a644d963971933e917f129aa9adb09dcd9f30..92eaee0934ac0f66b4f6988976043d4ac9a97ff3 100644 --- a/dbs/src/values/block_meta.rs +++ b/dbs/src/values/block_meta.rs @@ -17,7 +17,7 @@ use dubp::block::DubpBlockV10; use crate::*; -const BLOCK_META_SERIALIZED_SIZE: usize = 323; +const BLOCK_META_MAX_SERIALIZED_SIZE: usize = 323; #[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Serialize)] pub struct BlockMetaV2 { @@ -52,8 +52,10 @@ impl BlockMetaV2 { impl AsBytes for BlockMetaV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let mut buffer = [0u8; BLOCK_META_SERIALIZED_SIZE]; - bincode::serialize_into(&mut buffer[..], self).unwrap_or_else(|_| unreachable!()); + let mut buffer = ArrayVec::<u8, BLOCK_META_MAX_SERIALIZED_SIZE>::new(); + bincode_db() + .serialize_into(&mut buffer, self) + .unwrap_or_else(|_| unreachable!()); f(buffer.as_ref()) } } @@ -62,7 +64,7 @@ impl kv_typed::prelude::FromBytes for BlockMetaV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } @@ -91,11 +93,11 @@ mod tests { #[test] fn block_meta_v2_as_bytes() { assert_eq!( - unwrap!(bincode::serialized_size(&BlockMetaV2 { + unwrap!(bincode_db().serialized_size(&BlockMetaV2 { dividend: Some(SourceAmount::new(42, 0)), ..Default::default() })), - BLOCK_META_SERIALIZED_SIZE as u64 + 255 ); let bloc_meta = BlockMetaV2::default(); diff --git a/dbs/src/values/dunp_head.rs b/dbs/src/values/dunp_head.rs index bf42b21a41f07c1d83f67af91c14dda2ff72ddaa..a9b1515085a37c3dfdd62b86f845b65cbaeb875d 100644 --- a/dbs/src/values/dunp_head.rs +++ b/dbs/src/values/dunp_head.rs @@ -94,7 +94,9 @@ mod tests { impl AsBytes for DunpHeadDbV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -103,7 +105,9 @@ impl kv_typed::prelude::FromBytes for DunpHeadDbV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/idty_db.rs b/dbs/src/values/idty_db.rs index 504f79950fb8b96cda2b12d5af30923ac0110c46..688e1f9b6e53874badedf129889960bc702189a4 100644 --- a/dbs/src/values/idty_db.rs +++ b/dbs/src/values/idty_db.rs @@ -23,7 +23,9 @@ pub struct IdtyDbV2 { impl AsBytes for IdtyDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -31,7 +33,7 @@ impl kv_typed::prelude::FromBytes for IdtyDbV2 { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/dbs/src/values/peer_card.rs b/dbs/src/values/peer_card.rs index 15dfaec948e16c397f538748b6a588533a08fe4a..39979f54b3f534b2de79a51d380c10b98942e477 100644 --- a/dbs/src/values/peer_card.rs +++ b/dbs/src/values/peer_card.rs @@ -53,7 +53,9 @@ impl PeerCardDbV1 { impl AsBytes for PeerCardDbV1 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -62,7 +64,9 @@ impl kv_typed::prelude::FromBytes for PeerCardDbV1 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/tx_db.rs b/dbs/src/values/tx_db.rs index 59700b7509b24ee076cc2e8c0977d230c2e4734e..beae0572d9f725192696436dfbfba23d007ac549 100644 --- a/dbs/src/values/tx_db.rs +++ b/dbs/src/values/tx_db.rs @@ -24,7 +24,9 @@ pub struct PendingTxDbV2 { impl AsBytes for PendingTxDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -33,7 +35,9 @@ impl kv_typed::prelude::FromBytes for PendingTxDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/txs.rs b/dbs/src/values/txs.rs index f150673ef91757568e6420cf52db7af5f5c58a41..530506ecd16855be76ff6387b3a195ed1796e9f7 100644 --- a/dbs/src/values/txs.rs +++ b/dbs/src/values/txs.rs @@ -21,7 +21,9 @@ pub struct BlockTxsDbV2(pub SmallVec<[TransactionDocumentV10; 8]>); impl AsBytes for BlockTxsDbV2 { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + let bytes = bincode_db() + .serialize(self) + .unwrap_or_else(|_| unreachable!()); f(bytes.as_ref()) } } @@ -30,7 +32,9 @@ impl kv_typed::prelude::FromBytes for BlockTxsDbV2 { type Err = CorruptedBytes; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(&bytes).map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) + bincode_db() + .deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes))) } } diff --git a/dbs/src/values/utxo.rs b/dbs/src/values/utxo.rs index dc5b60e56de686fd24aa56d376df211f82a80392..2c8bb4b50d200a6682e5c58668d5eaf601a1d18a 100644 --- a/dbs/src/values/utxo.rs +++ b/dbs/src/values/utxo.rs @@ -113,7 +113,9 @@ pub struct BlockUtxosV2Db(pub HashMap<UtxoIdV10, WalletScriptWithSourceAmountV1D impl AsBytes for BlockUtxosV2Db { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -121,7 +123,7 @@ impl kv_typed::prelude::FromBytes for BlockUtxosV2Db { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/dbs/src/values/wallet_script_with_sa.rs b/dbs/src/values/wallet_script_with_sa.rs index 5d40dd95a54b1c3497008040219cfdfd1c09b6d7..251a9646a89dbadb0f4b45b64fab23667ce62cb0 100644 --- a/dbs/src/values/wallet_script_with_sa.rs +++ b/dbs/src/values/wallet_script_with_sa.rs @@ -23,7 +23,9 @@ pub struct WalletScriptWithSourceAmountV1Db { impl AsBytes for WalletScriptWithSourceAmountV1Db { fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&bincode::serialize(&self).unwrap_or_else(|_| unreachable!())) + f(&bincode_db() + .serialize(&self) + .unwrap_or_else(|_| unreachable!())) } } @@ -31,7 +33,7 @@ impl kv_typed::prelude::FromBytes for WalletScriptWithSourceAmountV1Db { type Err = bincode::Error; fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - bincode::deserialize(bytes) + bincode_db().deserialize(bytes) } } diff --git a/tools/kv_typed/Cargo.toml b/tools/kv_typed/Cargo.toml index 8dc44bb571a7b8a48c02693ba4a04d6f787112be..0b8a4a18270c38b27b8a33ab812809bace2a6a58 100644 --- a/tools/kv_typed/Cargo.toml +++ b/tools/kv_typed/Cargo.toml @@ -23,7 +23,7 @@ rayon = { version = "1.3.1", optional = true } regex = { version = "1.3.9", optional = true } serde_json = { version = "1.0.53", optional = true } sled = { version = "0.34.6", optional = true } -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } thiserror = "1.0.20" uninit = "0.4.0" zerocopy = "0.3.0" @@ -36,7 +36,7 @@ required-features = ["leveldb_backend", "sled_backend"] [dev-dependencies] async-std = { version = "1.6.3", features = ["attributes"] } maybe-async = "0.2.0" -smallvec = { version = "1.4.0", features = ["serde", "write"] } +smallvec = { version = "1.6", features = ["serde", "write"] } tempfile = "3.2.0" unwrap = "1.2.1"