Skip to content
Snippets Groups Projects
Commit 5c29c3e0 authored by Millicent Billette's avatar Millicent Billette
Browse files

wip refacto interne à bc-db-reader

parent 2198c1f4
No related branches found
No related tags found
No related merge requests found
......@@ -15,69 +15,16 @@
//! Current frame : Interval of blocks taken for the calculation of the personalized difficulty.
//use crate::constants::*;
use crate::*;
extern crate num;
pub mod entities;
use crate::current_meta_datas::get_current_blockstamp_;
use crate::*;
use current_meta_datas::CurrentMetaDataKey;
use dubp_common_doc::BlockNumber;
use durs_dbs_tools::DbError;
use durs_wot::WotId;
use entities::{MemberFrameInfo, MemberInCurrentFrame, PersonalDifficulty};
use num::Float;
//use rkv::store::integer::IntegerStore;
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
/// Describe a member in current frame
pub struct MemberInCurrentFrame {
/// Number of blocks forged by the member in the current frame.
pub forged_blocks: usize,
/// Personal difficulty of the member.
pub difficulty: PersonalDifficulty,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
/// Personal difficulty of a member.
pub struct PersonalDifficulty {
/// Exclusion factor
pub exclusion_factor: usize,
/// handicap
pub handicap: usize,
}
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 block number written by this member
pub last_personal_block_number: BlockNumber,
/// nb member in current frame when last block was written by this member
pub last_personal_nb_members_in_frame: usize,
/// nb blocks written by this member in current frame
pub nb_personal_blocks_in_frame: usize,
personal_difficulty: PersonalDifficulty,
}
//impl Default for MemberFrameInfo {
// fn default() -> Self {
// MemberFrameInfo {
// last_personal_block_number: BlockNumber,
// last_personal_members_in_frame: usize,
// nb_personal_blocks_in_frame: usize,
// personal_difficulty: PersonalDifficulty,
// }
// }
//}
/// Get current frame datas
pub fn get_current_frame<DB: DbReadable>(
......@@ -86,62 +33,18 @@ pub fn get_current_frame<DB: DbReadable>(
unimplemented!();
}
// TODO: tester ça
/// -- fr --
/// récupère dans le store store_name de la db active le contenu u64 de la clef key
/// la clef doit être présente dans le store, sinon DBCorrupted
/// ne fonctionne que pour des store à index / clef au format u32
pub fn get_required_u64_in_int_store<DB: DbReadable, R: DbReader>(
db: &DB,
r: &R,
store_name: &str,
key: u32,
) -> Result<u64, DbError> {
if let Some(value) = db.get_int_store(store_name).get(r, key)? {
if let DbValue::U64(value_u64) = value {
Ok(value_u64)
} else {
Err(DbError::DBCorrupted)
}
} else {
Err(DbError::DBCorrupted)
}
}
// TODO: tester ça
//pub fn get_required_bin_in_int_store<DB: DbReadable, R: DbReader, V: DeserializeOwned>(
// db: &DB,
// r: &R,
// store_name: &str,
// key: u32,
//) -> Result<V, DbError> {
// if let Some(value) = db.get_int_store(store_name).get(r, key)? {
// Ok(BcDbRo::from_db_value(value)?)
// } else {
// Err(DbError::DBCorrupted)
// }
//}
/// TODO: tester ça
/// -- fr --
/// récupère dans le store store_name de la db active le contenu binaire/Blob de la clef key
/// retourne None si la clef n'est pas trouvée.
/// ne fonctionne que pour des store à index / clef au format u32
pub fn get_bin_in_int_store<DB: DbReadable, R: DbReader, V: DeserializeOwned>(
/// Get the personal difficulty of a member.
/// If the member is not in the current window, returns `pow_min`.
pub fn get_member_diffi<DB: DbReadable, R: DbReader>(
db: &DB,
r: &R,
store_name: &str,
key: u32,
) -> Result<Option<V>, DbError> {
if let Some(value) = db.get_int_store(store_name).get(r, key)? {
Ok(Some(BcDbRo::from_db_value(value)?))
} else {
Ok(None)
}
wot_id: WotId,
) -> Result<PersonalDifficulty, DbError> {
compute_member_diffi(db, r, wot_id)
}
/// Get the personal difficulty of a member.
/// Compute the personal difficulty of a member.
/// If the member is not in the current window, returns `pow_min`.
pub fn get_member_diffi<DB: DbReadable, R: DbReader>(
pub fn compute_member_diffi<DB: DbReadable, R: DbReader>(
db: &DB,
r: &R,
wot_id: WotId,
......@@ -150,12 +53,12 @@ pub fn get_member_diffi<DB: DbReadable, R: DbReader>(
// difficulty par défaut
// sinon récupérer le résultat et continuer
let optional_member_info: Option<MemberFrameInfo> =
get_bin_in_int_store(db, r, CURRENT_FRAME_MEMBERS, wot_id.0 as u32)?;
crate::get::get_bin_in_int_store(db, r, CURRENT_FRAME_MEMBERS, wot_id.0 as u32)?;
if let Some(member_info) = optional_member_info {
let current_block_number = get_current_blockstamp_(db, r)?
.ok_or(DbError::DBCorrupted)?
.id;
let median_frame_member = get_required_u64_in_int_store(
let median_frame_member = crate::get::get_required_u64_in_int_store(
db,
r,
CURRENT_METAS_DATAS,
......@@ -165,7 +68,7 @@ pub fn get_member_diffi<DB: DbReadable, R: DbReader>(
member_info.last_personal_nb_members_in_frame.into(),
member_info.last_personal_block_number,
current_block_number,
member_info.nb_personal_blocks_in_frame,
member_info.member_in_current_frame.forged_blocks,
median_frame_member as usize,
))
} else {
......@@ -182,7 +85,7 @@ pub fn compute_personal_difficulty(
nb_member_in_frame: usize,
last_personal_block_number: BlockNumber,
current_block_number: BlockNumber,
nb_personal_blocks_in_frame: usize,
personal_forged_blocks_in_frame: usize,
median_of_blocks_in_frame: usize,
) -> PersonalDifficulty {
PersonalDifficulty {
......@@ -190,7 +93,7 @@ pub fn compute_personal_difficulty(
nb_member_in_frame,
current_block_number.0 - last_personal_block_number.0,
),
handicap: handicap(nb_personal_blocks_in_frame, median_of_blocks_in_frame),
handicap: handicap(personal_forged_blocks_in_frame, median_of_blocks_in_frame),
}
}
......@@ -202,6 +105,7 @@ pub fn compute_personal_difficulty(
/// exclusion_factor = MAX [ 1 ; FLOOR (0.67 * nb_member_in_frame / (1 + nb_blocks_since)) ]
///
/// reference dans le protocol : https://github.com/duniter/duniter/blob/master/doc/Protocol.md#br_g18---headpowzeros-and-headpowremainder
#[inline]
pub fn exclusion_factor(nb_member_in_frame: usize, nb_blocks_since: u32) -> usize {
std::cmp::max(
1,
......@@ -213,15 +117,16 @@ pub fn exclusion_factor(nb_member_in_frame: usize, nb_blocks_since: u32) -> usiz
/// nombre median de blocs écrits par les membres dans la fenêtre courante.
/// ne gère pas le cas où le membre n'est pas dans la fenêtre courante
///
/// nb_personal_blocks_in_frame : le nombre de blocs écrits par le membre considéré dans la fenêtre courante
/// personal_forged_blocks_in_frame : le nombre de blocs écrits par le membre considéré dans la fenêtre courante
/// median_of_blocks_in_frame : le nombre médian de blocs écrits par les membres au sein de la fenêtre courante.
/// handicap = FLOOR(LN(MAX(1;(nb_personal_blocks_in_frame + 1) / median_of_blocks_in_frame)) / LN(1.189))
/// handicap = FLOOR(LN(MAX(1;(personal_forged_blocks_in_frame + 1) / median_of_blocks_in_frame)) / LN(1.189))
///
/// reference dans le protocol : https://github.com/duniter/duniter/blob/master/doc/Protocol.md#br_g18---headpowzeros-and-headpowremainder
pub fn handicap(nb_personal_blocks_in_frame: usize, median_of_blocks_in_frame: usize) -> usize {
#[inline]
pub fn handicap(personal_forged_blocks_in_frame: usize, median_of_blocks_in_frame: usize) -> usize {
(((std::cmp::max(
1,
(nb_personal_blocks_in_frame + 1) / median_of_blocks_in_frame,
(personal_forged_blocks_in_frame + 1) / median_of_blocks_in_frame,
)) as f64)
.ln()
/ 1.189.ln())
......@@ -300,13 +205,15 @@ mod tests {
fn factory_member_frame_info(
last_bn: u32,
last_mf: usize,
nbr_pbf: usize,
fb: usize,
) -> Result<Vec<u8>, DbError> {
durs_dbs_tools::to_bytes(&MemberFrameInfo {
last_personal_block_number: BlockNumber(last_bn),
last_personal_nb_members_in_frame: last_mf,
nb_personal_blocks_in_frame: nbr_pbf,
personal_difficulty: PersonalDifficulty::default(),
member_in_current_frame: MemberInCurrentFrame {
forged_blocks: fb,
difficulty: PersonalDifficulty::default(),
},
})
}
......
// Copyright (C) 2017-2019 The AXIOM TEAM Association.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//! Defines current frame entities (struct and traits)
use dubp_common_doc::BlockNumber;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
/// Describe a member in current frame
pub struct MemberInCurrentFrame {
/// Number of blocks forged by the member in the current frame.
pub forged_blocks: usize,
/// Personal difficulty of the member.
pub difficulty: PersonalDifficulty,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
/// Personal difficulty of a member.
pub struct PersonalDifficulty {
/// Exclusion factor
pub exclusion_factor: usize,
/// Handicap
pub handicap: usize,
}
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 block number written by this member
pub last_personal_block_number: BlockNumber,
/// Nb member in current frame when last block was written by this member
pub last_personal_nb_members_in_frame: usize,
/// Substruct member_in_current_frame (forged_blocks, difficulty) read scope oriented
pub member_in_current_frame: MemberInCurrentFrame,
}
// Copyright (C) 2017-2019 The AXIOM TEAM Association.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//! Getters for easyer access to store
use crate::*;
use serde::de::DeserializeOwned;
// TODO: tester ça
/// -- fr --
/// Récupère dans le store store_name de la db active le contenu u64 de la clef key
/// la clef doit être présente dans le store, sinon DBCorrupted
/// ne fonctionne que pour des store à index / clef au format u32
pub fn get_required_u64_in_int_store<DB: DbReadable, R: DbReader>(
db: &DB,
r: &R,
store_name: &str,
key: u32,
) -> Result<u64, DbError> {
if let Some(value) = db.get_int_store(store_name).get(r, key)? {
if let DbValue::U64(value_u64) = value {
Ok(value_u64)
} else {
Err(DbError::DBCorrupted)
}
} else {
Err(DbError::DBCorrupted)
}
}
// TODO: tester ça
//pub fn get_required_bin_in_int_store<DB: DbReadable, R: DbReader, V: DeserializeOwned>(
// db: &DB,
// r: &R,
// store_name: &str,
// key: u32,
//) -> Result<V, DbError> {
// if let Some(value) = db.get_int_store(store_name).get(r, key)? {
// Ok(BcDbRo::from_db_value(value)?)
// } else {
// Err(DbError::DBCorrupted)
// }
//}
/// TODO: tester ça
/// -- fr --
/// récupère dans le store store_name de la db active le contenu binaire/Blob de la clef key
/// retourne None si la clef n'est pas trouvée.
/// ne fonctionne que pour des store à index / clef au format u32
pub fn get_bin_in_int_store<DB: DbReadable, R: DbReader, V: DeserializeOwned>(
db: &DB,
r: &R,
store_name: &str,
key: u32,
) -> Result<Option<V>, DbError> {
if let Some(value) = db.get_int_store(store_name).get(r, key)? {
Ok(Some(BcDbRo::from_db_value(value)?))
} else {
Ok(None)
}
}
......@@ -32,6 +32,7 @@ pub mod constants;
pub mod currency_params;
pub mod current_frame;
pub mod current_meta_datas;
pub mod get;
pub mod indexes;
pub mod paging;
pub mod tools;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment