diff --git a/Cargo.lock b/Cargo.lock index aecf6dc4285dc4d6bb452b87c62701744153e1f9..b5c33ae959f0e3cdcc654e603dfe46ac4ddcf8b4 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 9a5eef1bf2c3e119256b5cb6dfc57416fef869a2..05adbb76aa31eac5560d778f3b6ddcb4153cf567 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" @@ -26,6 +26,7 @@ flume = "0.10.0" log = "0.4.11" neon = "0.4.0" neon-serde = "0.4.0" +parking_lot = "0.11" serde = { version = "1.0.105", features = ["derive"] } [dev-dependencies] diff --git a/neon/native/src/wot.rs b/neon/native/src/wot.rs index 2eb7bea39a56fa2f964ca2053585b9086aa641af..5b8a0c9a743d5c9e49d965bff68bbc85badd7710 100644 --- a/neon/native/src/wot.rs +++ b/neon/native/src/wot.rs @@ -27,13 +27,43 @@ use dubp_wot::{ distance::DistanceError, path::{PathFinder, RustyPathFinder}, }, + MAIN_WOT, }; use neon::declare_types; use neon::prelude::*; -use std::ops::Deref; +use parking_lot::RwLock; + +pub struct RustWot(Option<RustyWebOfTrust>); + +impl RustWot { + fn get<R, F>(&self, f: F) -> R + where + F: FnOnce(&RustyWebOfTrust) -> R, + { + if let Some(ref wot) = self.0 { + f(wot) + } else if let Some(main_wot) = MAIN_WOT.get() { + f(&main_wot.read()) + } else { + panic!("unreachable: get RustWot that is neither main nor non-main!"); + } + } + fn get_mut<R, F>(&mut self, f: F) -> R + where + F: FnOnce(&mut RustyWebOfTrust) -> R, + { + if let Some(ref mut wot) = self.0 { + f(wot) + } else if let Some(main_wot) = MAIN_WOT.get() { + f(&mut main_wot.write()) + } else { + panic!("unreachable: get RustWot that is neither main nor non-main!"); + } + } +} declare_types! { - pub class JsWoT for RustyWebOfTrust { + pub class JsWoT for RustWot { init(mut cx) { let arg0 = cx.argument::<JsValue>(0)?; @@ -42,14 +72,21 @@ declare_types! { .downcast::<JsNumber>() .or_throw(&mut cx)? .value(); - Ok(RustyWebOfTrust::new(max_links as usize)) + Ok(RustWot(Some(RustyWebOfTrust::new(max_links as usize)))) } else if arg0.is_a::<JsString>() { let file_path = arg0 .downcast::<JsString>() .or_throw(&mut cx)? .value(); match read_from_file::wot_from_file(file_path) { - Ok(wot) => Ok(wot), + Ok(wot) => { + if std::env::var("DUNITER_JS_TESTS") == Ok("yes".to_owned()) { + Ok(RustWot(Some(wot))) + } else { + MAIN_WOT.set(RwLock::new(wot)).unwrap_or_else(|_| unreachable!()); + Ok(RustWot(None)) + } + }, Err(e) => cx.throw_error(e), } } else if arg0.is_a::<JsArrayBuffer>() { @@ -63,7 +100,7 @@ declare_types! { }); match bincode::deserialize(&bytes) { - Ok(wot) => Ok(wot), + Ok(wot) => Ok(RustWot(Some(wot))), Err(e) => cx.throw_error(e.to_string()), } } else { @@ -76,7 +113,7 @@ declare_types! { { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.clear(); + wot.get_mut(|wot| wot.clear()); } Ok(cx.undefined().upcast()) @@ -87,7 +124,7 @@ declare_types! { let max_link = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.get_max_link() + wot.get(|wot| wot.get_max_link()) }; Ok(cx.number(max_link as f64).upcast()) } @@ -98,7 +135,7 @@ declare_types! { { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.set_max_link(max_links); + wot.get_mut(|wot| wot.set_max_link(max_links)); } Ok(cx.undefined().upcast()) } @@ -108,7 +145,7 @@ declare_types! { let wot_id = { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.add_node() + wot.get_mut(|wot| wot.add_node()) }; Ok(cx.number(wot_id.0 as f64).upcast()) } @@ -118,7 +155,7 @@ declare_types! { let wot_id_opt = { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.rem_node() + wot.get_mut(|wot| wot.rem_node()) }; if let Some(wot_id) = wot_id_opt { @@ -133,7 +170,7 @@ declare_types! { let wot_size = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.size() + wot.get(|wot| wot.size()) }; Ok(cx.number(wot_size as f64).upcast()) } @@ -144,7 +181,7 @@ declare_types! { let is_enabled_opt = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.is_enabled(wot_id) + wot.get(|wot| wot.is_enabled(wot_id)) }; if let Some(is_enabled) = is_enabled_opt { @@ -159,7 +196,7 @@ declare_types! { let enabled = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.get_enabled() + wot.get(|wot| wot.get_enabled()) }; vec_wot_id_to_js_array(cx, enabled) @@ -173,7 +210,7 @@ declare_types! { let enabled_opt = { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.set_enabled(wot_id, enabled) + wot.get_mut(|wot| wot.set_enabled(wot_id, enabled)) }; if let Some(enabled) = enabled_opt { @@ -188,7 +225,7 @@ declare_types! { let disabled = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.get_disabled() + wot.get(|wot| wot.get_disabled()) }; vec_wot_id_to_js_array(cx, disabled) @@ -200,7 +237,7 @@ declare_types! { let sentries = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.get_sentries(sentry_requirement as usize) + wot.get(|wot| wot.get_sentries(sentry_requirement as usize)) }; vec_wot_id_to_js_array(cx, sentries) @@ -212,7 +249,7 @@ declare_types! { let non_sentries = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.get_non_sentries(sentry_requirement as usize) + wot.get(|wot| wot.get_non_sentries(sentry_requirement as usize)) }; vec_wot_id_to_js_array(cx, non_sentries) @@ -226,7 +263,7 @@ declare_types! { let new_link_result = { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.add_link(source, target) + wot.get_mut(|wot| wot.add_link(source, target)) }; match new_link_result { @@ -247,7 +284,7 @@ declare_types! { let has_link_result = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.has_link(source, target) + wot.get(|wot| wot.has_link(source, target)) }; match has_link_result { @@ -265,7 +302,7 @@ declare_types! { let rem_link_result = { let guard = cx.lock(); let mut wot = this.borrow_mut(&guard); - wot.rem_link(source, target) + wot.get_mut(|wot| wot.rem_link(source, target)) }; match rem_link_result { @@ -283,9 +320,8 @@ declare_types! { let this = cx.this(); let distance_res = { let guard = cx.lock(); - let wot_box = this.borrow(&guard); - let wot: &RustyWebOfTrust = wot_box.deref(); - RustyDistanceCalculator {}.compute_distance(wot, distance_params) + let wot = this.borrow(&guard); + wot.get(|wot| RustyDistanceCalculator {}.compute_distance(wot, distance_params)) }; match distance_res { @@ -302,9 +338,8 @@ declare_types! { let this = cx.this(); let distance_res = { let guard = cx.lock(); - let wot_box = this.borrow(&guard); - let wot: &RustyWebOfTrust = wot_box.deref(); - RustyDistanceCalculator {}.compute_distance(wot, distance_params) + let wot = this.borrow(&guard); + wot.get(|wot| RustyDistanceCalculator {}.compute_distance(wot, distance_params)) }; match distance_res { @@ -325,9 +360,8 @@ declare_types! { let this = cx.this(); let paths = { let guard = cx.lock(); - let wot_box = this.borrow(&guard); - let wot: &RustyWebOfTrust = wot_box.deref(); - RustyPathFinder {}.find_paths(wot, from, to, k_max) + let wot = this.borrow(&guard); + wot.get(|wot| RustyPathFinder {}.find_paths(wot, from, to, k_max)) }; // Convert Vec<Vec<WotId>> to JsArray<JsArray<JsNumber>> @@ -348,9 +382,8 @@ declare_types! { let this = cx.this(); let ser_res = { let guard = cx.lock(); - let wot_box = this.borrow(&guard); - let wot: &RustyWebOfTrust = wot_box.deref(); - bincode::serialize(wot) + let wot = this.borrow(&guard); + wot.get(|wot| bincode::serialize(wot)) }; match ser_res { @@ -372,7 +405,7 @@ declare_types! { let res = { let guard = cx.lock(); let wot = this.borrow(&guard); - write_in_file::wot_in_file(file_path_str, wot.deref()) + wot.get(|wot| write_in_file::wot_in_file(file_path_str, wot)) }; match res { @@ -388,7 +421,7 @@ declare_types! { let res = { let guard = cx.lock(); let wot = this.borrow(&guard); - wot.dump(&mut dump_wot_chars) + wot.get(|wot| wot.dump(&mut dump_wot_chars)) }; match res { Ok(()) => match String::from_utf8(dump_wot_chars) { diff --git a/rust-bins/duniter-dbex/Cargo.toml b/rust-bins/duniter-dbex/Cargo.toml index cc5f9fdd4f248b60e640016392fcd10d17c5ffad..30980763c59969abdaf96f8e35499cb3d0579f57 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 483271fa339d208bbdec6455a218c5169c7066ab..d9f0548b13e61c97f7816c04082198fa839f1f6a 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 52fbb64bd21e3f95cee490d7248b1d0eb9942f6a..d91875c30423e378c5a863facb9cbfc489f6d1a7 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 bf271807d8f687b98b1a532ae2f15e9db05f5237..990b22cc72e345f80d3058e3397a0c1f21ce8004 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 e031a15839ca989434818df205994476db664f82..7de95f5a536592e6aa8816a6e933cba21aa97943 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 1d2042ce53c18bc7a28cefa4a483c8ec42d1967e..d2244d10beffdbd13237ba843cd73d61df24731c 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"