diff --git a/Cargo.lock b/Cargo.lock index 5309957961c6bb11b5651d8959ba806a9b6c10e3..0ddb50e21734877a2a67c213663fc460b5107ec7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -740,6 +740,7 @@ dependencies = [ "dubp-user-docs-tests-tools 0.1.0", "dup-crypto 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "dup-crypto-tests-tools 0.1.0", + "durs-common-tools 0.2.0", "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "json-pest-parser 0.2.0", ] @@ -966,6 +967,8 @@ name = "durs-common-tools" version = "0.2.0" dependencies = [ "pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/lib/dubp/block-doc/src/block.rs b/lib/dubp/block-doc/src/block.rs index 22ae22a0f745a3cb867c8a7f3ca285eabc8c907b..136f8ada96cd7ee5dd5c023fc966c41b77e659e4 100644 --- a/lib/dubp/block-doc/src/block.rs +++ b/lib/dubp/block-doc/src/block.rs @@ -22,6 +22,7 @@ use dubp_common_doc::traits::{Document, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::Hash; use dup_crypto::keys::{PubKey, PublicKey, SignatorEnum}; +use durs_common_tools::UsizeSer32; pub use v10::{BlockDocumentV10, BlockDocumentV10Stringified}; @@ -60,7 +61,7 @@ pub trait BlockDocumentTrait { /// Compute the character string that will be signed fn compute_will_signed_string(&self) -> String; /// Get current frame size (in blocks) - fn current_frame_size(&self) -> usize; + fn current_frame_size(&self) -> UsizeSer32; /// Generate compact inner text (for compute inner_hash) fn generate_compact_inner_text(&self) -> String; /// Compute hash and save it in document @@ -74,13 +75,13 @@ pub trait BlockDocumentTrait { /// Get block inner hash fn inner_hash(&self) -> Option<Hash>; /// Get number of compute members in the current frame - fn issuers_count(&self) -> usize; + fn issuers_count(&self) -> UsizeSer32; /// Get number of members in wot - fn members_count(&self) -> usize; + fn members_count(&self) -> UsizeSer32; /// Get block number fn number(&self) -> BlockNumber; /// Get common difficulty (PoW) - fn pow_min(&self) -> usize; + fn pow_min(&self) -> UsizeSer32; /// Get previous hash fn previous_hash(&self) -> Option<Hash>; /// Get previous blockstamp @@ -115,7 +116,7 @@ impl BlockDocumentTrait for BlockDocument { } } #[inline] - fn current_frame_size(&self) -> usize { + fn current_frame_size(&self) -> UsizeSer32 { match self { BlockDocument::V10(block) => block.current_frame_size(), } @@ -157,13 +158,13 @@ impl BlockDocumentTrait for BlockDocument { } } #[inline] - fn issuers_count(&self) -> usize { + fn issuers_count(&self) -> UsizeSer32 { match self { BlockDocument::V10(block) => block.issuers_count(), } } #[inline] - fn members_count(&self) -> usize { + fn members_count(&self) -> UsizeSer32 { match self { BlockDocument::V10(block) => block.members_count(), } @@ -181,7 +182,7 @@ impl BlockDocumentTrait for BlockDocument { } } #[inline] - fn pow_min(&self) -> usize { + fn pow_min(&self) -> UsizeSer32 { match self { BlockDocument::V10(block) => block.pow_min(), } @@ -227,7 +228,7 @@ impl BlockDocumentTrait for BlockDocument { impl Document for BlockDocument { type PublicKey = PubKey; - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { BlockDocument::V10(block_v10_12) => block_v10_12.version(), } diff --git a/lib/dubp/block-doc/src/block/v10.rs b/lib/dubp/block-doc/src/block/v10.rs index 44f4472ff1977a3e7d8cee6f7ad408d8915ae2c5..024f1df2360663be2df37a130a38d2b59d5edd4b 100644 --- a/lib/dubp/block-doc/src/block/v10.rs +++ b/lib/dubp/block-doc/src/block/v10.rs @@ -36,7 +36,7 @@ use dubp_user_docs::documents::transaction::v10::{ }; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; use unwrap::unwrap; /// Wrap a Block document. @@ -45,27 +45,27 @@ use unwrap::unwrap; #[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] pub struct BlockDocumentV10 { /// Version - pub version: u32, + pub version: UsizeSer32, /// Nonce pub nonce: u64, /// number pub number: BlockNumber, /// Minimal proof of work difficulty - pub pow_min: usize, + pub pow_min: UsizeSer32, /// Local time of the block issuer pub time: u64, /// Average time pub median_time: u64, /// Members count - pub members_count: usize, + pub members_count: UsizeSer32, /// Monetary mass - pub monetary_mass: usize, + pub monetary_mass: u64, /// Unit base (power of ten) - pub unit_base: usize, + pub unit_base: UsizeSer32, /// Number of compute members in the current frame - pub issuers_count: usize, + pub issuers_count: UsizeSer32, /// Current frame size (in blocks) - pub issuers_frame: usize, + pub issuers_frame: UsizeSer32, /// Current frame variation buffer pub issuers_frame_var: isize, /// Currency. @@ -86,7 +86,7 @@ pub struct BlockDocumentV10 { /// Hash of the deterministic content of the block pub inner_hash: Option<Hash>, /// Amount of new dividend created at this block, None if no dividend is created at this block - pub dividend: Option<usize>, + pub dividend: Option<UsizeSer32>, /// Identities pub identities: Vec<IdentityDocumentV10>, /// joiners @@ -128,7 +128,7 @@ impl BlockDocumentTrait for BlockDocumentV10 { self.nonce ) } - fn current_frame_size(&self) -> usize { + fn current_frame_size(&self) -> UsizeSer32 { self.issuers_frame } fn generate_compact_inner_text(&self) -> String { @@ -178,7 +178,7 @@ impl BlockDocumentTrait for BlockDocumentV10 { transactions_str.push_str(&transaction.generate_compact_text()); } let mut dividend_str = String::from(""); - if let Some(dividend) = self.dividend { + if let Some(UsizeSer32(dividend)) = self.dividend { if dividend > 0 { dividend_str.push_str("UniversalDividend: "); dividend_str.push_str(÷nd.to_string()); @@ -272,16 +272,16 @@ Transactions:{transactions} fn inner_hash(&self) -> Option<Hash> { self.inner_hash } - fn issuers_count(&self) -> usize { + fn issuers_count(&self) -> UsizeSer32 { self.issuers_count } - fn members_count(&self) -> usize { + fn members_count(&self) -> UsizeSer32 { self.members_count } fn number(&self) -> BlockNumber { self.number } - fn pow_min(&self) -> usize { + fn pow_min(&self) -> UsizeSer32 { self.pow_min } fn previous_blockstamp(&self) -> Blockstamp { @@ -370,8 +370,8 @@ impl Document for BlockDocumentV10 { type PublicKey = PubKey; #[inline] - fn version(&self) -> usize { - self.version as usize + fn version(&self) -> UsizeSer32 { + self.version } #[inline] @@ -467,7 +467,7 @@ pub struct BlockDocumentV10Stringified { /// Number of compute members in the current frame pub issuers_count: u64, /// Current frame size (in blocks) - pub issuers_frame: i64, + pub issuers_frame: u64, /// Current frame variation buffer pub issuers_frame_var: i64, /// Currency. @@ -512,17 +512,17 @@ impl ToStringObject for BlockDocumentV10 { /// Transforms an object into a json object fn to_string_object(&self) -> BlockDocumentV10Stringified { BlockDocumentV10Stringified { - version: u64::from(self.version), + version: self.version.into(), nonce: self.nonce, number: u64::from(self.number.0), - pow_min: self.pow_min as u64, + pow_min: self.pow_min.into(), time: self.time, median_time: self.median_time, - members_count: self.members_count as u64, - monetary_mass: self.monetary_mass as u64, - unit_base: self.unit_base as u64, - issuers_count: self.issuers_count as u64, - issuers_frame: self.issuers_frame as i64, + members_count: self.members_count.into(), + monetary_mass: self.monetary_mass, + unit_base: self.unit_base.into(), + issuers_count: self.issuers_count.into(), + issuers_frame: self.issuers_frame.into(), issuers_frame_var: self.issuers_frame_var as i64, currency: self.currency.to_string(), issuers: self.issuers.iter().map(ToString::to_string).collect(), @@ -532,7 +532,7 @@ impl ToStringObject for BlockDocumentV10 { previous_hash: self.previous_hash.map(|hash| hash.to_string()), previous_issuer: self.previous_issuer.map(|p| p.to_string()), inner_hash: self.inner_hash.map(|hash| hash.to_string()), - dividend: self.dividend.map(|dividend| dividend as u64), + dividend: self.dividend.map(Into::into), identities: self .identities .iter() @@ -603,16 +603,16 @@ mod tests { fn generate_and_verify_empty_block() { let mut block = BlockDocumentV10 { nonce: 100_010_200_000_006_940, - version: 10, + version: UsizeSer32(10), number: BlockNumber(174_260), - pow_min: 68, + pow_min: UsizeSer32(68), time: 1_525_296_873, median_time: 1_525_292_577, - members_count: 33, + members_count: UsizeSer32(33), monetary_mass: 15_633_687, - unit_base: 0, - issuers_count: 8, - issuers_frame: 41, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(8), + issuers_frame: UsizeSer32(41), issuers_frame_var: 0, currency: CurrencyName(String::from("g1-test")), issuers: vec![PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58("39Fnossy1GrndwCnAXGDw3K5UYXhNXAFQe7yhYZp8ELP"), "Fail to build PublicKey from base58"))], @@ -704,16 +704,16 @@ a9PHPuSfw7jW8FRQHXFsGi/bnLjbtDnTYvEVgUC9u0WlR7GVofa+Xb+l5iy6NwuEXiwvueAkf08wPVY8 let mut block = BlockDocumentV10 { nonce: 10_300_000_018_323, - version: 10, + version: UsizeSer32(10), number: BlockNumber(107_984), - pow_min: 88, + pow_min: UsizeSer32(88), time: 1_522_685_861, median_time: 1_522_683_184, - members_count: 896, + members_count: UsizeSer32(896), monetary_mass: 140_469_765, - unit_base: 0, - issuers_count: 42, - issuers_frame: 211, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(42), + issuers_frame: UsizeSer32(211), issuers_frame_var: 0, currency: CurrencyName(String::from("g1")), issuers: vec![PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58("DA4PYtXdvQqk1nCaprXH52iMsK5Ahxs1nRWbWKLhpVkQ"), "Fail to build PublicKey from base58"))], @@ -884,16 +884,16 @@ nxr4exGrt16jteN9ZX3XZPP9l+X0OUbZ1o/QjE1hbWQNtVU3HhH9SJoEvNj2iVl3gCRr9u2OA9uj9vCy let mut block = BlockDocumentV10 { nonce: 10_300_000_090_296, - version: 10, + version: UsizeSer32(10), number: BlockNumber(165_647), - pow_min: 90, + pow_min: UsizeSer32(90), time: 1_540_633_175, median_time: 1_540_627_811, - members_count: 1402, + members_count: UsizeSer32(1402), monetary_mass: 386_008_811, - unit_base: 0, - issuers_count: 37, - issuers_frame: 186, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(37), + issuers_frame: UsizeSer32(186), issuers_frame_var: 0, currency: CurrencyName(String::from("g1")), issuers: vec![PubKey::Ed25519(unwrap!(ed25519::PublicKey::from_base58("A4pc9Uuk4NXkWG8CibicjjPpEPdiup1mhjMoRWUZsonq"), "Fail to build PublicKey from base58"))], diff --git a/lib/dubp/block-doc/src/parser.rs b/lib/dubp/block-doc/src/parser.rs index ae4ef334ef620990f12615b5c2f60fab2399a3ae..7fb52d9a77f22313e949a80a5de1b1b000553b26 100644 --- a/lib/dubp/block-doc/src/parser.rs +++ b/lib/dubp/block-doc/src/parser.rs @@ -24,8 +24,10 @@ use dubp_user_docs::parsers::{serde_json_value_to_pest_json_value, DefaultHasher use dup_crypto::bases::BaseConvertionError; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; use failure::Error; use json_pest_parser::*; +use std::convert::TryFrom; use std::str::FromStr; pub fn parse_json_block_from_serde_value( @@ -46,22 +48,20 @@ pub fn parse_json_block(json_block: &JSONValue<DefaultHasher>) -> Result<BlockDo let currency = get_str(json_block, "currency")?; - let block_number = get_number(json_block, "number")?.trunc() as u32; + let block_number = u32::try_from(get_u64(json_block, "number")?)?; Ok(BlockDocument::V10(BlockDocumentV10 { - version: get_number(json_block, "version")?.trunc() as u32, + version: UsizeSer32(get_u64(json_block, "version")? as usize), nonce: get_u64(json_block, "nonce")?, number: BlockNumber(block_number), - pow_min: get_number(json_block, "powMin")?.trunc() as usize, - time: get_number(json_block, "time")?.trunc() as u64, - median_time: get_number(json_block, "medianTime")?.trunc() as u64, - members_count: get_number(json_block, "membersCount")?.trunc() as usize, - monetary_mass: get_number(json_block, "monetaryMass") - .unwrap_or(0f64) - .trunc() as usize, - unit_base: get_number(json_block, "unitbase")?.trunc() as usize, - issuers_count: get_number(json_block, "issuersCount")?.trunc() as usize, - issuers_frame: get_number(json_block, "issuersFrame")?.trunc() as usize, + pow_min: UsizeSer32(get_u64(json_block, "powMin")? as usize), + time: get_u64(json_block, "time")?, + median_time: get_u64(json_block, "medianTime")?, + members_count: UsizeSer32(get_u64(json_block, "membersCount")? as usize), + monetary_mass: get_u64(json_block, "monetaryMass").unwrap_or(0), + unit_base: UsizeSer32(get_u64(json_block, "unitbase")? as usize), + issuers_count: UsizeSer32(get_u64(json_block, "issuersCount")? as usize), + issuers_frame: UsizeSer32(get_u64(json_block, "issuersFrame")? as usize), issuers_frame_var: get_number(json_block, "issuersFrameVar")?.trunc() as isize, currency: CurrencyName(currency.to_owned()), issuers: vec![PubKey::Ed25519(ed25519::PublicKey::from_base58(get_str( @@ -89,7 +89,7 @@ pub fn parse_json_block(json_block: &JSONValue<DefaultHasher>) -> Result<BlockDo )?)?)) }, inner_hash: Some(Hash::from_hex(get_str(json_block, "inner_hash")?)?), - dividend: get_optional_usize(json_block, "dividend")?, + dividend: get_optional_usize(json_block, "dividend")?.map(UsizeSer32), identities: dubp_user_docs::parsers::identities::parse_compact_identities( currency, get_str_array(json_block, "identities")?, @@ -172,17 +172,17 @@ mod tests { .expect("Fail to parse json block !"); assert_eq!( BlockDocument::V10(BlockDocumentV10 { - version: 10, + version: UsizeSer32(10), nonce: 10_200_000_037_108, number: BlockNumber(7), - pow_min: 70, + pow_min: UsizeSer32(70), time: 1_488_987_677, median_time: 1_488_987_394, - members_count: 59, + members_count: UsizeSer32(59), monetary_mass: 59000, - unit_base: 0, - issuers_count: 1, - issuers_frame: 6, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(1), + issuers_frame: UsizeSer32(6), issuers_frame_var: 0, currency: CurrencyName("g1".to_owned()), issuers: vec![PubKey::Ed25519( @@ -293,17 +293,17 @@ mod tests { .expect("Fail to parse json block !"); let expected_block = BlockDocument::V10(BlockDocumentV10 { - version: 10, + version: UsizeSer32(10), nonce: 10_100_000_033_688, number: BlockNumber(52), - pow_min: 74, + pow_min: UsizeSer32(74), time: 1_488_990_898, median_time: 1_488_990_117, - members_count: 59, + members_count: UsizeSer32(59), monetary_mass: 59000, - unit_base: 0, - issuers_count: 1, - issuers_frame: 6, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(1), + issuers_frame: UsizeSer32(6), issuers_frame_var: 0, currency: CurrencyName("g1".to_owned()), issuers: vec![PubKey::Ed25519( diff --git a/lib/dubp/common-doc/src/traits.rs b/lib/dubp/common-doc/src/traits.rs index a033138d0aab4765a3b5fd92869d612931ad7fd1..9bbfee5812ca590465fefb2b9e66bb8d5dfd5585 100644 --- a/lib/dubp/common-doc/src/traits.rs +++ b/lib/dubp/common-doc/src/traits.rs @@ -20,6 +20,7 @@ pub mod text; use crate::blockstamp::Blockstamp; use crate::errors::DocumentSigsErr; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; use serde::Serialize; use std::collections::HashMap; use std::fmt::Debug; @@ -109,7 +110,7 @@ pub trait Document: Debug + Clone + PartialEq + Eq { } /// Get document version. - fn version(&self) -> usize; + fn version(&self) -> UsizeSer32; } /// Trait helper for building new documents. diff --git a/lib/dubp/user-docs/src/documents/certification.rs b/lib/dubp/user-docs/src/documents/certification.rs index 407b8a75aa3330903c64292c437f2136c767d901..64ce3f86c87297b08b1bfd1834d3756770322cb6 100644 --- a/lib/dubp/user-docs/src/documents/certification.rs +++ b/lib/dubp/user-docs/src/documents/certification.rs @@ -22,7 +22,7 @@ use dubp_common_doc::blockstamp::Blockstamp; use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser}; use dubp_common_doc::traits::{Document, ToStringObject}; use dup_crypto::keys::*; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; use pest::Parser; pub use v10::{ @@ -42,9 +42,9 @@ impl Document for CertificationDocument { type PublicKey = PubKey; #[inline] - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { - CertificationDocument::V10(_) => 10, + CertificationDocument::V10(cert_v10) => cert_v10.version(), } } diff --git a/lib/dubp/user-docs/src/documents/certification/v10.rs b/lib/dubp/user-docs/src/documents/certification/v10.rs index c0dbf79a6486a319cd643742494b942d354eda56..35c964a8a1735871c9d935d796cb4aa210184d3f 100644 --- a/lib/dubp/user-docs/src/documents/certification/v10.rs +++ b/lib/dubp/user-docs/src/documents/certification/v10.rs @@ -23,7 +23,7 @@ use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; #[derive(Copy, Clone, Debug, Deserialize, Serialize, PartialEq, Eq)] /// Wrap an Compact Revocation document (in block content) @@ -213,8 +213,8 @@ impl CertificationDocumentV10 { impl Document for CertificationDocumentV10 { type PublicKey = PubKey; - fn version(&self) -> usize { - 10 + fn version(&self) -> UsizeSer32 { + UsizeSer32(10) } fn currency(&self) -> &str { diff --git a/lib/dubp/user-docs/src/documents/identity.rs b/lib/dubp/user-docs/src/documents/identity.rs index 74ec431b0647365e764af47a06be3b3c79759b54..c4f4403afe293910db6d74e89e694579f83a81e9 100644 --- a/lib/dubp/user-docs/src/documents/identity.rs +++ b/lib/dubp/user-docs/src/documents/identity.rs @@ -22,6 +22,7 @@ use dubp_common_doc::blockstamp::Blockstamp; use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser}; use dubp_common_doc::traits::{Document, ToStringObject}; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; pub use v10::{IdentityDocumentV10, IdentityDocumentV10Stringified}; @@ -36,9 +37,9 @@ impl Document for IdentityDocument { type PublicKey = PubKey; #[inline] - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { - IdentityDocument::V10(_) => 10, + IdentityDocument::V10(idty_v10) => idty_v10.version(), } } diff --git a/lib/dubp/user-docs/src/documents/identity/v10.rs b/lib/dubp/user-docs/src/documents/identity/v10.rs index 24fa6f258a7df35fa4f13ff130278934f1afe5c3..762ed89c9a8d3dbf4d2bee57dbb69dd17d991cea 100644 --- a/lib/dubp/user-docs/src/documents/identity/v10.rs +++ b/lib/dubp/user-docs/src/documents/identity/v10.rs @@ -25,6 +25,7 @@ use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; /// Wrap an Identity document. /// @@ -135,8 +136,8 @@ impl IdentityDocumentV10 { impl Document for IdentityDocumentV10 { type PublicKey = PubKey; - fn version(&self) -> usize { - 10 + fn version(&self) -> UsizeSer32 { + UsizeSer32(10) } fn currency(&self) -> &str { diff --git a/lib/dubp/user-docs/src/documents/membership.rs b/lib/dubp/user-docs/src/documents/membership.rs index 51b5f2dc9abf22698f4e15af85efceceb1f0ec32..3f5593423a779708dc17912a21b6af75abdff1b4 100644 --- a/lib/dubp/user-docs/src/documents/membership.rs +++ b/lib/dubp/user-docs/src/documents/membership.rs @@ -23,6 +23,7 @@ use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocum use dubp_common_doc::traits::text::*; use dubp_common_doc::traits::{Document, ToStringObject}; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; pub use v10::{MembershipDocumentV10, MembershipDocumentV10Stringified}; @@ -38,9 +39,9 @@ impl Document for MembershipDocument { type PublicKey = PubKey; #[inline] - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { - MembershipDocument::V10(_) => 10, + MembershipDocument::V10(ms_v10) => ms_v10.version(), } } diff --git a/lib/dubp/user-docs/src/documents/membership/v10.rs b/lib/dubp/user-docs/src/documents/membership/v10.rs index ab20cf58a53f2947486f022a4714852fcb9ed477..75356f4632a8d38c5af2ec72f1f7774894c47891 100644 --- a/lib/dubp/user-docs/src/documents/membership/v10.rs +++ b/lib/dubp/user-docs/src/documents/membership/v10.rs @@ -23,7 +23,7 @@ use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; /// Type of a Membership. #[derive(Debug, Deserialize, Clone, Copy, Hash, Serialize, PartialEq, Eq)] @@ -194,8 +194,8 @@ impl MembershipDocumentV10 { impl Document for MembershipDocumentV10 { type PublicKey = PubKey; - fn version(&self) -> usize { - 10 + fn version(&self) -> UsizeSer32 { + UsizeSer32(10) } fn currency(&self) -> &str { diff --git a/lib/dubp/user-docs/src/documents/mod.rs b/lib/dubp/user-docs/src/documents/mod.rs index dca2bb7a89006dba91b64e01249563819c67f80e..576a36ecac8ade0d74e734816ce87fffa73b48f3 100644 --- a/lib/dubp/user-docs/src/documents/mod.rs +++ b/lib/dubp/user-docs/src/documents/mod.rs @@ -165,6 +165,7 @@ mod tests { use dubp_common_doc::Blockstamp; use dup_crypto::keys::*; + use durs_common_tools::UsizeSer32; // simple text document for signature testing #[derive(Debug, Clone, PartialEq, Eq)] @@ -177,7 +178,7 @@ mod tests { impl Document for PlainTextDocument { type PublicKey = PubKey; - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { unimplemented!() } diff --git a/lib/dubp/user-docs/src/documents/revocation.rs b/lib/dubp/user-docs/src/documents/revocation.rs index 543b76e3aafe4032c3f9658a62f8150f42bdc377..8bb88af224c098502454ca9c1e8eb26469d40950 100644 --- a/lib/dubp/user-docs/src/documents/revocation.rs +++ b/lib/dubp/user-docs/src/documents/revocation.rs @@ -22,6 +22,7 @@ use dubp_common_doc::blockstamp::Blockstamp; use dubp_common_doc::parser::{DocumentsParser, TextDocumentParseError, TextDocumentParser}; use dubp_common_doc::traits::{Document, ToStringObject}; use dup_crypto::keys::*; +use durs_common_tools::UsizeSer32; use pest::Parser; pub use v10::{ @@ -51,9 +52,9 @@ impl Document for RevocationDocument { type PublicKey = PubKey; #[inline] - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { - RevocationDocument::V10(_) => 10, + RevocationDocument::V10(revoc_10) => revoc_10.version(), } } diff --git a/lib/dubp/user-docs/src/documents/revocation/v10.rs b/lib/dubp/user-docs/src/documents/revocation/v10.rs index 8f5dffa4d4c4f32ac8334f3c182da1328429084e..47ca62d9745cf831f30e0effc53eac45a864ac58 100644 --- a/lib/dubp/user-docs/src/documents/revocation/v10.rs +++ b/lib/dubp/user-docs/src/documents/revocation/v10.rs @@ -39,6 +39,7 @@ use dubp_common_doc::traits::text::*; use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::Hash; +use durs_common_tools::UsizeSer32; #[derive(Debug, Copy, Clone, Deserialize, Serialize, PartialEq, Eq)] /// Wrap an Compact Revocation document (in block content) @@ -193,8 +194,8 @@ impl RevocationDocumentV10 { impl Document for RevocationDocumentV10 { type PublicKey = PubKey; - fn version(&self) -> usize { - 10 + fn version(&self) -> UsizeSer32 { + UsizeSer32(10) } fn currency(&self) -> &str { diff --git a/lib/dubp/user-docs/src/documents/transaction.rs b/lib/dubp/user-docs/src/documents/transaction.rs index ac5c319941b40e3fe1e088945bb969db7664119c..0606529c88b170b701fd5c4e63c2c212766642c7 100644 --- a/lib/dubp/user-docs/src/documents/transaction.rs +++ b/lib/dubp/user-docs/src/documents/transaction.rs @@ -24,6 +24,7 @@ use dubp_common_doc::traits::text::*; use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dup_crypto::hashs::*; use dup_crypto::keys::*; +use durs_common_tools::{fatal_error, UsizeSer32}; use std::ops::{Add, Deref, Sub}; use unwrap::unwrap; @@ -311,7 +312,7 @@ impl TransactionDocument { impl Document for TransactionDocument { type PublicKey = PubKey; - fn version(&self) -> usize { + fn version(&self) -> UsizeSer32 { match self { TransactionDocument::V10(tx_v10) => tx_v10.version(), } diff --git a/lib/dubp/user-docs/src/documents/transaction/v10.rs b/lib/dubp/user-docs/src/documents/transaction/v10.rs index 0f4dbabba1170870c62c916d7d197e30d80469f3..5c9081a1f146568e7619b6c87593df12fd2d136c 100644 --- a/lib/dubp/user-docs/src/documents/transaction/v10.rs +++ b/lib/dubp/user-docs/src/documents/transaction/v10.rs @@ -23,7 +23,7 @@ use dubp_common_doc::traits::{Document, DocumentBuilder, ToStringObject}; use dubp_common_doc::{BlockHash, BlockNumber}; use dup_crypto::hashs::*; use dup_crypto::keys::*; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; use pest::iterators::Pair; use pest::iterators::Pairs; use pest::Parser; @@ -470,8 +470,8 @@ impl TransactionDocumentV10 { impl Document for TransactionDocumentV10 { type PublicKey = PubKey; - fn version(&self) -> usize { - 10 + fn version(&self) -> UsizeSer32 { + UsizeSer32(10) } fn currency(&self) -> &str { diff --git a/lib/modules-lib/bc-db-reader/src/blocks.rs b/lib/modules-lib/bc-db-reader/src/blocks.rs index e013a39031fb739cbcc21c9c967d4e594e2a8542..58ee8f8364672d7c6603d794cf4b4ce9fa3de183 100644 --- a/lib/modules-lib/bc-db-reader/src/blocks.rs +++ b/lib/modules-lib/bc-db-reader/src/blocks.rs @@ -200,12 +200,12 @@ pub fn get_current_frame<DB: BcDbInReadTx>( current_block: &BlockDocument, db: &DB, ) -> Result<HashMap<PubKey, usize>, DbError> { - let frame_begin = current_block.number().0 - current_block.current_frame_size() as u32; + let frame_begin = current_block.number().0 - u32::from(current_block.current_frame_size()); let blocks = get_blocks_in_local_blockchain( db, BlockNumber(frame_begin), - current_block.current_frame_size() as u32, + current_block.current_frame_size().into(), )?; let mut current_frame: HashMap<PubKey, usize> = HashMap::new(); diff --git a/lib/modules-lib/bc-db-reader/src/current_metadata/current_ud.rs b/lib/modules-lib/bc-db-reader/src/current_metadata/current_ud.rs index 6fda114c448f9ceb8355f5c01ef9429668092d99..83417d111acce4a6e96f01c5d9eff24f1ead2376 100644 --- a/lib/modules-lib/bc-db-reader/src/current_metadata/current_ud.rs +++ b/lib/modules-lib/bc-db-reader/src/current_metadata/current_ud.rs @@ -17,6 +17,7 @@ use dubp_block_doc::BlockDocument; use dubp_common_doc::BlockNumber; +use durs_common_tools::UsizeSer32; use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, Serialize, Deserialize)] @@ -25,7 +26,7 @@ pub struct CurrentUdDb { pub base: usize, pub block_number: BlockNumber, pub members_count: usize, - pub monetary_mass: usize, + pub monetary_mass: u64, pub common_time: u64, } @@ -44,13 +45,13 @@ impl Into<Option<CurrentUdDb>> for CurrentUdDbInternal { impl CurrentUdDbInternal { pub fn update(&mut self, block_doc: &BlockDocument) { let BlockDocument::V10(ref block_doc_v10) = block_doc; - if let Some(dividend) = block_doc_v10.dividend { + if let Some(UsizeSer32(dividend)) = block_doc_v10.dividend { self.previous = self.current; self.current = Some(CurrentUdDb { amount: dividend, - base: block_doc_v10.unit_base, + base: block_doc_v10.unit_base.into(), block_number: block_doc_v10.number, - members_count: block_doc_v10.members_count, + members_count: block_doc_v10.members_count.into(), monetary_mass: block_doc_v10.monetary_mass, common_time: block_doc_v10.median_time, }) diff --git a/lib/modules-lib/bc-db-reader/src/tools.rs b/lib/modules-lib/bc-db-reader/src/tools.rs index 5b1515dc80a73caa66d1791389a5863e8b864189..0fd517074b9f55818e3368b42b74094bef4f0187 100644 --- a/lib/modules-lib/bc-db-reader/src/tools.rs +++ b/lib/modules-lib/bc-db-reader/src/tools.rs @@ -31,12 +31,13 @@ pub fn compute_median_issuers_frame<S: std::hash::BuildHasher>( current_frame_vec.sort_unstable(); // Calculate median - let mut median_index = match current_block.block.issuers_count() % 2 { - 1 => (current_block.block.issuers_count() / 2) + 1, - _ => current_block.block.issuers_count() / 2, + let current_block_issuers_count = usize::from(current_block.block.issuers_count()); + let mut median_index = match current_block_issuers_count % 2 { + 1 => (current_block_issuers_count / 2) + 1, + _ => current_block_issuers_count / 2, }; - if median_index >= current_block.block.issuers_count() { - median_index = current_block.block.issuers_count() - 1; + if median_index >= current_block_issuers_count { + median_index = current_block_issuers_count - 1; } current_frame_vec[median_index] diff --git a/lib/modules/blockchain/blockchain/src/dubp/apply/mod.rs b/lib/modules/blockchain/blockchain/src/dubp/apply/mod.rs index f3fdee17d56bbc6f610b0755503aaf28dbe65427..d7d384a023266f6481bf4adeb495c23902ecdf1e 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/apply/mod.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/apply/mod.rs @@ -25,7 +25,7 @@ use durs_bc_db_reader::indexes::sources::get_block_consumed_sources_; use durs_bc_db_reader::indexes::sources::SourceAmount; use durs_bc_db_writer::writers::requests::*; use durs_bc_db_writer::{BcDbRwWithWriter, BinFreeStructDb, Db, DbError, DbWriter}; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; use durs_wot::data::NewLinkResult; use durs_wot::{WebOfTrust, WotId}; use std::collections::{HashMap, HashSet}; @@ -210,7 +210,7 @@ pub fn apply_valid_block_v10<W: WebOfTrust>( .expect("Fail to write in WotDB"); } } - if let Some(du_amount) = block.dividend { + if let Some(UsizeSer32(du_amount)) = block.dividend { if du_amount > 0 { let members_wot_ids = wot_db .read(WebOfTrust::get_enabled) @@ -222,7 +222,7 @@ pub fn apply_valid_block_v10<W: WebOfTrust>( } } currency_dbs_requests.push(CurrencyDBsWriteQuery::CreateUD( - SourceAmount(TxAmount(du_amount as isize), TxBase(block.unit_base)), + SourceAmount(TxAmount(du_amount as isize), TxBase(block.unit_base.into())), block.number, members_pubkeys, )); diff --git a/lib/modules/blockchain/blockchain/src/dubp/check.rs b/lib/modules/blockchain/blockchain/src/dubp/check.rs index cca4bd56964368932c633ddf685451b9ac3e9103..a067542596c4410aaa80cb60475664f11a9e362b 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/check.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/check.rs @@ -67,7 +67,7 @@ pub fn check_block<DB: BcDbInReadTx>( // Verify proof of work // The case where the block has none hash is captured by check_block_hashes below if let Some(hash) = block_doc.hash() { - pow::verify_hash_pattern(hash.0, block_doc.pow_min()) + pow::verify_hash_pattern(hash.0, block_doc.pow_min().into()) .map_err(CheckBlockError::Pow)?; } // Check block hashes. diff --git a/lib/modules/blockchain/blockchain/src/dubp/check/local.rs b/lib/modules/blockchain/blockchain/src/dubp/check/local.rs index d5925e037d41f2b0fe1b968cf5ca5cb33defa013..48ace1f9799af01d88c42f6d2ce852b32e5799a2 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/check/local.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/check/local.rs @@ -29,17 +29,19 @@ use dubp_common_doc::errors::DocumentSigsErr; use dubp_common_doc::traits::Document; use dubp_common_doc::BlockNumber; use dubp_currency_params::CurrencyParameters; +use durs_common_tools::UsizeSer32; const COUNT_ALLOWED_BLOCK_VERSIONS: usize = 3; -static ALLOWED_BLOCK_VERSIONS: [usize; COUNT_ALLOWED_BLOCK_VERSIONS] = [10, 11, 12]; +static ALLOWED_BLOCK_VERSIONS: [UsizeSer32; COUNT_ALLOWED_BLOCK_VERSIONS] = + [UsizeSer32(10), UsizeSer32(11), UsizeSer32(12)]; #[derive(Debug, PartialEq)] /// Local verification of a block error pub enum LocalVerifyBlockError { /// Wrong block version Version { - expected_version: [usize; COUNT_ALLOWED_BLOCK_VERSIONS], - actual_version: u32, + expected_version: [UsizeSer32; COUNT_ALLOWED_BLOCK_VERSIONS], + actual_version: UsizeSer32, }, /// Genesis block specific rules LocalVerifyGenesisBlockError(LocalVerifyGenesisBlockError), @@ -108,7 +110,7 @@ pub fn verify_local_validity_block_v10( block: &BlockDocumentV10, ) -> Result<(), LocalVerifyBlockError> { // Version - if !ALLOWED_BLOCK_VERSIONS.contains(&(block.version as usize)) { + if !ALLOWED_BLOCK_VERSIONS.contains(&block.version) { return Err(LocalVerifyBlockError::Version { expected_version: ALLOWED_BLOCK_VERSIONS, actual_version: block.version, @@ -126,7 +128,7 @@ pub fn verify_local_validity_block_v10( // As it has been checked that block.issuers.len() == 1 and as // block.issuers.len() == block.signatures.len() is check in block.verify_signatures() // there is no need to check that block.signatures.len() == 1 - if block.version >= 12 { + if usize::from(block.version()) >= 12 { block .verify_signatures() .map_err(LocalVerifyBlockError::BlockSignatureError)?; @@ -181,11 +183,11 @@ mod tests { fn test_verify_not_genesis_block_wrong_version() { let currency_params = gen_mock_currency_parameters(); let mut block = gen_mock_normal_block_v10(); - block.version = 14; + block.version = UsizeSer32(14); let expected = Err(LocalVerifyBlockError::Version { expected_version: ALLOWED_BLOCK_VERSIONS, - actual_version: 14, + actual_version: UsizeSer32(14), }); let actual = verify_local_validity_block(&BlockDocument::V10(block), Some(currency_params)); assert_eq!(expected, actual); diff --git a/lib/modules/blockchain/blockchain/src/dubp/check/local/genesis.rs b/lib/modules/blockchain/blockchain/src/dubp/check/local/genesis.rs index 5099de4ab854c2c985b00395a71fb66a8c2632ce..e68dffcecad2f2c17fb249e1f6e18f23ad505800 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/check/local/genesis.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/check/local/genesis.rs @@ -80,8 +80,8 @@ fn local_validation_genesis_block_v10( .ok_or(LocalVerifyGenesisBlockError::MissingParameters)?; // unit_base must be equal to zero - (block.unit_base == 0).or_err(LocalVerifyGenesisBlockError::NonZeroUnitBase { - unit_base: block.unit_base, + (usize::from(block.unit_base) == 0).or_err(LocalVerifyGenesisBlockError::NonZeroUnitBase { + unit_base: block.unit_base.into(), })?; // time must be equal to median_time @@ -100,6 +100,7 @@ mod tests { use dubp_blocks_tests_tools::mocks::gen_mock_genesis_block_v10; use dup_crypto::hashs::Hash; use dup_crypto::keys::*; + use durs_common_tools::UsizeSer32; #[test] fn test_genesis_block_valid() { @@ -125,7 +126,7 @@ mod tests { #[test] fn test_genesis_block_unexpected_dividend() { let mut block = gen_mock_genesis_block_v10(); - block.dividend = Some(10); + block.dividend = Some(UsizeSer32(10)); let expected = Err(LocalVerifyGenesisBlockError::UnexpectedDividend); let actual = local_validation_genesis_block(&BlockDocument::V10(block)); @@ -171,7 +172,7 @@ mod tests { #[test] fn test_genesis_block_non_zero_unit_base() { let mut block = gen_mock_genesis_block_v10(); - block.unit_base = 3; + block.unit_base = UsizeSer32(3); let expected = Err(LocalVerifyGenesisBlockError::NonZeroUnitBase { unit_base: 3 }); let actual = local_validation_genesis_block(&BlockDocument::V10(block)); diff --git a/lib/modules/blockchain/blockchain/src/dubp/check/local/tx_doc.rs b/lib/modules/blockchain/blockchain/src/dubp/check/local/tx_doc.rs index ee6c0e2747eea4192622d72759ea900f6a181f3d..96c4c2d52e83ce7f9a6365b0451fd8cb9cab2ab4 100644 --- a/lib/modules/blockchain/blockchain/src/dubp/check/local/tx_doc.rs +++ b/lib/modules/blockchain/blockchain/src/dubp/check/local/tx_doc.rs @@ -21,6 +21,7 @@ use dubp_common_doc::traits::Document; use dubp_user_docs::documents::transaction::v10::TransactionDocumentV10; use dubp_user_docs::documents::transaction::TransactionDocumentTrait; use durs_common_tools::traits::bool_ext::BoolExt; +use durs_common_tools::UsizeSer32; #[derive(Debug, PartialEq)] /// Transaction Document Error @@ -38,7 +39,7 @@ pub enum TransactionDocumentError { /// Local verification of a Tx Document pub fn local_verify_tx_doc_v10( - dubp_version: usize, + dubp_version: UsizeSer32, tx_doc: &TransactionDocumentV10, ) -> Result<(), TransactionDocumentError> { // A transaction in compact format must measure less than 100 lines @@ -56,7 +57,7 @@ pub fn local_verify_tx_doc_v10( // Signatures are made over the transaction's content, signatures excepted //////////////////////////////////////////////////////////////////////////////////// // Temporary disabled due to #183 - if dubp_version >= 12 { + if usize::from(dubp_version) >= 12 { tx_doc .verify_signatures() .map_err(TransactionDocumentError::TxSignatureError)?; @@ -158,7 +159,7 @@ mod tests { #[test] fn test_tx_valid() { let TransactionDocument::V10(tx) = gen_mock_tx_doc(); - assert_eq!(Ok(()), local_verify_tx_doc_v10(10, &tx)); + assert_eq!(Ok(()), local_verify_tx_doc_v10(UsizeSer32(10), &tx)); } #[test] @@ -172,7 +173,7 @@ mod tests { let tx = tx_builder.build_with_signature(vec![sig1()]); let expected = Err(TransactionDocumentError::MissingInput); - let actual = local_verify_tx_doc_v10(10, &tx); + let actual = local_verify_tx_doc_v10(UsizeSer32(10), &tx); assert_eq!(expected, actual); } @@ -190,7 +191,7 @@ mod tests { expected_max_length: 100, actual_length: 107, }); - let actual = local_verify_tx_doc_v10(10, &tx); + let actual = local_verify_tx_doc_v10(UsizeSer32(10), &tx); assert_eq!(expected, actual); } diff --git a/lib/modules/blockchain/blockchain/src/fork/revert_block.rs b/lib/modules/blockchain/blockchain/src/fork/revert_block.rs index 0bea8a77b6ae5ca8911a3dc88c60b9b406db7b4c..b05355d2c8a1e8ed0e88824b1764e386c82c04e0 100644 --- a/lib/modules/blockchain/blockchain/src/fork/revert_block.rs +++ b/lib/modules/blockchain/blockchain/src/fork/revert_block.rs @@ -24,7 +24,7 @@ use durs_bc_db_reader::blocks::BlockDb; use durs_bc_db_reader::indexes::sources::SourceAmount; use durs_bc_db_writer::writers::requests::*; use durs_bc_db_writer::{BinFreeStructDb, DbError}; -use durs_common_tools::fatal_error; +use durs_common_tools::{fatal_error, UsizeSer32}; use durs_wot::data::{NewLinkResult, RemLinkResult}; use durs_wot::{WebOfTrust, WotId}; use std::collections::HashMap; @@ -87,7 +87,7 @@ pub fn revert_block_v10<W: WebOfTrust>( ))); } // Revert UD - if let Some(du_amount) = block.dividend { + if let Some(UsizeSer32(du_amount)) = block.dividend { if du_amount > 0 { let members_wot_ids = wot_db .read(WebOfTrust::get_enabled) @@ -99,7 +99,7 @@ pub fn revert_block_v10<W: WebOfTrust>( } } currency_dbs_requests.push(CurrencyDBsWriteQuery::RevertUD( - SourceAmount(TxAmount(du_amount as isize), TxBase(block.unit_base)), + SourceAmount(TxAmount(du_amount as isize), TxBase(block.unit_base.into())), block.number, members_pubkeys, )); diff --git a/lib/modules/gva/src/schema/entities/block.rs b/lib/modules/gva/src/schema/entities/block.rs index a0e3aeed47129ee01d50f37eaf92ad0e06f9ba1e..71c40e8d65d6417fa943926d8661ae47fe4ef957 100644 --- a/lib/modules/gva/src/schema/entities/block.rs +++ b/lib/modules/gva/src/schema/entities/block.rs @@ -51,7 +51,7 @@ impl Block { ask_issuer_name: bool, ) -> Result<Block, DbError> { Ok(Block { - version: block_db.block.version() as i32, + version: block_db.block.version().into(), currency: block_db.block.currency().to_string(), issuer: block_db.block.issuers()[0].to_string(), issuer_name: if ask_issuer_name { @@ -59,8 +59,8 @@ impl Block { } else { None }, - issuers_count: block_db.block.issuers_count() as i32, - members_count: block_db.block.members_count() as i32, + issuers_count: block_db.block.issuers_count().into(), + members_count: block_db.block.members_count().into(), number: block_db.block.number().0 as i32, hash: block_db .block @@ -68,7 +68,7 @@ impl Block { .unwrap_or_else(|| fatal_error!("BlockDb without hash.")) .to_string(), blockchain_time: NaiveDateTime::from_timestamp(block_db.block.common_time() as i64, 0), - pow_min: block_db.block.pow_min() as i32, + pow_min: block_db.block.pow_min().into(), }) } } diff --git a/lib/modules/gva/src/schema/queries/block.rs b/lib/modules/gva/src/schema/queries/block.rs index 48278ce323200fcbca51f315e02e6f5f5bb0209d..3a85d335f9044b748ad420d03e8f3485d160b6d3 100644 --- a/lib/modules/gva/src/schema/queries/block.rs +++ b/lib/modules/gva/src/schema/queries/block.rs @@ -47,6 +47,7 @@ mod tests { use dup_crypto::hashs::Hash; use dup_crypto_tests_tools::mocks::{hash, pubkey}; use durs_bc_db_reader::blocks::BlockDb; + use durs_common_tools::UsizeSer32; use mockall::predicate::eq; use serde_json::json; @@ -69,8 +70,8 @@ mod tests { Hash::default(), ); block.issuers = vec![pubkey('B')]; - block.issuers_count = 3; - block.pow_min = 70; + block.issuers_count = UsizeSer32(3); + block.pow_min = UsizeSer32(70); Ok(Some(BlockDb { block: BlockDocument::V10(block), expire_certs: None, diff --git a/lib/modules/gva/src/schema/queries/current.rs b/lib/modules/gva/src/schema/queries/current.rs index 02757c23b9d0bd294106c8b4b7158b5618e2ea75..c14f06a35034a4b4586d70d42dc81962b20eb715 100644 --- a/lib/modules/gva/src/schema/queries/current.rs +++ b/lib/modules/gva/src/schema/queries/current.rs @@ -39,6 +39,7 @@ mod tests { use dup_crypto::hashs::Hash; use dup_crypto_tests_tools::mocks::{hash, pubkey}; use durs_bc_db_reader::blocks::BlockDb; + use durs_common_tools::UsizeSer32; use mockall::predicate::eq; use serde_json::json; @@ -57,8 +58,8 @@ mod tests { Hash::default(), ); current_block.issuers = vec![pubkey('B')]; - current_block.pow_min = 70; - current_block.members_count = 59; + current_block.pow_min = UsizeSer32(70); + current_block.members_count = UsizeSer32(59); Ok(Some(BlockDb { block: BlockDocument::V10(current_block), expire_certs: None, diff --git a/lib/tests-tools/blocks-tests-tools/Cargo.toml b/lib/tests-tools/blocks-tests-tools/Cargo.toml index d83b72da301bd5235e3a1e95650a79b8b7e6f501..d8394eaeeb9cdf9b4d0185e23816d1848dec0ae3 100644 --- a/lib/tests-tools/blocks-tests-tools/Cargo.toml +++ b/lib/tests-tools/blocks-tests-tools/Cargo.toml @@ -20,6 +20,7 @@ dubp-user-docs = { path = "../../dubp/user-docs" } dup-crypto = "0.8.1" dup-crypto-tests-tools = { path = "../crypto-tests-tools" } dubp-user-docs-tests-tools = { path = "../user-docs-tests-tools" } +durs-common-tools = { path = "../../tools/common-tools" } json-pest-parser = { path = "../../tools/json-pest-parser" } failure = "0.1.5" diff --git a/lib/tests-tools/blocks-tests-tools/src/mocks.rs b/lib/tests-tools/blocks-tests-tools/src/mocks.rs index aa316541d4cb8a24c890c9de49897ef8d44fa081..58955ae959cbcba08b359c489bdc05067f617cca 100644 --- a/lib/tests-tools/blocks-tests-tools/src/mocks.rs +++ b/lib/tests-tools/blocks-tests-tools/src/mocks.rs @@ -30,6 +30,7 @@ use dubp_user_docs::documents::transaction::*; use dup_crypto::bases::b16::str_hex_to_32bytes; use dup_crypto::hashs::Hash; use dup_crypto::keys::{ed25519, PubKey, PublicKey, Sig, Signator, Signature}; +use durs_common_tools::UsizeSer32; /// Generate n mock blockstamps pub fn generate_blockstamps(n: usize) -> Vec<Blockstamp> { @@ -110,17 +111,17 @@ pub fn gen_empty_issued_block_v10(issuer: PubKey) -> BlockDocumentV10 { fn gen_empty_block_v10(block_number: BlockNumber) -> BlockDocumentV10 { BlockDocumentV10 { - version: 10, + version: UsizeSer32(10), nonce: 0, number: block_number, - pow_min: 0, + pow_min: UsizeSer32(0), time: 0, median_time: 0, - members_count: 0, + members_count: UsizeSer32(0), monetary_mass: 0, - unit_base: 0, - issuers_count: 0, - issuers_frame: 0, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(0), + issuers_frame: UsizeSer32(0), issuers_frame_var: 0, currency: CurrencyName("test_currency".to_owned()), issuers: vec![], @@ -175,16 +176,16 @@ a9PHPuSfw7jW8FRQHXFsGi/bnLjbtDnTYvEVgUC9u0WlR7GVofa+Xb+l5iy6NwuEXiwvueAkf08wPVY8 BlockDocumentV10 { nonce: 10_300_000_018_323, - version: 10, + version: UsizeSer32(10), number: BlockNumber(107_984), - pow_min: 88, + pow_min: UsizeSer32(88), time: 1_522_685_861, median_time: 1_522_683_184, - members_count: 896, + members_count: UsizeSer32(896), monetary_mass: 140_469_765, - unit_base: 0, - issuers_count: 42, - issuers_frame: 211, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(42), + issuers_frame: UsizeSer32(211), issuers_frame_var: 0, currency: CurrencyName(String::from("g1")), issuers: vec![PubKey::Ed25519(ed25519::PublicKey::from_base58("DA4PYtXdvQqk1nCaprXH52iMsK5Ahxs1nRWbWKLhpVkQ").expect("fail to parse issuers"))], @@ -213,16 +214,16 @@ a9PHPuSfw7jW8FRQHXFsGi/bnLjbtDnTYvEVgUC9u0WlR7GVofa+Xb+l5iy6NwuEXiwvueAkf08wPVY8 pub fn gen_mock_genesis_block_v10() -> BlockDocumentV10 { BlockDocumentV10 { nonce: 0, - version: 10, + version: UsizeSer32(10), number: BlockNumber(0), - pow_min: 0, + pow_min: UsizeSer32(0), time: 0, median_time: 0, - members_count: 0, + members_count: UsizeSer32(0), monetary_mass: 0, - unit_base: 0, - issuers_count: 0, - issuers_frame: 0, + unit_base: UsizeSer32(0), + issuers_count: UsizeSer32(0), + issuers_frame: UsizeSer32(0), issuers_frame_var: 0, currency: CurrencyName(String::from("g1")), issuers: vec![PubKey::Ed25519(ed25519::PublicKey::from_base58("DA4PYtXdvQqk1nCaprXH52iMsK5Ahxs1nRWbWKLhpVkQ").expect("fail to parse issuers"))], diff --git a/lib/tools/common-tools/Cargo.toml b/lib/tools/common-tools/Cargo.toml index 6b9a55cf0013517e62628d8821461101abd98aad..c167b418eff5e35dc708c7217360a31f71a6b0fa 100644 --- a/lib/tools/common-tools/Cargo.toml +++ b/lib/tools/common-tools/Cargo.toml @@ -13,6 +13,8 @@ edition = "2018" path = "src/lib.rs" [dependencies] +shrinkwraprs = "0.3.*" +serde = { version = "1.0.*", features = ["derive"] } [dev-dependencies] pretty_assertions = "0.6.1" diff --git a/lib/tools/common-tools/src/lib.rs b/lib/tools/common-tools/src/lib.rs index 9330d531786914eed8c202327e50ec1b2d869d18..0645ee1f0583ccc5be96ec1c94bc99fab301c0e1 100644 --- a/lib/tools/common-tools/src/lib.rs +++ b/lib/tools/common-tools/src/lib.rs @@ -31,6 +31,9 @@ pub mod fns; pub mod macros; pub mod traits; +mod usizeser32; + +pub use usizeser32::UsizeSer32; /// Percent #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] diff --git a/lib/tools/common-tools/src/usizeser32.rs b/lib/tools/common-tools/src/usizeser32.rs new file mode 100644 index 0000000000000000000000000000000000000000..21aaf0126c65cd694a7c70677f64328be7ddb909 --- /dev/null +++ b/lib/tools/common-tools/src/usizeser32.rs @@ -0,0 +1,110 @@ +// Copyright (C) 2019 Éloïs SANCHEZ +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +//! Common rust tools for DURS project. + +use serde::de::{self, Deserialize, Deserializer, Visitor}; +use serde::{Serialize, Serializer}; +use shrinkwraprs::Shrinkwrap; +use std::fmt::{self, Debug, Display, Error, Formatter}; + +/// Wrapper for a usize value serialized in u32. +#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Shrinkwrap)] +#[shrinkwrap] +pub struct UsizeSer32(pub usize); + +impl Display for UsizeSer32 { + fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { + write!(f, "{}", self.0) + } +} + +impl From<UsizeSer32> for i32 { + fn from(value: UsizeSer32) -> Self { + value.0 as Self + } +} + +impl From<UsizeSer32> for u32 { + fn from(value: UsizeSer32) -> Self { + value.0 as Self + } +} + +impl From<UsizeSer32> for u64 { + fn from(value: UsizeSer32) -> Self { + value.0 as Self + } +} + +impl From<UsizeSer32> for usize { + fn from(value: UsizeSer32) -> Self { + value.0 + } +} + +impl Serialize for UsizeSer32 { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.serialize_u32(self.0 as u32) + } +} + +struct UsizeSer32Visitor; + +impl<'de> Visitor<'de> for UsizeSer32Visitor { + type Value = UsizeSer32; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an unsigned integer between 0 and 2^32-1") + } + + fn visit_u8<E>(self, value: u8) -> Result<UsizeSer32, E> + where + E: de::Error, + { + Ok(UsizeSer32(value as usize)) + } + + fn visit_u32<E>(self, value: u32) -> Result<UsizeSer32, E> + where + E: de::Error, + { + Ok(UsizeSer32(value as usize)) + } + + fn visit_u64<E>(self, value: u64) -> Result<UsizeSer32, E> + where + E: de::Error, + { + use std::usize; + if value >= usize::MIN as u64 && value <= usize::MAX as u64 { + Ok(UsizeSer32(value as usize)) + } else { + Err(E::custom(format!("u32 out of range: {}", value))) + } + } +} + +impl<'de> Deserialize<'de> for UsizeSer32 { + fn deserialize<D>(deserializer: D) -> Result<UsizeSer32, D::Error> + where + D: Deserializer<'de>, + { + deserializer.deserialize_u32(UsizeSer32Visitor) + } +}