diff --git a/.gitignore b/.gitignore index 131d75fddfc02a6abe821fdc762e12cde28e8a5a..ac6d158ede7acc17cb7cb1c4a9562faebf3fe145 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ **/*.rs.bk *.wot -*.bin diff --git a/Cargo.lock b/Cargo.lock index ce52b969520558ed5e04c31b74a25086056a5b31..f1f4cc636a9011212f306fa3f575d2f00aaa3cbf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,7 +107,7 @@ dependencies = [ [[package]] name = "duniter-wotb" -version = "0.6.2" +version = "0.7.0" dependencies = [ "bincode 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/wotb/Cargo.toml b/wotb/Cargo.toml index 213c02a862276a8249dfb1cbd0d5915d4416caae..b37f08c63dca1e32ea16e19de9c27fc8343f536a 100644 --- a/wotb/Cargo.toml +++ b/wotb/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "duniter-wotb" -version = "0.6.2" +version = "0.7.0" authors = ["nanocryk <nanocryk@duniter.org>", "elois <elois@duniter.org>"] description = "Makes Web of Trust computations for the Duniter project." repository = "https://git.duniter.org/nodes/rust/duniter-rs" diff --git a/wotb/legacy.rs b/wotb/legacy.rs index f70da9e47aeb2567fce7f3aaa50b860f92aaa784..402288a35ed1420d851fefd76f980b3aefc4773d 100644 --- a/wotb/legacy.rs +++ b/wotb/legacy.rs @@ -398,7 +398,9 @@ impl WebOfTrust for LegacyWebOfTrust { let mut result = WotDistance { sentries: 0, success: 0, + success_at_border: 0, reached: 0, + reached_at_border: 0, outdistanced: false, }; @@ -412,17 +414,30 @@ impl WebOfTrust for LegacyWebOfTrust { sentries[node.0] = false; let mut checked: Vec<bool> = self.nodes.iter().map(|_| false).collect(); + let mut checked_without_border: Vec<bool> = checked.clone(); if step_max >= 1 { checked = self.check_matches(node, 1, step_max, checked); + if step_max >= 2 { + checked_without_border = + self.check_matches(node, 1, step_max - 1, checked_without_border); + } } - for (&sentry, &check) in sentries.iter().zip(checked.iter()) { + for ((&sentry, &check), &check_without_border) in sentries + .iter() + .zip(checked.iter()) + .zip(checked_without_border.iter()) + { if sentry { result.sentries += 1; if check { result.success += 1; result.reached += 1; + if !check_without_border { + result.success_at_border += 1; + result.reached_at_border += 1; + } } } else if check { result.reached += 1; diff --git a/wotb/lib.rs b/wotb/lib.rs index b0f9af3d5bed6afcebfcbbd2e92d02b794488c3b..1a6fed792e1465fd3cb9491b7730cea7b86827ca 100644 --- a/wotb/lib.rs +++ b/wotb/lib.rs @@ -151,8 +151,12 @@ pub struct WotDistance { pub sentries: u32, /// Success count pub success: u32, + /// Succes at border count + pub success_at_border: u32, /// Reached count pub reached: u32, + /// Reached at border count + pub reached_at_border: u32, /// Is the node outdistanced ? pub outdistanced: bool, } @@ -267,15 +271,10 @@ pub trait WebOfTrust { if byte_integer >= factor { byte_integer -= factor; } else { - println!( - "DEBUG : set_enabled({})", - (nodes_count - count_remaining_nodes) - ); - let test = self.set_enabled( + let _test = self.set_enabled( NodeId((nodes_count - count_remaining_nodes) as usize), false, ); - println!("DEBUG {:?}", test); } count_remaining_nodes -= 1; } @@ -588,7 +587,7 @@ mod tests { sentry_requirement: 1, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // => no because 2,4,5 have certified him @@ -598,7 +597,7 @@ mod tests { sentry_requirement: 2, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // => no because only member 2 has 2 certs, and has certified him @@ -608,7 +607,7 @@ mod tests { sentry_requirement: 3, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // => no because no member has issued 3 certifications @@ -646,7 +645,7 @@ mod tests { sentry_requirement: 1, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // OK : 2 -> 0 assert_eq!( @@ -655,7 +654,7 @@ mod tests { sentry_requirement: 2, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // OK : 2 -> 0 assert_eq!( @@ -664,7 +663,7 @@ mod tests { sentry_requirement: 3, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // OK : no stry \w 3 lnk assert_eq!( @@ -673,7 +672,7 @@ mod tests { sentry_requirement: 2, step_max: 2, x_percent: 1.0, - }), + },), Some(false) ); // OK : 2 -> 0 @@ -706,7 +705,7 @@ mod tests { sentry_requirement: 1, step_max: 1, x_percent: 1.0, - }), + },), Some(true) ); // KO : No path 3 -> 0 assert_eq!( @@ -715,7 +714,7 @@ mod tests { sentry_requirement: 2, step_max: 1, x_percent: 1.0, - }), + },), Some(true) ); // KO : No path 3 -> 0 assert_eq!( @@ -724,7 +723,7 @@ mod tests { sentry_requirement: 3, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // OK : no stry \w 3 lnk assert_eq!( @@ -733,7 +732,7 @@ mod tests { sentry_requirement: 2, step_max: 2, x_percent: 1.0, - }), + },), Some(false) ); // OK : 3 -> 2 -> 0 @@ -756,14 +755,14 @@ mod tests { sentry_requirement: 2, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); // OK : Disabled // Write wot in file assert_eq!( wot.to_file( - "test.bin", + "test.wot", &[0b0000_0000, 0b0000_0001, 0b0000_0001, 0b0000_0000] ).unwrap(), () @@ -774,7 +773,7 @@ mod tests { // Read wot from file { assert_eq!( - wot2.from_file("test.bin").unwrap(), + wot2.from_file("test.wot").unwrap(), vec![0b0000_0000, 0b0000_0001, 0b0000_0001, 0b0000_0000] ); assert_eq!(wot.size(), wot2.size()); @@ -791,9 +790,43 @@ mod tests { sentry_requirement: 2, step_max: 1, x_percent: 1.0, - }), + },), Some(false) ); } + + // Read g1_genesis wot + let mut wot3 = generator(100); + assert_eq!( + wot3.from_file("tests/g1_genesis.bin").unwrap(), + vec![ + 57, 57, 45, 48, 48, 48, 48, 49, 50, 65, 68, 52, 57, 54, 69, 67, 65, 53, 54, 68, 69, + 48, 66, 56, 69, 53, 68, 54, 70, 55, 52, 57, 66, 55, 67, 66, 69, 55, 56, 53, 53, 51, + 69, 54, 51, 56, 53, 51, 51, 51, 65, 52, 52, 69, 48, 52, 51, 55, 55, 69, 70, 70, 67, + 67, 65, 53, 51, + ] + ); + + // Check g1_genesis wot members_count + let members_count = wot3.get_enabled().len() as u64; + assert_eq!(members_count, 59); + + // Test compute_distance in g1_genesis wot + assert_eq!( + wot3.compute_distance(WotDistanceParameters { + node: NodeId(37), + sentry_requirement: 3, + step_max: 5, + x_percent: 0.8, + },), + Some(WotDistance { + sentries: 48, + success: 48, + success_at_border: 3, + reached: 52, + reached_at_border: 3, + outdistanced: false, + },) + ); } } diff --git a/wotb/rusty.rs b/wotb/rusty.rs index b7ae38b6e8cfe6afa64d0b60bff84bb76446e98c..9429690ccba6a7312b76dbb24ecb78c2c03f9cd5 100644 --- a/wotb/rusty.rs +++ b/wotb/rusty.rs @@ -286,19 +286,20 @@ impl WebOfTrust for RustyWebOfTrust { } let sentries: Vec<_> = self.get_sentries(sentry_requirement as usize); - - let success = area.iter().filter(|n| sentries.contains(n)).count() as u32; - let sentries = sentries.len() as u32 - - if self.is_sentry(node, sentry_requirement as usize).unwrap() { - 1 - } else { - 0 - }; + let mut success = area.iter().filter(|n| sentries.contains(n)).count() as u32; + let success_at_border = border.iter().filter(|n| sentries.contains(n)).count() as u32; + let mut sentries = sentries.len() as u32; + if self.is_sentry(node, sentry_requirement as usize).unwrap() { + sentries -= 1; + success -= 1; + } Some(WotDistance { sentries, - reached: (area.len() - 1) as u32, + reached: area.len() as u32, + reached_at_border: border.len() as u32, success, + success_at_border, outdistanced: f64::from(success) < x_percent * f64::from(sentries), }) } diff --git a/wotb/tests/g1_genesis.bin b/wotb/tests/g1_genesis.bin new file mode 100644 index 0000000000000000000000000000000000000000..e7838df9c9efb58d10cbbb7f8a3ba1a2a4407db5 Binary files /dev/null and b/wotb/tests/g1_genesis.bin differ