diff --git a/Cargo.lock b/Cargo.lock index ea1cb58265a2de2ce1cfd543af588713dcb4ca2d..39a1f360e2195238fa2f47ab23c4c2581db5e0fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1092,6 +1092,7 @@ dependencies = [ "dubp", "duniter-dbs", "duniter-dbs-write-ops", + "duniter-gva-db", "duniter-gva-indexer", "fast-threadpool", "flume", @@ -1156,6 +1157,7 @@ dependencies = [ "dubp", "duniter-conf", "duniter-dbs", + "duniter-gva-db", "duniter-gva-dbs-reader", "duniter-gva-gql", "duniter-gva-indexer", @@ -1176,6 +1178,22 @@ dependencies = [ "warp", ] +[[package]] +name = "duniter-gva-db" +version = "0.1.0" +dependencies = [ + "bincode", + "chrono", + "dubp", + "duniter-dbs", + "kv_typed", + "paste", + "serde", + "serde_json", + "uninit", + "zerocopy", +] + [[package]] name = "duniter-gva-dbs-reader" version = "0.1.0" @@ -1183,6 +1201,7 @@ dependencies = [ "anyhow", "dubp", "duniter-dbs", + "duniter-gva-db", "maplit", "resiter", "smallvec", @@ -1201,6 +1220,7 @@ dependencies = [ "duniter-bc-reader", "duniter-conf", "duniter-dbs", + "duniter-gva-db", "duniter-gva-dbs-reader", "duniter-mempools", "duniter-module", @@ -1223,6 +1243,7 @@ dependencies = [ "anyhow", "dubp", "duniter-dbs", + "duniter-gva-db", "maplit", "once_cell", "resiter", diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml index c0b2ce05fd1dfd12e09e39cd2f634b375d9fe688..24c60ff75133e7c3a9930798c50eeee60f9f80de 100644 --- a/rust-bins/duniter-dbex/Cargo.toml +++ b/rust-bins/duniter-dbex/Cargo.toml @@ -25,6 +25,7 @@ dirs = "3.0.1" dubp = { version = "0.34.0" } duniter-dbs = { path = "../../rust-libs/duniter-dbs", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] } duniter-dbs-write-ops = { path = "../../rust-libs/duniter-dbs-write-ops", default-features = false, features = ["explorer", "leveldb_backend", "sled_backend"] } +duniter-gva-db = { path = "../../rust-libs/modules/gva/db", default-features = false, features = ["explorer", "leveldb_backend"] } duniter-gva-indexer = { path = "../../rust-libs/modules/gva/indexer" } fast-threadpool = "0.2.3" flume = "0.10.0" diff --git a/rust-bins/duniter-dbex/src/main.rs b/rust-bins/duniter-dbex/src/main.rs index fa68156ae6fce1d6ad03ea89e72c68c70e14327a..ca55f5d4c1f9a270487388ad343d578fbd3b8f6f 100644 --- a/rust-bins/duniter-dbex/src/main.rs +++ b/rust-bins/duniter-dbex/src/main.rs @@ -36,7 +36,6 @@ use duniter_dbs::databases::{ bc_v1::{BcV1Db, BcV1DbWritable}, bc_v2::{BcV2Db, BcV2DbWritable}, dunp_v1::{DunpV1Db, DunpV1DbWritable}, - gva_v1::{GvaV1Db, GvaV1DbWritable}, txs_mp_v2::{TxsMpV2Db, TxsMpV2DbWritable}, }; use duniter_dbs::kv_typed::prelude::*; @@ -44,6 +43,7 @@ use duniter_dbs::prelude::*; use duniter_dbs::regex::Regex; use duniter_dbs::serde_json::{Map, Value}; use duniter_dbs::smallvec::{smallvec, SmallVec}; +use duniter_gva_db::{GvaV1Db, GvaV1DbWritable}; use rayon::prelude::*; use std::{ collections::{HashMap, HashSet}, diff --git a/rust-libs/duniter-dbs/Cargo.toml b/rust-libs/duniter-dbs/Cargo.toml index 9e448409355dcb7089cc2cc65629ac89777db22c..cd8424dd855ef3882b5f50747ac0ac68bcc5165b 100644 --- a/rust-libs/duniter-dbs/Cargo.toml +++ b/rust-libs/duniter-dbs/Cargo.toml @@ -37,7 +37,7 @@ unwrap = "1.2.1" [features] default = ["sled_backend"] -# CAUTION: feature "leveldb_backend" MUST BE DISABLED by default. Uncomment this lire for dev/test only ! +# CAUTION: feature "leveldb_backend" MUST BE DISABLED by default. Uncomment this line for dev/test only ! #default = ["sled_backend", "explorer", "leveldb_backend"] explorer = ["chrono", "kv_typed/explorer"] diff --git a/rust-libs/duniter-dbs/src/databases.rs b/rust-libs/duniter-dbs/src/databases.rs index 1c49eafdf9c13bc331d7608754d4a7207a92bd9e..501375802286b32313160c6b7debd9ff005d98c1 100644 --- a/rust-libs/duniter-dbs/src/databases.rs +++ b/rust-libs/duniter-dbs/src/databases.rs @@ -17,5 +17,4 @@ pub mod bc_v1; pub mod bc_v2; pub mod cm_v1; pub mod dunp_v1; -pub mod gva_v1; pub mod txs_mp_v2; diff --git a/rust-libs/duniter-dbs/src/keys.rs b/rust-libs/duniter-dbs/src/keys.rs index 6f6e1f1d3aa1a404072429e1ca82eaf3cb162ecb..b5d2db16bd1451130a4bca39686bba24cfd933a1 100644 --- a/rust-libs/duniter-dbs/src/keys.rs +++ b/rust-libs/duniter-dbs/src/keys.rs @@ -26,4 +26,3 @@ pub mod ud_id; pub mod uid; pub mod utxo_id; pub mod wallet_conditions; -pub mod wallet_hash_with_bn; diff --git a/rust-libs/duniter-dbs/src/keys/utxo_id.rs b/rust-libs/duniter-dbs/src/keys/utxo_id.rs index 6dead64f95fa53db7297b9d60072550de6e6f2b8..ca57bf0cbe3534eb83110a6bef29d694310711a1 100644 --- a/rust-libs/duniter-dbs/src/keys/utxo_id.rs +++ b/rust-libs/duniter-dbs/src/keys/utxo_id.rs @@ -98,137 +98,6 @@ impl ExplorableKey for UtxoIdDbV2 { } } -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] -pub struct GvaUtxoIdDbV1([u8; 69]); // script hash ++ block_number ++ tx_hash ++ output_index - -impl Default for GvaUtxoIdDbV1 { - fn default() -> Self { - GvaUtxoIdDbV1([0u8; 69]) - } -} - -impl std::fmt::Display for GvaUtxoIdDbV1 { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!( - f, - "{}:{}:{}:{}", - self.get_script_hash(), - self.get_block_number(), - self.get_tx_hash(), - self.get_output_index() - ) - } -} - -impl GvaUtxoIdDbV1 { - pub fn get_script_hash(&self) -> Hash { - let mut buffer = uninit_array![u8; 32]; - - buffer.as_out().copy_from_slice(&self.0[..32]); - - Hash(unsafe { std::mem::transmute(buffer) }) - } - pub fn get_block_number(&self) -> u32 { - let mut buffer = uninit_array![u8; 4]; - - buffer.as_out().copy_from_slice(&self.0[32..36]); - - u32::from_be_bytes(unsafe { std::mem::transmute(buffer) }) - } - pub fn get_tx_hash(&self) -> Hash { - let mut buffer = uninit_array![u8; 32]; - - buffer.as_out().copy_from_slice(&self.0[36..68]); - - Hash(unsafe { std::mem::transmute(buffer) }) - } - pub fn get_output_index(&self) -> u8 { - self.0[68] - } - pub fn new( - script: WalletScriptV10, - block_number: u32, - tx_hash: Hash, - output_index: u8, - ) -> Self { - let script_hash = Hash::compute(script.to_string().as_bytes()); - Self::new_(script_hash, block_number, tx_hash, output_index) - } - pub fn new_(script_hash: Hash, block_number: u32, tx_hash: Hash, output_index: u8) -> Self { - // TODO uncomment when feature const_generics became stable ! - /*let mut buffer = uninit_array![u8; 69]; - let (hash_buffer, rest_buffer) = buffer.as_out().split_at_out(32); - let (bn_buffer, rest_buffer) = rest_buffer.split_at_out(4); - let (tx_hash_buffer, output_index_buffer) = rest_buffer.split_at_out(32); - hash_buffer.copy_from_slice(script_hash.as_ref()); - bn_buffer.copy_from_slice(&block_number.to_be_bytes()[..]); - tx_hash_buffer.copy_from_slice(tx_hash.as_ref()); - output_index_buffer.copy_from_slice(&[output_index]); - - Self(unsafe { std::mem::transmute(buffer) })*/ - let mut buffer = [0u8; 69]; - buffer[..32].copy_from_slice(script_hash.as_ref()); - buffer[32..36].copy_from_slice(&block_number.to_be_bytes()[..]); - buffer[36..68].copy_from_slice(tx_hash.as_ref()); - buffer[68] = output_index; - Self(buffer) - } - pub fn script_interval(script_hash: Hash) -> (Self, Self) { - let mut buffer = [0; 69]; - buffer[..32].copy_from_slice(script_hash.as_ref()); - let min = Self(buffer); - let mut buffer = [255; 69]; - buffer[..32].copy_from_slice(script_hash.as_ref()); - let max = Self(buffer); - - (min, max) - } - pub fn script_block_interval( - script_hash: Hash, - block_number_start: u32, - block_number_end: u32, - ) -> (Self, Self) { - ( - Self::new_(script_hash, block_number_start, Hash::default(), 0), - Self::new_(script_hash, block_number_end, Hash::max(), u8::MAX), - ) - } -} - -impl AsBytes for GvaUtxoIdDbV1 { - fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - f(&self.0[..]) - } -} - -impl FromBytes for GvaUtxoIdDbV1 { - type Err = CorruptedBytes; - - fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - if bytes.len() == 69 { - // TODO uncomment when feature const_generics became stable ! - /*let mut buffer = uninit_array![u8; 69]; - buffer.as_out().copy_from_slice(bytes); - Ok(Self(unsafe { std::mem::transmute(buffer) }))*/ - let mut buffer = [0u8; 69]; - buffer.copy_from_slice(bytes); - Ok(Self(buffer)) - } else { - Err(CorruptedBytes("db corrupted".to_owned())) - } - } -} - -#[cfg(feature = "explorer")] -impl ExplorableKey for GvaUtxoIdDbV1 { - fn from_explorer_str(_: &str) -> std::result::Result<Self, FromExplorerKeyErr> { - unimplemented!() - } - fn to_explorer_string(&self) -> KvResult<String> { - Ok(self.to_string()) - } -} - #[cfg(test)] mod tests { use super::*; @@ -252,17 +121,4 @@ mod tests { Ok(()) } - - #[test] - fn utxo_gva_id_new() { - let script = WalletScriptV10::single(WalletConditionV10::Csv(86_400)); - let script_hash = Hash::compute(script.to_string().as_bytes()); - let tx_hash = Hash::default(); - let utxo_gva_id = GvaUtxoIdDbV1::new(script, 42, tx_hash, 3); - - assert_eq!(utxo_gva_id.get_script_hash(), script_hash); - assert_eq!(utxo_gva_id.get_block_number(), 42); - assert_eq!(utxo_gva_id.get_tx_hash(), tx_hash); - assert_eq!(utxo_gva_id.get_output_index(), 3); - } } diff --git a/rust-libs/duniter-dbs/src/lib.rs b/rust-libs/duniter-dbs/src/lib.rs index 7004bd5b07c37789ef8ce7f9a686951e36f491ee..048cade01e04b3b134def393e7adc944996db023 100644 --- a/rust-libs/duniter-dbs/src/lib.rs +++ b/rust-libs/duniter-dbs/src/lib.rs @@ -64,16 +64,13 @@ pub use keys::source_key::SourceKeyV1; pub use keys::timestamp::TimestampKeyV1; pub use keys::ud_id::UdIdV2; pub use keys::uid::UidKeyV1; -pub use keys::utxo_id::GvaUtxoIdDbV1; pub use keys::wallet_conditions::{WalletConditionsV1, WalletConditionsV2}; -pub use keys::wallet_hash_with_bn::WalletHashWithBnV1Db; pub use values::block_db::{BlockDbEnum, BlockDbV1, BlockDbV2, TransactionInBlockDbV1}; pub use values::block_head_db::BlockHeadDbV1; pub use values::block_meta::BlockMetaV2; pub use values::block_number_array_db::BlockNumberArrayV1; pub use values::cindex_db::CIndexDbV1; pub use values::dunp_head::DunpHeadDbV1; -pub use values::gva_idty_db::GvaIdtyDbV1; pub use values::idty_db::IdtyDbV2; pub use values::iindex_db::IIndexDbV1; pub use values::kick_db::KickDbV1; @@ -82,12 +79,11 @@ pub use values::peer_card::PeerCardDbV1; pub use values::pubkey_db::{PubKeyValV2, PublicKeyArrayDbV1, PublicKeySingletonDbV1}; pub use values::sindex_db::{SIndexDBV1, SourceKeyArrayDbV1}; pub use values::source_amount::SourceAmountValV2; -pub use values::tx_db::{PendingTxDbV2, TxDbV2}; +pub use values::tx_db::PendingTxDbV2; pub use values::txs::BlockTxsDbV2; pub use values::ud_entry_db::{ConsumedUdDbV1, UdAmountDbV1, UdEntryDbV1}; pub use values::utxo::{BlockUtxosV2Db, UtxoValV2}; pub use values::wallet_db::WalletDbV1; -pub use values::wallet_script_array::WalletScriptArrayV2; pub use values::wallet_script_with_sa::WalletScriptWithSourceAmountV1Db; // Crate imports diff --git a/rust-libs/duniter-dbs/src/values.rs b/rust-libs/duniter-dbs/src/values.rs index b82603025d668e18d6b14214c4955d421fbec8b8..a77cb7fd247c3dd9d085da764bc323ca733eb8f2 100644 --- a/rust-libs/duniter-dbs/src/values.rs +++ b/rust-libs/duniter-dbs/src/values.rs @@ -19,7 +19,6 @@ pub mod block_meta; pub mod block_number_array_db; pub mod cindex_db; pub mod dunp_head; -pub mod gva_idty_db; pub mod idty_db; pub mod iindex_db; pub mod kick_db; @@ -33,5 +32,4 @@ pub mod txs; pub mod ud_entry_db; pub mod utxo; pub mod wallet_db; -pub mod wallet_script_array; pub mod wallet_script_with_sa; diff --git a/rust-libs/duniter-dbs/src/values/tx_db.rs b/rust-libs/duniter-dbs/src/values/tx_db.rs index a332c1413783d41f27616f24aa336a6a6956b638..f5009f85fbffca986f98bd366a0c965095a78196 100644 --- a/rust-libs/duniter-dbs/src/values/tx_db.rs +++ b/rust-libs/duniter-dbs/src/values/tx_db.rs @@ -50,42 +50,3 @@ impl ExplorableValue for PendingTxDbV2 { serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into())) } } - -#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] -pub struct TxDbV2 { - pub tx: TransactionDocumentV10, - pub written_block: Blockstamp, - pub written_time: i64, -} - -impl AsBytes for TxDbV2 { - fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { - let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); - f(bytes.as_ref()) - } -} - -impl kv_typed::prelude::FromBytes for TxDbV2 { - type Err = CorruptedBytes; - - fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { - Ok(bincode::deserialize(&bytes) - .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes)))?) - } -} - -impl ToDumpString for TxDbV2 { - fn to_dump_string(&self) -> String { - todo!() - } -} - -#[cfg(feature = "explorer")] -impl ExplorableValue for TxDbV2 { - fn from_explorer_str(source: &str) -> Result<Self, FromExplorerValueErr> { - Self::from_bytes(source.as_bytes()).map_err(|e| FromExplorerValueErr(e.0.into())) - } - fn to_explorer_json(&self) -> KvResult<serde_json::Value> { - serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into())) - } -} diff --git a/rust-libs/modules/gva/Cargo.toml b/rust-libs/modules/gva/Cargo.toml index f4928b033c04599ad6efb6dffbe83c60882873f7..877cb89b702246e1d85c397f8975514ce730a1cd 100644 --- a/rust-libs/modules/gva/Cargo.toml +++ b/rust-libs/modules/gva/Cargo.toml @@ -14,6 +14,7 @@ async-trait = "0.1.41" dubp = { version = "0.34.0" } duniter-conf = { path = "../../duniter-conf" } duniter-dbs = { path = "../../duniter-dbs" } +duniter-gva-db = { path = "./db" } duniter-gva-dbs-reader = { path = "./dbs-reader" } duniter-gva-indexer = { path = "./indexer" } duniter-gva-gql = { path = "./gql" } diff --git a/rust-libs/modules/gva/db/Cargo.toml b/rust-libs/modules/gva/db/Cargo.toml new file mode 100644 index 0000000000000000000000000000000000000000..de906c2bf809c437c7734b888c4876f76b2c65fb --- /dev/null +++ b/rust-libs/modules/gva/db/Cargo.toml @@ -0,0 +1,31 @@ +[package] +name = "duniter-gva-db" +version = "0.1.0" +authors = ["elois <elois@duniter.org>"] +description = "Duniter GVA DB" +repository = "https://git.duniter.org/nodes/typescript/duniter" +license = "AGPL-3.0" +edition = "2018" + +[lib] +path = "src/lib.rs" + +[dependencies] +bincode = "1.2.1" +chrono = { version = "0.4.15", optional = true } +duniter-dbs = { path = "../../../duniter-dbs" } +dubp = { version = "0.34.0" } +kv_typed = { path = "../../../tools/kv_typed", default-features = false, features = ["sled_backend"] } +paste = "1.0.2" +serde = { version = "1.0.105", features = ["derive"] } +serde_json = "1.0.53" +uninit = "0.4.0" +zerocopy = "0.3.0" + +[dev-dependencies] + +[features] +#default = ["explorer"] + +explorer = ["chrono", "duniter-dbs/explorer", "kv_typed/explorer"] +leveldb_backend = ["kv_typed/leveldb_backend"] diff --git a/rust-libs/modules/gva/db/src/keys.rs b/rust-libs/modules/gva/db/src/keys.rs new file mode 100644 index 0000000000000000000000000000000000000000..ced890746bed7f72d910bf66d2e3e0f26c3ea091 --- /dev/null +++ b/rust-libs/modules/gva/db/src/keys.rs @@ -0,0 +1,17 @@ +// Copyright (C) 2020 É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/>. + +pub mod gva_utxo_id; +pub mod wallet_hash_with_bn; diff --git a/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs b/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs new file mode 100644 index 0000000000000000000000000000000000000000..1f624a872a284fc84f87581a30af18aed9decfc4 --- /dev/null +++ b/rust-libs/modules/gva/db/src/keys/gva_utxo_id.rs @@ -0,0 +1,166 @@ +// Copyright (C) 2020 É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/>. + +use crate::*; +use uninit::prelude::*; + +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] +pub struct GvaUtxoIdDbV1([u8; 69]); // script hash ++ block_number ++ tx_hash ++ output_index + +impl Default for GvaUtxoIdDbV1 { + fn default() -> Self { + GvaUtxoIdDbV1([0u8; 69]) + } +} + +impl std::fmt::Display for GvaUtxoIdDbV1 { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{}:{}:{}:{}", + self.get_script_hash(), + self.get_block_number(), + self.get_tx_hash(), + self.get_output_index() + ) + } +} + +impl GvaUtxoIdDbV1 { + pub fn get_script_hash(&self) -> Hash { + let mut buffer = uninit_array![u8; 32]; + + buffer.as_out().copy_from_slice(&self.0[..32]); + + Hash(unsafe { std::mem::transmute(buffer) }) + } + pub fn get_block_number(&self) -> u32 { + let mut buffer = uninit_array![u8; 4]; + + buffer.as_out().copy_from_slice(&self.0[32..36]); + + u32::from_be_bytes(unsafe { std::mem::transmute(buffer) }) + } + pub fn get_tx_hash(&self) -> Hash { + let mut buffer = uninit_array![u8; 32]; + + buffer.as_out().copy_from_slice(&self.0[36..68]); + + Hash(unsafe { std::mem::transmute(buffer) }) + } + pub fn get_output_index(&self) -> u8 { + self.0[68] + } + pub fn new( + script: WalletScriptV10, + block_number: u32, + tx_hash: Hash, + output_index: u8, + ) -> Self { + let script_hash = Hash::compute(script.to_string().as_bytes()); + Self::new_(script_hash, block_number, tx_hash, output_index) + } + pub fn new_(script_hash: Hash, block_number: u32, tx_hash: Hash, output_index: u8) -> Self { + // TODO uncomment when feature const_generics became stable ! + /*let mut buffer = uninit_array![u8; 69]; + let (hash_buffer, rest_buffer) = buffer.as_out().split_at_out(32); + let (bn_buffer, rest_buffer) = rest_buffer.split_at_out(4); + let (tx_hash_buffer, output_index_buffer) = rest_buffer.split_at_out(32); + hash_buffer.copy_from_slice(script_hash.as_ref()); + bn_buffer.copy_from_slice(&block_number.to_be_bytes()[..]); + tx_hash_buffer.copy_from_slice(tx_hash.as_ref()); + output_index_buffer.copy_from_slice(&[output_index]); + + Self(unsafe { std::mem::transmute(buffer) })*/ + let mut buffer = [0u8; 69]; + buffer[..32].copy_from_slice(script_hash.as_ref()); + buffer[32..36].copy_from_slice(&block_number.to_be_bytes()[..]); + buffer[36..68].copy_from_slice(tx_hash.as_ref()); + buffer[68] = output_index; + Self(buffer) + } + pub fn script_interval(script_hash: Hash) -> (Self, Self) { + let mut buffer = [0; 69]; + buffer[..32].copy_from_slice(script_hash.as_ref()); + let min = Self(buffer); + let mut buffer = [255; 69]; + buffer[..32].copy_from_slice(script_hash.as_ref()); + let max = Self(buffer); + + (min, max) + } + pub fn script_block_interval( + script_hash: Hash, + block_number_start: u32, + block_number_end: u32, + ) -> (Self, Self) { + ( + Self::new_(script_hash, block_number_start, Hash::default(), 0), + Self::new_(script_hash, block_number_end, Hash::max(), u8::MAX), + ) + } +} + +impl AsBytes for GvaUtxoIdDbV1 { + fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { + f(&self.0[..]) + } +} + +impl FromBytes for GvaUtxoIdDbV1 { + type Err = CorruptedBytes; + + fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { + if bytes.len() == 69 { + // TODO uncomment when feature const_generics became stable ! + /*let mut buffer = uninit_array![u8; 69]; + buffer.as_out().copy_from_slice(bytes); + Ok(Self(unsafe { std::mem::transmute(buffer) }))*/ + let mut buffer = [0u8; 69]; + buffer.copy_from_slice(bytes); + Ok(Self(buffer)) + } else { + Err(CorruptedBytes("db corrupted".to_owned())) + } + } +} + +#[cfg(feature = "explorer")] +impl ExplorableKey for GvaUtxoIdDbV1 { + fn from_explorer_str(_: &str) -> std::result::Result<Self, FromExplorerKeyErr> { + unimplemented!() + } + fn to_explorer_string(&self) -> KvResult<String> { + Ok(self.to_string()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn utxo_gva_id_new() { + let script = WalletScriptV10::single(WalletConditionV10::Csv(86_400)); + let script_hash = Hash::compute(script.to_string().as_bytes()); + let tx_hash = Hash::default(); + let utxo_gva_id = GvaUtxoIdDbV1::new(script, 42, tx_hash, 3); + + assert_eq!(utxo_gva_id.get_script_hash(), script_hash); + assert_eq!(utxo_gva_id.get_block_number(), 42); + assert_eq!(utxo_gva_id.get_tx_hash(), tx_hash); + assert_eq!(utxo_gva_id.get_output_index(), 3); + } +} diff --git a/rust-libs/duniter-dbs/src/keys/wallet_hash_with_bn.rs b/rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs similarity index 100% rename from rust-libs/duniter-dbs/src/keys/wallet_hash_with_bn.rs rename to rust-libs/modules/gva/db/src/keys/wallet_hash_with_bn.rs diff --git a/rust-libs/duniter-dbs/src/databases/gva_v1.rs b/rust-libs/modules/gva/db/src/lib.rs similarity index 60% rename from rust-libs/duniter-dbs/src/databases/gva_v1.rs rename to rust-libs/modules/gva/db/src/lib.rs index 4990d0053774ab0d5a49af0d8b0e9b875029b0b8..e1e3d69758b5b669020b3358b880b39211820d01 100644 --- a/rust-libs/duniter-dbs/src/databases/gva_v1.rs +++ b/rust-libs/modules/gva/db/src/lib.rs @@ -13,14 +13,42 @@ // 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/>. -use crate::*; +#![deny( + clippy::unwrap_used, + missing_copy_implementations, + trivial_casts, + trivial_numeric_casts, + unstable_features, + unused_import_braces +)] + +mod keys; +mod values; + +pub use keys::gva_utxo_id::GvaUtxoIdDbV1; +pub use keys::wallet_hash_with_bn::WalletHashWithBnV1Db; +pub use values::gva_idty_db::GvaIdtyDbV1; +pub use values::gva_tx::GvaTxDbV1; +pub use values::wallet_script_array::WalletScriptArrayV2; + +pub(crate) use dubp::common::prelude::*; +pub(crate) use dubp::crypto::hashs::Hash; +pub(crate) use dubp::wallet::prelude::*; +pub(crate) use duniter_dbs::smallvec::SmallVec; +pub(crate) use duniter_dbs::{ + CorruptedBytes, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, ToDumpString, WalletConditionsV2, +}; +pub(crate) use kv_typed::db_schema; +pub(crate) use kv_typed::prelude::*; +pub(crate) use serde::{Deserialize, Serialize}; +pub(crate) use std::collections::BTreeSet; db_schema!( GvaV1, [ ["blocks_with_ud", BlocksWithUd, U32BE, ()], ["blockchain_time", BlockchainTime, U32BE, u64], - ["txs", Txs, HashKeyV2, TxDbV2], + ["txs", Txs, HashKeyV2, GvaTxDbV1], ["txs_by_issuer", TxsByIssuer, WalletHashWithBnV1Db, BTreeSet<Hash>], ["txs_by_recipient", TxsByRecipient, WalletHashWithBnV1Db, BTreeSet<Hash>], [ diff --git a/rust-libs/modules/gva/db/src/values.rs b/rust-libs/modules/gva/db/src/values.rs new file mode 100644 index 0000000000000000000000000000000000000000..ed42095fa54010e5d37f4557d94d2f18d45df1d0 --- /dev/null +++ b/rust-libs/modules/gva/db/src/values.rs @@ -0,0 +1,18 @@ +// Copyright (C) 2020 É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/>. + +pub mod gva_idty_db; +pub mod gva_tx; +pub mod wallet_script_array; diff --git a/rust-libs/duniter-dbs/src/values/gva_idty_db.rs b/rust-libs/modules/gva/db/src/values/gva_idty_db.rs similarity index 100% rename from rust-libs/duniter-dbs/src/values/gva_idty_db.rs rename to rust-libs/modules/gva/db/src/values/gva_idty_db.rs diff --git a/rust-libs/modules/gva/db/src/values/gva_tx.rs b/rust-libs/modules/gva/db/src/values/gva_tx.rs new file mode 100644 index 0000000000000000000000000000000000000000..5bb8deaf788084455c820ee571055eb652edbeb2 --- /dev/null +++ b/rust-libs/modules/gva/db/src/values/gva_tx.rs @@ -0,0 +1,57 @@ +// Copyright (C) 2020 É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/>. + +use crate::*; + +use dubp::documents::transaction::TransactionDocumentV10; + +#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)] +pub struct GvaTxDbV1 { + pub tx: TransactionDocumentV10, + pub written_block: Blockstamp, + pub written_time: i64, +} + +impl AsBytes for GvaTxDbV1 { + fn as_bytes<T, F: FnMut(&[u8]) -> T>(&self, mut f: F) -> T { + let bytes = bincode::serialize(self).unwrap_or_else(|_| unreachable!()); + f(bytes.as_ref()) + } +} + +impl kv_typed::prelude::FromBytes for GvaTxDbV1 { + type Err = CorruptedBytes; + + fn from_bytes(bytes: &[u8]) -> std::result::Result<Self, Self::Err> { + Ok(bincode::deserialize(&bytes) + .map_err(|e| CorruptedBytes(format!("{}: '{:?}'", e, bytes)))?) + } +} + +impl ToDumpString for GvaTxDbV1 { + fn to_dump_string(&self) -> String { + todo!() + } +} + +#[cfg(feature = "explorer")] +impl ExplorableValue for GvaTxDbV1 { + fn from_explorer_str(source: &str) -> Result<Self, FromExplorerValueErr> { + Self::from_bytes(source.as_bytes()).map_err(|e| FromExplorerValueErr(e.0.into())) + } + fn to_explorer_json(&self) -> KvResult<serde_json::Value> { + serde_json::to_value(self).map_err(|e| KvError::DeserError(e.into())) + } +} diff --git a/rust-libs/duniter-dbs/src/values/wallet_script_array.rs b/rust-libs/modules/gva/db/src/values/wallet_script_array.rs similarity index 99% rename from rust-libs/duniter-dbs/src/values/wallet_script_array.rs rename to rust-libs/modules/gva/db/src/values/wallet_script_array.rs index 719a5adde8dc2a7c6ba32053cb0b80c8e78fca47..d0b4fa932549d1e14620c3274ced6295708d59c1 100644 --- a/rust-libs/duniter-dbs/src/values/wallet_script_array.rs +++ b/rust-libs/modules/gva/db/src/values/wallet_script_array.rs @@ -14,7 +14,6 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::*; - #[derive(Debug, Default, PartialEq)] pub struct WalletScriptArrayV2(pub std::collections::HashSet<WalletScriptV10>); diff --git a/rust-libs/modules/gva/dbs-reader/Cargo.toml b/rust-libs/modules/gva/dbs-reader/Cargo.toml index ee4a45a66f30daa9b14617c1c80540065ec003a6..5fc05c9c6dbf1b339e97b35a2f48c0789b1e856a 100644 --- a/rust-libs/modules/gva/dbs-reader/Cargo.toml +++ b/rust-libs/modules/gva/dbs-reader/Cargo.toml @@ -14,6 +14,7 @@ path = "src/lib.rs" [dependencies] anyhow = "1.0.34" duniter-dbs = { path = "../../../duniter-dbs" } +duniter-gva-db = { path = "../db" } dubp = { version = "0.34.0" } resiter = "0.4.0" diff --git a/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs b/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs index ffb3b9c8a575fd26e1a955bb07044c050899a024..f47df7437977b655c576e9c7f39c5cb78c0aeea8 100644 --- a/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs +++ b/rust-libs/modules/gva/dbs-reader/src/find_inputs.rs @@ -139,17 +139,17 @@ impl DbsReader { mod tests { use super::*; use duniter_dbs::{ - databases::{bc_v2::BcV2DbWritable, gva_v1::GvaV1DbWritable, txs_mp_v2::TxsMpV2DbWritable}, - BlockMetaV2, GvaUtxoIdDbV1, SourceAmountValV2, UdIdV2, UtxoIdDbV2, UtxoValV2, - WalletConditionsV2, + databases::{bc_v2::BcV2DbWritable, txs_mp_v2::TxsMpV2DbWritable}, + BlockMetaV2, SourceAmountValV2, UdIdV2, UtxoIdDbV2, UtxoValV2, WalletConditionsV2, }; + use duniter_gva_db::{GvaUtxoIdDbV1, GvaV1DbWritable}; const UD0: i64 = 100; #[test] fn test_find_inputs() -> anyhow::Result<()> { let bc_db = duniter_dbs::databases::bc_v2::BcV2Db::<Mem>::open(MemConf::default())?; - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?; let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) }); let txs_mp_db = duniter_dbs::databases::txs_mp_v2::TxsMpV2Db::<Mem>::open(MemConf::default())?; diff --git a/rust-libs/modules/gva/dbs-reader/src/lib.rs b/rust-libs/modules/gva/dbs-reader/src/lib.rs index 5d346812c4a3753227be6a8208fdb5b996460e99..758192db8817156ccc7d2ebf3d86a8deb9f8eab0 100644 --- a/rust-libs/modules/gva/dbs-reader/src/lib.rs +++ b/rust-libs/modules/gva/dbs-reader/src/lib.rs @@ -41,14 +41,12 @@ use duniter_dbs::{ databases::{ bc_v2::{BcV2DbReadable, BcV2DbRo}, cm_v1::CmV1DbReadable, - gva_v1::{GvaV1DbReadable, GvaV1DbRo}, txs_mp_v2::TxsMpV2DbReadable, }, BlockMetaV2, }; -use duniter_dbs::{ - kv_typed::prelude::*, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, TxDbV2, UtxoIdDbV2, -}; +use duniter_dbs::{kv_typed::prelude::*, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, UtxoIdDbV2}; +use duniter_gva_db::{GvaIdtyDbV1, GvaTxDbV1, GvaUtxoIdDbV1, GvaV1DbReadable, GvaV1DbRo}; use resiter::filter::Filter; use resiter::filter_map::FilterMap; use resiter::flatten::Flatten; @@ -119,8 +117,8 @@ impl DbsReader { #[cfg(test)] impl DbsReader { pub(crate) fn mem() -> Self { - use duniter_dbs::databases::gva_v1::GvaV1DbWritable; - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default()) + use duniter_gva_db::GvaV1DbWritable; + let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default()) .expect("fail to create memory gva db"); create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) }) } diff --git a/rust-libs/modules/gva/dbs-reader/src/txs_history.rs b/rust-libs/modules/gva/dbs-reader/src/txs_history.rs index 3633239db08a6de5c220f6206fc22691d1412d1c..57943ead7967b2e1792d9cfb13ea0dd6719fa320 100644 --- a/rust-libs/modules/gva/dbs-reader/src/txs_history.rs +++ b/rust-libs/modules/gva/dbs-reader/src/txs_history.rs @@ -14,7 +14,8 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::*; -use duniter_dbs::{smallvec::SmallVec, WalletHashWithBnV1Db}; +use duniter_dbs::smallvec::SmallVec; +use duniter_gva_db::WalletHashWithBnV1Db; #[derive(Clone, Copy, Debug, Default, Eq, Ord, PartialEq, PartialOrd)] pub struct TxBcCursor { @@ -50,7 +51,7 @@ impl DbsReader { &self, page_info: PageInfo<TxBcCursor>, script_hash: Hash, - ) -> KvResult<PagedData<VecDeque<TxDbV2>>> { + ) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> { let mut start_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(0)); let mut end_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(u32::MAX)); let first_cursor_opt = if page_info.not_all() { @@ -124,7 +125,7 @@ impl DbsReader { .0 .txs_by_recipient() .iter_ref_slice(start_k..=end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 8]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new(); for hash in hashs { if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -146,7 +147,7 @@ impl DbsReader { .0 .txs_by_recipient() .iter_ref_slice_rev(start_k..=end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 8]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new(); for hash in hashs { if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -169,7 +170,7 @@ impl DbsReader { &self, page_info: PageInfo<TxBcCursor>, script_hash: Hash, - ) -> KvResult<PagedData<VecDeque<TxDbV2>>> { + ) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> { let mut start_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(0)); let mut end_k = WalletHashWithBnV1Db::new(script_hash, BlockNumber(u32::MAX)); let first_cursor_opt = if page_info.not_all() { @@ -247,7 +248,7 @@ impl DbsReader { .0 .txs_by_issuer() .iter_ref_slice(start_k..=end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 8]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new(); for hash in hashs { if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -269,7 +270,7 @@ impl DbsReader { .0 .txs_by_issuer() .iter_ref_slice_rev(start_k..=end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 8]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 8]>::new(); for hash in hashs.iter().rev() { if let Some(tx_db) = self.0.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -321,14 +322,14 @@ impl DbsReader { } } -fn txs_history_bc_collect<I: Iterator<Item = KvResult<TxDbV2>>>( +fn txs_history_bc_collect<I: Iterator<Item = KvResult<GvaTxDbV1>>>( dbs_reader: DbsReader, first_cursor_opt: Option<TxBcCursor>, first_hashs_opt: Option<SmallVec<[Hash; 8]>>, last_cursor_opt: Option<TxBcCursor>, page_info: PageInfo<TxBcCursor>, txs_iter: I, -) -> KvResult<PagedData<VecDeque<TxDbV2>>> { +) -> KvResult<PagedData<VecDeque<GvaTxDbV1>>> { let mut txs = if let Some(limit) = page_info.limit_opt { txs_iter.take(limit).collect::<KvResult<VecDeque<_>>>()? } else { @@ -384,8 +385,8 @@ fn txs_history_bc_collect<I: Iterator<Item = KvResult<TxDbV2>>>( // Needed for BMA only pub struct TxsHistory { - pub sent: Vec<TxDbV2>, - pub received: Vec<TxDbV2>, + pub sent: Vec<GvaTxDbV1>, + pub received: Vec<GvaTxDbV1>, pub sending: Vec<TransactionDocumentV10>, pub pending: Vec<TransactionDocumentV10>, } @@ -403,7 +404,7 @@ pub fn get_transactions_history_for_bma<GvaDb: GvaV1DbReadable, TxsMpDb: TxsMpV2 let sent = gva_db_ro .txs_by_issuer() .iter_ref_slice(start_k..end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 2]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 2]>::new(); for hash in hashs { if let Some(tx_db) = gva_db_ro.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -417,7 +418,7 @@ pub fn get_transactions_history_for_bma<GvaDb: GvaV1DbReadable, TxsMpDb: TxsMpV2 let received = gva_db_ro .txs_by_recipient() .iter_ref_slice(start_k..end_k, |_k, hashs| { - let mut sent = SmallVec::<[TxDbV2; 2]>::new(); + let mut sent = SmallVec::<[GvaTxDbV1; 2]>::new(); for hash in hashs { if let Some(tx_db) = gva_db_ro.txs().get(HashKeyV2::from_ref(hash))? { sent.push(tx_db); @@ -468,12 +469,12 @@ mod tests { documents::transaction::{TransactionDocumentV10, TransactionDocumentV10Stringified}, documents_parser::prelude::FromStringObject, }; - use duniter_dbs::databases::gva_v1::GvaV1DbWritable; + use duniter_gva_db::GvaV1DbWritable; use maplit::btreeset; use unwrap::unwrap; - fn gen_tx(hash: Hash, written_block_number: BlockNumber) -> TxDbV2 { - TxDbV2 { + fn gen_tx(hash: Hash, written_block_number: BlockNumber) -> GvaTxDbV1 { + GvaTxDbV1 { tx: unwrap!(TransactionDocumentV10::from_string_object( &TransactionDocumentV10Stringified { currency: "test".to_owned(), @@ -500,7 +501,7 @@ mod tests { #[test] fn test_get_txs_history_bc_sent() -> KvResult<()> { - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?; let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) }); let s1 = WalletScriptV10::single_sig(PublicKey::default()); diff --git a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs index 873ba9e471f4508371fc9a1ba7a370b43dfc3775..669d3d5e7e9ce3394993354b433c72acd03e7cba 100644 --- a/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs +++ b/rust-libs/modules/gva/dbs-reader/src/uds_of_pubkey.rs @@ -17,7 +17,7 @@ use crate::*; use duniter_dbs::smallvec::SmallVec; use duniter_dbs::{ databases::bc_v2::{UdsEvent, UdsRevalEvent}, - GvaIdtyDbV1, UdIdV2, + UdIdV2, }; #[derive(Debug, Default)] @@ -472,10 +472,8 @@ mod tests { use super::*; use duniter_dbs::smallvec::smallvec as svec; - use duniter_dbs::{ - databases::{bc_v2::BcV2DbWritable, gva_v1::GvaV1DbWritable}, - SourceAmountValV2, UdIdV2, - }; + use duniter_dbs::{databases::bc_v2::BcV2DbWritable, SourceAmountValV2, UdIdV2}; + use duniter_gva_db::GvaV1DbWritable; use std::iter::FromIterator; #[test] @@ -538,7 +536,7 @@ mod tests { let bc_db = duniter_dbs::databases::bc_v2::BcV2Db::<Mem>::open(MemConf::default())?; let bc_db_ro = bc_db.get_ro_handler(); - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?; let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) }); bc_db .uds_reval_write() diff --git a/rust-libs/modules/gva/dbs-reader/src/utxos.rs b/rust-libs/modules/gva/dbs-reader/src/utxos.rs index d7fa505352021ab90c62015b952aa92bd7a2a73e..902755ce5171851509af54898e2d84c0108ea3de 100644 --- a/rust-libs/modules/gva/dbs-reader/src/utxos.rs +++ b/rust-libs/modules/gva/dbs-reader/src/utxos.rs @@ -14,7 +14,7 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use dubp::documents::dubp_wallet::prelude::*; -use duniter_dbs::{GvaUtxoIdDbV1, SourceAmountValV2}; +use duniter_dbs::SourceAmountValV2; use crate::*; @@ -251,14 +251,14 @@ where mod tests { use super::*; - use duniter_dbs::databases::gva_v1::GvaV1DbWritable; use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbWritable; + use duniter_gva_db::GvaV1DbWritable; #[test] fn test_find_script_utxos() -> anyhow::Result<()> { let script = WalletScriptV10::single_sig(PublicKey::default()); - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = duniter_gva_db::GvaV1Db::<Mem>::open(MemConf::default())?; let db_reader = create_dbs_reader(unsafe { std::mem::transmute(&gva_db.get_ro_handler()) }); let txs_mp_db = duniter_dbs::databases::txs_mp_v2::TxsMpV2Db::<Mem>::open(MemConf::default())?; diff --git a/rust-libs/modules/gva/gql/Cargo.toml b/rust-libs/modules/gva/gql/Cargo.toml index 50472efbabc54fb354c06c8925bc9a6847f4ff9f..58ee67e439828d7336a382070dde2eb1323230bd 100644 --- a/rust-libs/modules/gva/gql/Cargo.toml +++ b/rust-libs/modules/gva/gql/Cargo.toml @@ -14,6 +14,7 @@ dubp = { version = "0.34.0" } duniter-conf = { path = "../../../duniter-conf" } duniter-dbs = { path = "../../../duniter-dbs" } duniter-bc-reader = { path = "../../../duniter-bc-reader" } +duniter-gva-db = { path = "../db" } duniter-gva-dbs-reader = { path = "../dbs-reader" } duniter-mempools = { path = "../../../duniter-mempools" } duniter-module = { path = "../../../duniter-module" } diff --git a/rust-libs/modules/gva/gql/src/entities/tx_gva.rs b/rust-libs/modules/gva/gql/src/entities/tx_gva.rs index baef6344e4a1ee0389534714e2032c7c2372c289..6fd3764338d17b728705c301a3383c08f243b6c1 100644 --- a/rust-libs/modules/gva/gql/src/entities/tx_gva.rs +++ b/rust-libs/modules/gva/gql/src/entities/tx_gva.rs @@ -13,9 +13,9 @@ // 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/>. -use dubp::documents::transaction::TransactionDocumentV10Stringified; - use crate::*; +use dubp::documents::transaction::TransactionDocumentV10Stringified; +use duniter_gva_db::GvaTxDbV1; #[derive(async_graphql::SimpleObject)] pub(crate) struct TxGva { @@ -47,8 +47,8 @@ pub(crate) struct TxGva { pub written_time: Option<i64>, } -impl From<TxDbV2> for TxGva { - fn from(db_tx: TxDbV2) -> Self { +impl From<GvaTxDbV1> for TxGva { + fn from(db_tx: GvaTxDbV1) -> Self { let mut self_: TxGva = (&db_tx.tx).into(); self_.written_block = Some(db_tx.written_block.to_string()); self_.written_time = Some(db_tx.written_time); diff --git a/rust-libs/modules/gva/gql/src/lib.rs b/rust-libs/modules/gva/gql/src/lib.rs index b405760862033ef7a4a7ecf200eafd503d330fae..09cab530d8ee335f991c5d91c24ffda5e7ffd7bc 100644 --- a/rust-libs/modules/gva/gql/src/lib.rs +++ b/rust-libs/modules/gva/gql/src/lib.rs @@ -56,7 +56,7 @@ use dubp::documents_parser::prelude::*; use dubp::wallet::prelude::*; use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbReadable; use duniter_dbs::prelude::*; -use duniter_dbs::{kv_typed::prelude::*, FileBackend, TxDbV2}; +use duniter_dbs::{kv_typed::prelude::*, FileBackend}; use duniter_gva_dbs_reader::pagination::PageInfo; #[cfg(not(test))] use duniter_gva_dbs_reader::DbsReader; @@ -136,12 +136,12 @@ mod tests { &self, page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>, script_hash: Hash, - ) -> KvResult<PagedData<VecDeque<TxDbV2>>>; + ) -> KvResult<PagedData<VecDeque<duniter_gva_db::GvaTxDbV1>>>; fn get_txs_history_bc_sent( &self, page_info: PageInfo<duniter_gva_dbs_reader::txs_history::TxBcCursor>, script_hash: Hash, - ) -> KvResult<PagedData<VecDeque<TxDbV2>>>; + ) -> KvResult<PagedData<VecDeque<duniter_gva_db::GvaTxDbV1>>>; fn get_txs_history_mempool<TxsMpDb: 'static + TxsMpV2DbReadable>( &self, txs_mp_db_ro: &TxsMpDb, diff --git a/rust-libs/modules/gva/gql/src/queries/txs_history.rs b/rust-libs/modules/gva/gql/src/queries/txs_history.rs index 3084016708b2b897163860bba8e27f088b74ec57..0f855fe86a21dd995eb5da5662dbf1c07297485f 100644 --- a/rust-libs/modules/gva/gql/src/queries/txs_history.rs +++ b/rust-libs/modules/gva/gql/src/queries/txs_history.rs @@ -15,6 +15,7 @@ use crate::*; use dubp::documents_parser::wallet_script_from_str; +use duniter_gva_db::GvaTxDbV1; use duniter_gva_dbs_reader::txs_history::TxBcCursor; use futures::future::join; @@ -84,7 +85,7 @@ impl TxsHistoryBlockchainQueryInner { .into_iter() .map(|db_tx| (TxDirection::Received, db_tx)), ) - .collect::<Vec<(TxDirection, TxDbV2)>>(); + .collect::<Vec<(TxDirection, GvaTxDbV1)>>(); /*if let Some(TxBcCursor { tx_hash, .. }) = pagination.pos() { while both.txs }*/ @@ -229,7 +230,7 @@ mod tests { use dubp::documents::transaction::TransactionDocumentV10; use dubp::documents::transaction::TransactionDocumentV10Stringified; use dubp::documents_parser::prelude::FromStringObject; - use duniter_dbs::TxDbV2; + use duniter_gva_db::GvaTxDbV1; use duniter_gva_dbs_reader::pagination::PagedData; #[tokio::test] @@ -264,7 +265,7 @@ mod tests { ) .expect("wrong tx"); let mut expected_data = VecDeque::new(); - expected_data.push_back(TxDbV2 { + expected_data.push_back(GvaTxDbV1 { tx, ..Default::default() }); diff --git a/rust-libs/modules/gva/indexer/Cargo.toml b/rust-libs/modules/gva/indexer/Cargo.toml index 5747bdc661dd490b74c347a8a3a72227b49dcfeb..7d3cbd23adbba98fdf80723c923f0a1bcc61111e 100644 --- a/rust-libs/modules/gva/indexer/Cargo.toml +++ b/rust-libs/modules/gva/indexer/Cargo.toml @@ -14,6 +14,7 @@ path = "src/lib.rs" [dependencies] anyhow = "1.0.34" duniter-dbs = { path = "../../../duniter-dbs" } +duniter-gva-db = { path = "../db" } dubp = { version = "0.34.0" } once_cell = "1.5.2" resiter = "0.4.0" diff --git a/rust-libs/modules/gva/indexer/src/identities.rs b/rust-libs/modules/gva/indexer/src/identities.rs index 4815d39a96ef9444bba89d7a67b168cc91a62af8..0a33b376b0113412977700cc337c5eda5b586b5b 100644 --- a/rust-libs/modules/gva/indexer/src/identities.rs +++ b/rust-libs/modules/gva/indexer/src/identities.rs @@ -14,7 +14,6 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::*; -use duniter_dbs::databases::gva_v1::GvaIdentitiesEvent; pub(crate) fn update_identities<B: Backend>( block: &DubpBlockV10, diff --git a/rust-libs/modules/gva/indexer/src/lib.rs b/rust-libs/modules/gva/indexer/src/lib.rs index 9ed890d4b7090abbe9a9cb44e518bc5f84a81863..8e39e42d1373b8fe46f52f407319c76849ca0337 100644 --- a/rust-libs/modules/gva/indexer/src/lib.rs +++ b/rust-libs/modules/gva/indexer/src/lib.rs @@ -33,13 +33,11 @@ use dubp::documents::{ prelude::*, transaction::TransactionDocumentTrait, transaction::TransactionDocumentV10, }; use dubp::wallet::prelude::*; -use duniter_dbs::databases::gva_v1::*; use duniter_dbs::{ - databases::gva_v1::{GvaV1Db, GvaV1DbReadable, GvaV1DbWritable}, - kv_typed::prelude::*, - prelude::*, - FileBackend, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, TxDbV2, WalletConditionsV2, + kv_typed::prelude::*, prelude::*, FileBackend, HashKeyV2, PubKeyKeyV2, SourceAmountValV2, + WalletConditionsV2, }; +use duniter_gva_db::*; use resiter::filter::Filter; use std::{ collections::{BTreeSet, HashMap}, @@ -56,7 +54,7 @@ pub fn get_gva_db_ro(profile_path_opt: Option<&Path>) -> &'static GvaV1DbRo<File } pub fn get_gva_db_rw(profile_path_opt: Option<&Path>) -> &'static GvaV1Db<FileBackend> { GVA_DB_RW.get_or_init(|| { - duniter_dbs::databases::gva_v1::GvaV1Db::<FileBackend>::open(FileBackend::gen_backend_conf( + duniter_gva_db::GvaV1Db::<FileBackend>::open(FileBackend::gen_backend_conf( "gva_v1", profile_path_opt, )) @@ -250,11 +248,9 @@ mod tests { documents::transaction::TransactionDocumentV10Stringified, documents_parser::prelude::FromStringObject, }; - use duniter_dbs::GvaUtxoIdDbV1; - #[test] fn test_gva_apply_block() -> anyhow::Result<()> { - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?; let s1 = WalletScriptV10::single_sig(PublicKey::from_base58( "D9D2zaJoWYWveii1JRYLVK3J4Z7ZH3QczoKrnQeiM6mx", diff --git a/rust-libs/modules/gva/indexer/src/tx.rs b/rust-libs/modules/gva/indexer/src/tx.rs index ba0b62eb61068a862ef2d354723440913215526f..a2cb6b4a7447a6f2c0b2e32630a417463ea8c389 100644 --- a/rust-libs/modules/gva/indexer/src/tx.rs +++ b/rust-libs/modules/gva/indexer/src/tx.rs @@ -14,7 +14,6 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::*; -use duniter_dbs::{databases::gva_v1::BalancesEvent, WalletHashWithBnV1Db}; pub(crate) type ScriptsHash = HashMap<WalletScriptV10, Hash>; @@ -140,7 +139,7 @@ pub(crate) fn apply_tx<B: Backend>( // Insert tx itself txs.upsert( HashKeyV2(tx_hash), - TxDbV2 { + GvaTxDbV1 { tx: tx.clone(), written_block: current_blockstamp, written_time: current_time, @@ -315,7 +314,7 @@ mod tests { let o1_amount = ud0_amount - SourceAmount::with_base0(600); let o2_amount = ud0_amount - SourceAmount::with_base0(400); - let gva_db = duniter_dbs::databases::gva_v1::GvaV1Db::<Mem>::open(MemConf::default())?; + let gva_db = GvaV1Db::<Mem>::open(MemConf::default())?; let b0 = BlockMetaV2 { dividend: Some(ud0_amount), diff --git a/rust-libs/modules/gva/indexer/src/utxos.rs b/rust-libs/modules/gva/indexer/src/utxos.rs index b04ac63f34852e44035c2b5809589fb58a8a85ff..91ec82723ebb0c51605b05cd710739df339a15fd 100644 --- a/rust-libs/modules/gva/indexer/src/utxos.rs +++ b/rust-libs/modules/gva/indexer/src/utxos.rs @@ -14,11 +14,10 @@ // along with this program. If not, see <https://www.gnu.org/licenses/>. use crate::*; -use duniter_dbs::GvaUtxoIdDbV1; pub(crate) fn write_utxo_v10<'s, B: Backend>( - scripts_by_pubkey: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::ScriptsByPubkeyEvent>, - gva_utxos: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::GvaUtxosEvent>, + scripts_by_pubkey: &mut TxColRw<B::Col, ScriptsByPubkeyEvent>, + gva_utxos: &mut TxColRw<B::Col, GvaUtxosEvent>, utxo: UtxoV10<'s>, utxo_script_hash: Hash, ) -> KvResult<()> { @@ -49,8 +48,8 @@ pub(crate) fn write_utxo_v10<'s, B: Backend>( } pub(crate) fn remove_utxo_v10<B: Backend>( - scripts_by_pubkey: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::ScriptsByPubkeyEvent>, - gva_utxos: &mut TxColRw<B::Col, duniter_dbs::databases::gva_v1::GvaUtxosEvent>, + scripts_by_pubkey: &mut TxColRw<B::Col, ScriptsByPubkeyEvent>, + gva_utxos: &mut TxColRw<B::Col, GvaUtxosEvent>, utxo_id: UtxoIdV10, utxo_script: &WalletScriptV10, utxo_script_hash: Hash, diff --git a/rust-libs/modules/gva/src/lib.rs b/rust-libs/modules/gva/src/lib.rs index f08943affefd1048d3a261f8f3817563c1add5b6..809b5953fff887a739d780b5ef1e3de92b223e74 100644 --- a/rust-libs/modules/gva/src/lib.rs +++ b/rust-libs/modules/gva/src/lib.rs @@ -32,12 +32,10 @@ use dubp::common::crypto::keys::{ed25519::PublicKey, KeyPair as _}; use dubp::common::prelude::*; use dubp::documents::transaction::TransactionDocumentV10; use dubp::{block::DubpBlockV10, crypto::hashs::Hash}; -use duniter_dbs::databases::{ - gva_v1::{GvaV1DbReadable, GvaV1DbRo}, - txs_mp_v2::TxsMpV2DbReadable, -}; +use duniter_dbs::databases::txs_mp_v2::TxsMpV2DbReadable; use duniter_dbs::prelude::*; -use duniter_dbs::{kv_typed::prelude::*, FileBackend, TxDbV2}; +use duniter_dbs::{kv_typed::prelude::*, FileBackend}; +use duniter_gva_db::*; use duniter_gva_gql::GvaSchema; use duniter_gva_indexer::{get_gva_db_ro, get_gva_db_rw}; use duniter_mempools::Mempools; @@ -177,7 +175,7 @@ impl duniter_module::DuniterModule for GvaModule { sent: sent .into_iter() .map( - |TxDbV2 { + |GvaTxDbV1 { tx, written_block, written_time, @@ -187,7 +185,7 @@ impl duniter_module::DuniterModule for GvaModule { received: received .into_iter() .map( - |TxDbV2 { + |GvaTxDbV1 { tx, written_block, written_time,