Updated consensus code.

pull/61/head
Revertron 3 years ago
parent 40a4af4cc1
commit 6c3135d1e3

@ -69,10 +69,10 @@ ALFIS это ALternative Free Identity System. Альтернативная бе
А так получается, что легитимный пользователь, единожды намайнивший ключи, довольно просто сможет создавать нужные ему домены. С интервалом в сутки.
3. Начиная с 35-го блока включается режим подписей блоков.
Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой ~~лиц по предварительному сговору~~ узлов, обладающих блоками перед текущим блоком.
Выбираются до 50 последних блоков перед текущим (подписываемым) блоком, среди них вычисляются 7 публичных ключей, владельцы которых должны подписать блок.
Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой узлов, обладающих блоками перед текущим блоком.
Выбираются 7 публичных ключей из блоков блокчейна, владельцы которых должны подписать блок.
Вычисление происходит исходя из последних 8 байт подписи подписываемого блока.
Блок должен быть подписан минимум четырьмя валидаторами.
Блок должен быть подписан минимум четырьмя валидаторами. То есть, после 25-го блока каждый "полный" блок подписывается 4 пустыми блоками из 7 возможных.
## Дополнительные возможности
ALFIS содержит несколько особенностей, которых нет в обычном DNS.

@ -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

@ -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;

@ -226,7 +226,7 @@ fn find_hash(context: Arc<Mutex<Context>>, mut block: Block, running: Arc<Atomic
if let Some(b) = context.chain.last_block() {
block.prev_block_hash = b.hash;
}
context.chain.next_allowed_block()
context.chain.next_allowed_full_block()
};
if full && next_allowed_block > block.index {

Loading…
Cancel
Save