diff --git a/lib/modules-lib/bc-db-reader/src/constants.rs b/lib/modules-lib/bc-db-reader/src/constants.rs index 5eabbb72cb918650b711c70eb8f6d52f6ffd0767..277d69e9020b413f37c883fe5df5fea2f0b6af02 100644 --- a/lib/modules-lib/bc-db-reader/src/constants.rs +++ b/lib/modules-lib/bc-db-reader/src/constants.rs @@ -25,6 +25,9 @@ pub static DEFAULT_PAGE_SIZE: &usize = &50; /// Current meta datas (CurrentMetaDataKey, ?) pub static CURRENT_METAS_DATAS: &str = "cmd"; +/// Current frame members datas (MemberFrameInfo {last_personal_block_number: BlockNumber,nb_personal_blocks_in_frame: usize,personal_difficulty: PersonalDifficulty,}) +pub static CURRENT_FRAME_MEMBERS: &str = "cfm"; + /// Fork blocks referenced in tree or in orphan blockstamps (Blockstamp, DbBlock) pub static FORK_BLOCKS: &str = "fb"; diff --git a/lib/modules-lib/bc-db-reader/src/current_frame.rs b/lib/modules-lib/bc-db-reader/src/current_frame.rs index bb4f35fe844ecb8a36fa9238ada5ed6a9d8129e4..3f8844b1735ffcbe138d2db509b8764fe277b1da 100644 --- a/lib/modules-lib/bc-db-reader/src/current_frame.rs +++ b/lib/modules-lib/bc-db-reader/src/current_frame.rs @@ -17,11 +17,14 @@ //use crate::constants::*; use crate::*; + extern crate num; + use dubp_common_doc::BlockNumber; use durs_dbs_tools::DbError; use durs_wot::WotId; use num::Float; +use serde::{Deserialize, Serialize}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] /// Describe a member in current frame @@ -32,7 +35,7 @@ pub struct MemberInCurrentFrame { pub difficulty: PersonalDifficulty, } -#[derive(Clone, Copy, Debug, Eq, PartialEq)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)] /// Personal difficulty of a member. pub struct PersonalDifficulty { /// Exclusion factor @@ -40,6 +43,23 @@ pub struct PersonalDifficulty { /// handicap pub handicap: usize, } +// FIXME: à tester +impl Default for PersonalDifficulty { + fn default() -> Self { + PersonalDifficulty { + exclusion_factor: 1, + handicap: 0, + } + } +} + +#[derive(Debug, Copy, Clone, Serialize, Deserialize)] +/// in frame member info data store +pub struct MemberFrameInfo { + last_personal_block_number: BlockNumber, + nb_personal_blocks_in_frame: usize, + personal_difficulty: PersonalDifficulty, +} /// Get current frame datas pub fn get_current_frame<DB: DbReadable>( @@ -55,10 +75,12 @@ pub fn get_member_diffi<DB: DbReadable, R: DbReader>( _r: &R, _wot_id: WotId, ) -> Result<PersonalDifficulty, DbError> { - unimplemented!(); + Ok(PersonalDifficulty { + exclusion_factor: 1, + handicap: 0, + }) } - /// calcule la difficulté personnalisée à partir des données prêtes à l'emploi /// reference dans le protocol : https://github.com/duniter/duniter/blob/master/doc/Protocol.md#br_g18---headpowzeros-and-headpowremainder pub fn compute_personal_difficulty( @@ -108,12 +130,17 @@ pub fn handicap(nb_personal_blocks_in_frame: usize, median_of_blocks_in_frame: u )) as f64) .ln() / 1.189.ln()) - .floor() as usize + .floor() as usize } #[cfg(test)] mod tests { use super::*; + use durs_dbs_tools::kv_db::KvFileDbHandler; + //use durs_bc_db_reader::DbValue; + //use durs_bc_db_reader::Db; + //use Db::db_value; + //use log::kv::Value; //TODO: déplacer la fonction métier dans blockchain ou bc-db-writer #[test] @@ -133,7 +160,7 @@ mod tests { assert_eq!( PersonalDifficulty { exclusion_factor: 1, - handicap: 0 + handicap: 0, }, compute_personal_difficulty(100, BlockNumber(1000), BlockNumber(1100), 2, 5) ); @@ -144,30 +171,67 @@ mod tests { assert_eq!( PersonalDifficulty { exclusion_factor: 3, - handicap: 10 + handicap: 10, }, compute_personal_difficulty(50, BlockNumber(1000), BlockNumber(1010), 5, 1) ); + assert_eq!( + PersonalDifficulty { + exclusion_factor: 2, + handicap: 13, + }, + compute_personal_difficulty(6, BlockNumber(99), BlockNumber(100), 19, 2) + ); } // test avec db mockée - // #[test] - // fn test_personal_difficulty_member_not_in_frame() -> Result<(), DbError> { - // let db = crate::tests::open_tmp_db()?; - // db.write(|mut w| { - // //common::insert_wot_index_entry(&db, &mut w, WotId(0), issuer_a)?; - // Ok(w) - // })?; - // db.read(|r| { - // //common::insert_wot_index_entry(&db, &mut w, WotId(0), issuer_a)?; - // assert_eq!( - // PersonalDifficulty { - // exclusion_factor: 1, - // handicap: 0 - // }, - // get_member_diffi(db,r, WotId(0)) - // ); - // })?; - - // } +// fn factory_member_frame_info(last: u32, nbr:usize) -> Result<DbValue, DbError> { +// Db::db_value(&durs_dbs_tools::to_bytes(&MemberFrameInfo { +// last_personal_block_number: BlockNumber(last), +// nb_personal_blocks_in_frame: nbr, +// ..Default::default() +// })?) +// } + fn init_mocked_db() -> Result<KvFileDbHandler, DbError> { + let db = crate::tests::open_tmp_db()?; + db.write(|mut w| { + //db.get_int_store(CURRENT_FRAME_MEMBERS).put(w.as_mut(), 1, &factory_member_frame_info(99,15)?); + + // créer une hashmap avec comme + // |- clef les wot_id des membres de la fenêtre courante + // |- valeurs : + // |- le block_number du dernier block de ce membre + // |- le nombre de block de ce membre dans la fenêtre courante + // {1:{99,15},3:{80,5},4:{97,3},5:{98,1},6:{90,1},8:{71,1}} + //common::insert_wot_index_entry(&db, &mut w, WotId(0), issuer_a)?; + Ok(w) + })?; + Ok(db) + } + + #[test] + fn test_personal_difficulty_member_not_in_frame() -> Result<(), DbError> { + let db = init_mocked_db()?; + assert_eq!( + PersonalDifficulty { + exclusion_factor: 1, + handicap: 0, + }, + db.read(|r| get_member_diffi(&db, r, WotId(0)))? + ); + Ok(()) + } + +// #[test] +// fn test_personal_difficulty_member_supercalculator() -> Result<(), DbError> { +// let db = init_mocked_db()?; +// assert_eq!( +// PersonalDifficulty { +// exclusion_factor: 2, +// handicap: 13, +// }, +// db.read(|r| get_member_diffi(&db, r, WotId(1)))? +// ); +// Ok(()) +// } } diff --git a/lib/modules-lib/bc-db-reader/src/lib.rs b/lib/modules-lib/bc-db-reader/src/lib.rs index 2edf971581e8a90561a7752e2774387e5f2f8821..03585176b0aa775218a16abcb1ab87a3ef72af05 100644 --- a/lib/modules-lib/bc-db-reader/src/lib.rs +++ b/lib/modules-lib/bc-db-reader/src/lib.rs @@ -52,6 +52,7 @@ pub fn bc_db_schema() -> KvFileDbSchema { KvFileDbSchema { stores: hashmap![ CURRENT_METAS_DATAS.to_owned() => KvFileDbStoreType::SingleIntKey, + CURRENT_FRAME_MEMBERS.to_owned() => KvFileDbStoreType::SingleIntKey, MAIN_BLOCKS.to_owned() => KvFileDbStoreType::SingleIntKey, FORK_BLOCKS.to_owned() => KvFileDbStoreType::Single, ORPHAN_BLOCKSTAMP.to_owned() => KvFileDbStoreType::Single,