diff --git a/docs/about_ru.md b/docs/about_ru.md index 961f537..f3ceab2 100644 --- a/docs/about_ru.md +++ b/docs/about_ru.md @@ -69,10 +69,10 @@ ALFIS это ALternative Free Identity System. Альтернативная бе А так получается, что легитимный пользователь, единожды намайнивший ключи, довольно просто сможет создавать нужные ему домены. С интервалом в сутки. 3. Начиная с 35-го блока включается режим подписей блоков. -Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой ~~лиц по предварительному сговору~~ узлов, обладающих блоками перед текущим блоком. -Выбираются до 50 последних блоков перед текущим (подписываемым) блоком, среди них вычисляются 7 публичных ключей, владельцы которых должны подписать блок. +Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой узлов, обладающих блоками перед текущим блоком. +Выбираются 7 публичных ключей из блоков блокчейна, владельцы которых должны подписать блок. Вычисление происходит исходя из последних 8 байт подписи подписываемого блока. -Блок должен быть подписан минимум четырьмя валидаторами. +Блок должен быть подписан минимум четырьмя валидаторами. То есть, после 25-го блока каждый "полный" блок подписывается 4 пустыми блоками из 7 возможных. ## Дополнительные возможности ALFIS содержит несколько особенностей, которых нет в обычном DNS. diff --git a/src/blockchain/chain.rs b/src/blockchain/chain.rs index 4c207ad..5824a93 100644 --- a/src/blockchain/chain.rs +++ b/src/blockchain/chain.rs @@ -15,7 +15,7 @@ use crate::blockchain::types::BlockQuality::*; use crate::blockchain::hash_utils::*; use crate::settings::Settings; use crate::keys::check_public_key_strength; -use std::cmp::{min, max}; +use std::cmp::max; use crate::blockchain::transaction::{ZoneData, DomainData}; use std::ops::Deref; use crate::blockchain::types::MineResult::*; @@ -551,14 +551,14 @@ impl Chain { } } - pub fn next_allowed_block(&self) -> u64 { + pub fn next_allowed_full_block(&self) -> u64 { match self.last_full_block { None => { self.height() + 1 } Some(ref block) => { if block.index < BLOCK_SIGNERS_START { self.height() + 1 } else { - max(block.index, self.height()) + BLOCK_SIGNERS_MIN + max(block.index + BLOCK_SIGNERS_MIN, self.height() + 1) } } } @@ -803,18 +803,17 @@ impl Chain { } let mut set = HashSet::new(); let tail = block.signature.get_tail_u64(); - let interval = min(block.index, BLOCK_SIGNERS_WINDOW) - 1; - let start_index = block.index - interval; let mut count = 1; + let window = self.height() - 1; // Without the last block while set.len() < BLOCK_SIGNERS_ALL as usize { - let index = start_index + ((tail * count) % BLOCK_SIGNERS_WINDOW); + let index = ((tail * count) % window) + 1; // We want it to start from 1 if let Some(b) = self.get_block(index) { if b.pub_key != block.pub_key && !set.contains(&b.pub_key) { result.push(b.pub_key.clone()); set.insert(b.pub_key); } - count += 1; } + count += 1; } trace!("Got signers for block {}: {:?}", block.index, &result); result diff --git a/src/commons/constants.rs b/src/commons/constants.rs index 9086995..45d5e89 100644 --- a/src/commons/constants.rs +++ b/src/commons/constants.rs @@ -15,9 +15,6 @@ pub const BLOCK_SIGNERS_ALL: u64 = 7; /// Minimal signatures needed pub const BLOCK_SIGNERS_MIN: u64 = 4; -/// Last number of blocks from which we select signers -pub const BLOCK_SIGNERS_WINDOW: u64 = 50; - /// Signers have 30 minutes to sign, after that time any owner of first 1000 block can add needed signature pub const BLOCK_SIGNERS_TIME: i64 = 1800; diff --git a/src/miner.rs b/src/miner.rs index 8ab10df..75bffdb 100644 --- a/src/miner.rs +++ b/src/miner.rs @@ -226,7 +226,7 @@ fn find_hash(context: Arc>, mut block: Block, running: Arc block.index {