From e37f55f390394b67557a3c2dda211030789a26eb Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Mon, 17 May 2021 15:32:38 +0200 Subject: [PATCH] feat(indexer): add currency params --- Cargo.lock | 69 ++++++++++--------- neon/native/Cargo.toml | 2 +- rust-bins/duniter-dbex/Cargo.toml | 4 +- rust-bins/duniter-dbex/src/migrate.rs | 6 +- rust-libs/duniter-server/Cargo.toml | 2 +- .../src/legacy/block_indexer.rs | 37 +++++++++- rust-libs/duniter-server/src/lib.rs | 9 ++- .../duniter-integration-tests/Cargo.toml | 2 +- 8 files changed, 88 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aecf6dc42..b5c33ae95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -304,6 +304,7 @@ dependencies = [ "constant_time_eq", "crypto-mac", "digest 0.9.0", + "rayon", ] [[package]] @@ -785,9 +786,9 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dubp" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5cee825e59cde21a3622de781d15f74cbea92f01eb1554a8c73818eb61a5998" +checksum = "c5dca084e135ee5ea38d64e5e665cac6fc23570a66ed22ce5021b5d14c4f9443" dependencies = [ "dubp-block", "dubp-common", @@ -799,9 +800,9 @@ dependencies = [ [[package]] name = "dubp-block" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b26027dafcf4631bd7d7a2b1b25e54453c475a613b5ef7db4356f51f71c0eb" +checksum = "5fa8e2b1d9728832dd4696f9eff1348085d162d5f98fe025e9c9a2caeffd9c89" dependencies = [ "dubp-documents", "dubp-documents-parser", @@ -814,9 +815,9 @@ dependencies = [ [[package]] name = "dubp-common" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc000f2a3366c1bd985015f95adb3520e8e0b007ca5f77882eea1ea119d84f4" +checksum = "49a12c0842c7c4e61e75755476b782d09e282275cab187376b3cc0da405b6afb" dependencies = [ "dup-crypto", "serde", @@ -827,9 +828,9 @@ dependencies = [ [[package]] name = "dubp-documents" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e96808a8ced0617ba93ed6fee00d88902f33e2f61a36ec9a841e8972ef5cd3a" +checksum = "450f2b268c979264ef098f00532faf0015d281d9c8ebabf227f57ecc35d0076c" dependencies = [ "beef", "dubp-wallet", @@ -841,9 +842,9 @@ dependencies = [ [[package]] name = "dubp-documents-parser" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c60f5c2804a9906777f96a62514c1f9f58abaab4c57f01db4fa7c45624e6fb" +checksum = "067bba5a1e34566871128b7157642a643264e4aeaba1db5034634ef6461f797b" dependencies = [ "dubp-documents", "json-pest-parser", @@ -855,9 +856,9 @@ dependencies = [ [[package]] name = "dubp-wallet" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f277bed6bc228981f76f207f4112051656302b5c50c0a858ab138ae2215d49fe" +checksum = "7552a1c1cca8498dc9266fdb6b10ee98ef841e363a1e3c0cd319ead3fa2aeef4" dependencies = [ "byteorder", "dubp-common", @@ -870,9 +871,11 @@ dependencies = [ [[package]] name = "dubp-wot" version = "0.11.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "log", + "once_cell", + "parking_lot", "rayon", "serde", ] @@ -880,7 +883,7 @@ dependencies = [ [[package]] name = "duniter-bc-reader" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "anyhow", "dubp", @@ -891,7 +894,7 @@ dependencies = [ [[package]] name = "duniter-bca" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "arrayvec 0.7.0", @@ -914,7 +917,7 @@ dependencies = [ [[package]] name = "duniter-bca-types" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "arrayvec 0.7.0", "bincode", @@ -946,7 +949,7 @@ dependencies = [ [[package]] name = "duniter-conf" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "anyhow", "dubp", @@ -960,8 +963,9 @@ dependencies = [ [[package]] name = "duniter-core" version = "1.8.1" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ + "dubp-wot", "duniter-bc-reader", "duniter-conf", "duniter-dbs", @@ -997,7 +1001,7 @@ dependencies = [ [[package]] name = "duniter-dbs" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "arrayvec 0.7.0", "bincode", @@ -1020,7 +1024,7 @@ dependencies = [ [[package]] name = "duniter-dbs-write-ops" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "chrono", "dubp", @@ -1035,7 +1039,7 @@ dependencies = [ [[package]] name = "duniter-global" version = "1.8.1" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "async-rwlock", "dubp", @@ -1048,7 +1052,7 @@ dependencies = [ [[package]] name = "duniter-gva" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "arrayvec 0.7.0", @@ -1079,7 +1083,7 @@ dependencies = [ [[package]] name = "duniter-gva-conf" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "duniter-core", @@ -1091,7 +1095,7 @@ dependencies = [ [[package]] name = "duniter-gva-db" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "bincode", "chrono", @@ -1108,7 +1112,7 @@ dependencies = [ [[package]] name = "duniter-gva-dbs-reader" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "arrayvec 0.7.0", @@ -1122,7 +1126,7 @@ dependencies = [ [[package]] name = "duniter-gva-gql" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "arrayvec 0.7.0", @@ -1144,7 +1148,7 @@ dependencies = [ [[package]] name = "duniter-gva-indexer" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#8aecd22b91daf698d0c158bab5ee7cbaa3be1fb0" +source = "git+https://git.duniter.org/nodes/rust/modules/duniter-gva#4a7d3270dff7cbde9df08bdff30b08cedc24d13b" dependencies = [ "anyhow", "bincode", @@ -1176,7 +1180,7 @@ dependencies = [ [[package]] name = "duniter-mempools" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "dubp", "duniter-bc-reader", @@ -1189,7 +1193,7 @@ dependencies = [ [[package]] name = "duniter-module" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "anyhow", "async-mutex", @@ -1238,15 +1242,16 @@ dependencies = [ "neon", "neon-build", "neon-serde", + "parking_lot", "serde", "unwrap", ] [[package]] name = "dup-crypto" -version = "0.53.1" +version = "0.54.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c530e25cc0a03ae36229401ca322002931b55fc180e6001bdab20a9087f297c" +checksum = "be4b9746489f2564086fffce1cc67de3b867a098eaf4dbcce15dc85f85542c9c" dependencies = [ "base64", "blake3", @@ -1820,7 +1825,7 @@ dependencies = [ [[package]] name = "kv_typed" version = "0.1.0" -source = "git+https://git.duniter.org/nodes/rust/duniter-core#4ce40a98dbc3cb3241e6d91817a8753a9be95ee8" +source = "git+https://git.duniter.org/nodes/rust/duniter-core#ce0cb755acd91c2e91fe6fc89ea57ae7d7e3eaef" dependencies = [ "byteorder", "cfg-if 0.1.10", diff --git a/neon/native/Cargo.toml b/neon/native/Cargo.toml index 9a5eef1bf..fd1f2d7d2 100644 --- a/neon/native/Cargo.toml +++ b/neon/native/Cargo.toml @@ -17,7 +17,7 @@ neon-build = "0.4.0" [dependencies] bincode = "1.2.1" bs58 = "0.3.0" -dubp = { version = "0.53.1", features = ["duniter"] } +dubp = { version = "0.54.1", features = ["duniter"] } dubp-wot = { git = "https://git.duniter.org/nodes/rust/duniter-core" } duniter-server = { path = "../../rust-libs/duniter-server" } flate2 = "1.0.16" diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml index cc5f9fdd4..30980763c 100644 --- a/rust-bins/duniter-dbex/Cargo.toml +++ b/rust-bins/duniter-dbex/Cargo.toml @@ -22,13 +22,13 @@ anyhow = "1.0.33" arrayvec = "0.5.1" comfy-table = "2.1.0" dirs = "3.0.1" -dubp = { version = "0.53.1", features = ["duniter"] } +dubp = { version = "0.54.1", features = ["duniter"] } duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer", "explorer", "leveldb_backend"] } duniter-gva-db = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", default-features = false, features = ["explorer", "leveldb_backend"] } duniter-gva-indexer = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva" } fast-threadpool = "0.2.3" flume = "0.10.0" -once_cell = "1.5.2" +once_cell = "1.7" rayon = "1.3.1" serde_json = "1.0.53" structopt = "0.3.16" diff --git a/rust-bins/duniter-dbex/src/migrate.rs b/rust-bins/duniter-dbex/src/migrate.rs index 483271fa3..d9f0548b1 100644 --- a/rust-bins/duniter-dbex/src/migrate.rs +++ b/rust-bins/duniter-dbex/src/migrate.rs @@ -101,6 +101,7 @@ fn migrate_inner( }); let mut current = None; + let mut currency_params = Default::default(); while let Ok(chunk) = r2.recv() { if !chunk.is_empty() { println!( @@ -108,12 +109,15 @@ fn migrate_inner( chunk[0].number(), chunk[chunk.len() - 1].number() ); + if let Some(currency_parameters) = chunk[0].currency_parameters() { + currency_params = currency_parameters; + } let chunk = Arc::from(chunk); let chunk_arc_clone = Arc::clone(&chunk); let gva_handle = dbs_pool .launch(move |_| { for block in chunk_arc_clone.deref() { - duniter_gva_indexer::apply_block(block, gva_db)?; + duniter_gva_indexer::apply_block(block, currency_params, gva_db)?; } Ok::<_, KvError>(()) }) diff --git a/rust-libs/duniter-server/Cargo.toml b/rust-libs/duniter-server/Cargo.toml index 52fbb64bd..d91875c30 100644 --- a/rust-libs/duniter-server/Cargo.toml +++ b/rust-libs/duniter-server/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] anyhow = "1.0.34" cfg-if = "1.0.0" -dubp = { version = "0.53.1", features = ["duniter"] } +dubp = { version = "0.54.1", features = ["duniter"] } duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer"] } duniter-gva = { git = "https://git.duniter.org/nodes/rust/modules/duniter-gva", optional = true } fast-threadpool = "0.2.3" diff --git a/rust-libs/duniter-server/src/legacy/block_indexer.rs b/rust-libs/duniter-server/src/legacy/block_indexer.rs index bf271807d..990b22cc7 100644 --- a/rust-libs/duniter-server/src/legacy/block_indexer.rs +++ b/rust-libs/duniter-server/src/legacy/block_indexer.rs @@ -20,6 +20,12 @@ impl DuniterServer { let block = Arc::new( DubpBlockV10::from_string_object(&block).map_err(|e| KvError::DeserError(e.into()))?, ); + + // Get currency parameters from genesis block + if let Some(currency_params) = block.currency_parameters() { + self.currency_params = currency_params; + } + self.current = Some(duniter_core::dbs_write_ops::apply_block::apply_block( &self.bc_db, block.clone(), @@ -28,10 +34,17 @@ impl DuniterServer { &self.global_sender, false, )?); - apply_block_modules(block, Arc::new(self.conf.clone()), &self.dbs_pool, None) + apply_block_modules( + block, + Arc::new(self.conf.clone()), + self.currency_params, + &self.dbs_pool, + None, + ) } pub fn apply_chunk_of_blocks(&mut self, blocks: Vec<DubpBlockV10Stringified>) -> KvResult<()> { log::debug!("apply_chunk(#{})", blocks[0].number); + let blocks = Arc::from( blocks .into_iter() @@ -39,6 +52,12 @@ impl DuniterServer { .collect::<Result<Vec<_>, _>>() .map_err(|e| KvError::DeserError(e.into()))?, ); + + // Get currency parameters from genesis block + if let Some(currency_params) = blocks[0].currency_parameters() { + self.currency_params = currency_params; + } + self.current = Some(duniter_core::dbs_write_ops::apply_block::apply_chunk( &self.bc_db, self.current, @@ -46,7 +65,13 @@ impl DuniterServer { blocks.clone(), Some(&self.global_sender), )?); - apply_chunk_of_blocks_modules(blocks, Arc::new(self.conf.clone()), &self.dbs_pool, None) + apply_chunk_of_blocks_modules( + blocks, + Arc::new(self.conf.clone()), + self.currency_params, + &self.dbs_pool, + None, + ) } pub fn revert_block(&mut self, block: DubpBlockV10Stringified) -> KvResult<()> { let block = Arc::new( @@ -64,6 +89,12 @@ impl DuniterServer { .expect("dbs pool disconnected"); self.current = duniter_core::dbs_write_ops::bc::revert_block(&self.bc_db, &block)?; txs_mp_job_handle.join().expect("dbs pool disconnected")?; - revert_block_modules(block, Arc::new(self.conf.clone()), &self.dbs_pool, None) + revert_block_modules( + block, + Arc::new(self.conf.clone()), + self.currency_params, + &self.dbs_pool, + None, + ) } } diff --git a/rust-libs/duniter-server/src/lib.rs b/rust-libs/duniter-server/src/lib.rs index e031a1583..7de95f5a5 100644 --- a/rust-libs/duniter-server/src/lib.rs +++ b/rust-libs/duniter-server/src/lib.rs @@ -26,7 +26,7 @@ mod fill_cm; mod legacy; pub use duniter_core::conf::{DuniterCoreConf, DuniterMode}; -use duniter_core::dbs::databases::network_v1::NetworkV1DbWritable; +use duniter_core::dbs::databases::{bc_v2::BcV2DbReadable, network_v1::NetworkV1DbWritable}; pub use duniter_core::dbs::{ kv_typed::prelude::KvResult, smallvec, DunpHeadDbV1, DunpNodeIdV1Db, PeerCardDbV1, }; @@ -34,8 +34,8 @@ pub use duniter_core::dbs::{ pub use duniter_gva::GvaModule; use anyhow::Context; -use dubp::common::crypto::keys::ed25519::PublicKey; use dubp::common::prelude::*; +use dubp::common::{crypto::keys::ed25519::PublicKey, currency_params::CurrencyParameters}; use dubp::documents::{prelude::*, transaction::TransactionDocumentV10}; use dubp::{ block::prelude::*, common::crypto::hashs::Hash, documents_parser::prelude::FromStringObject, @@ -72,6 +72,7 @@ cfg_if::cfg_if! { pub struct DuniterServer { bc_db: BcV2Db<FileBackend>, conf: DuniterCoreConf, + currency_params: CurrencyParameters, current: Option<BlockMetaV2>, dbs_pool: fast_threadpool::ThreadPoolSyncHandler<SharedDbs<FileBackend>>, global_sender: flume::Sender<GlobalBackGroundTaskMsg>, @@ -108,6 +109,9 @@ impl DuniterServer { let current = fill_cm::fill_and_get_current_meta(&bc_db, &global_sender)?; log::info!("Databases successfully opened."); + // Get currency parameters + let currency_params = bc_db.currency_params().get(&())?.unwrap_or_default().0; + if let Some(current) = current { log::info!("Current block: #{}-{}", current.number, current.hash); } else { @@ -157,6 +161,7 @@ impl DuniterServer { bc_db, conf, current, + currency_params, dbs_pool: threadpool.into_sync_handler(), global_sender, pending_txs_subscriber, diff --git a/rust-libs/tests/duniter-integration-tests/Cargo.toml b/rust-libs/tests/duniter-integration-tests/Cargo.toml index 1d2042ce5..d2244d10b 100644 --- a/rust-libs/tests/duniter-integration-tests/Cargo.toml +++ b/rust-libs/tests/duniter-integration-tests/Cargo.toml @@ -8,7 +8,7 @@ edition = "2018" [dependencies] anyhow = "1.0.34" chrono = "0.4" -dubp = { version = "0.53.1", features = ["duniter"] } +dubp = { version = "0.54.1", features = ["duniter"] } duniter-core = { git = "https://git.duniter.org/nodes/rust/duniter-core", features = ["bc-writer"] } duniter-server = { path = "../../duniter-server", features = ["gva"] } fast-threadpool = "0.2.3" -- GitLab