diff --git a/distance-oracle/src/bin/distance_precompute.rs b/distance-oracle/src/bin/distance_precompute.rs index d57e71bea87d61a7726468e2b49ffa34a5296465..9a6cafc4fbf98ca387d49229017f45b2650a8cbf 100644 --- a/distance-oracle/src/bin/distance_precompute.rs +++ b/distance-oracle/src/bin/distance_precompute.rs @@ -4,8 +4,12 @@ use fnv::{FnvHashMap, FnvHashSet}; use log::debug; use std::{io::Write, path::PathBuf}; -// computes distance result for all identities with status other than Revoked -// this allows to have a recent estimate of the distance computation +// this script is mainly copied from distance oracle code +// it adds values not necessary in distance computation but convenient to have +// it allows to have a recent estimate of the distance computation +// intended use: +// - compute distance result for all identities with received certifications +// - put the result in a json file to be served publicly use clap::Parser; @@ -20,12 +24,15 @@ struct Cli { log: log::LevelFilter, } -// +/// computation result as it will be serialized in json #[derive(serde::Serialize)] struct PrecomputationResult { + height: u32, block: sp_core::H256, + referees_count: u32, + member_count: u32, + min_certs_for_referee: u32, results: FnvHashMap<IdtyIndex, u32>, - referees: u32, } #[tokio::main] @@ -38,13 +45,13 @@ async fn main() { .unwrap(); let client = &distance_oracle::api::client(cli.rpc_url.clone()).await; - let parent_hash = api::parent_hash(client).await; // get hash of recent block + let block_hash = api::parent_hash(client).await; // get hash of recent block + let block_height = client.blocks().at(block_hash).await.unwrap().number(); let max_depth = api::max_referee_distance(client).await; // get param - let evaluation_block = parent_hash; // get certs and member iterators - let mut certs_iter = api::cert_iter(client, evaluation_block).await; - let mut members_iter = api::member_iter(client, evaluation_block).await; + let mut certs_iter = api::cert_iter(client, block_hash).await; + let mut members_iter = api::member_iter(client, block_hash).await; // initialize hashmaps // member idty -> issued certs count (will only retain referees) @@ -61,9 +68,10 @@ async fn main() { { members.insert(member_idty, 0); } + let member_count = members.len(); // compute certification threshold as a function of the total member count - let min_certs_for_referee = (members.len() as f32).powf(1. / (max_depth as f32)).ceil() as u32; + let min_certs_for_referee = (member_count as f32).powf(1. / (max_depth as f32)).ceil() as u32; // collect certifications and updates members map at the same time while let Some((receiver, issuers)) = certs_iter @@ -94,32 +102,37 @@ async fn main() { // Only retain referees members.retain(|_idty, issued_certs| *issued_certs >= min_certs_for_referee); let referees = members; + let referees_count = referees.len(); // initialize map of distance results let mut results = FnvHashMap::<IdtyIndex, u32>::default(); - // compute all distances - received_certs.keys().into_iter().for_each(|idty| { + // compute all distances (optimization: parallel) + received_certs.keys().for_each(|idty| { results.insert( *idty, distance_rule(&received_certs, &referees, max_depth, *idty) as u32, ); }); - // structure + // put results in a struct for serialization let precomputation_result = PrecomputationResult { - block: evaluation_block, - results: results, - referees: referees.len() as u32, + height: block_height, + block: block_hash, + min_certs_for_referee, + referees_count: referees_count as u32, + member_count: member_count as u32, + results, }; // ---- SAVE - let evaluation_result_path = - Into::<PathBuf>::into(cli.evaluation_result_dir).join("todo-block-number".to_string()); + const FILENAME: &str = "latest_distance.json"; + let evaluation_result_path = Into::<PathBuf>::into(cli.evaluation_result_dir).join(FILENAME); debug!("Saving distance evaluation result to file `{evaluation_result_path:?}`"); let mut evaluation_result_file = std::fs::OpenOptions::new() .write(true) - .create_new(true) + .create(true) + .truncate(true) .open(&evaluation_result_path) .unwrap_or_else(|e| { panic!( @@ -137,7 +150,7 @@ async fn main() { }); } -// alternative function which returns number of reached referees +// alternative function which returns number of reached referees instead of percentage fn distance_rule( received_certs: &FnvHashMap<IdtyIndex, Vec<IdtyIndex>>, referees: &FnvHashMap<IdtyIndex, u32>,