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-го блока включается режим подписей блоков. 3. Начиная с 35-го блока включается режим подписей блоков.
Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой ~~лиц по предварительному сговору~~ узлов, обладающих блоками перед текущим блоком. Каждый блок, содержащий транзакцию, то есть создающий или меняющий какой-нибудь домен, должен быть подписан группой узлов, обладающих блоками перед текущим блоком.
Выбираются до 50 последних блоков перед текущим (подписываемым) блоком, среди них вычисляются 7 публичных ключей, владельцы которых должны подписать блок. Выбираются 7 публичных ключей из блоков блокчейна, владельцы которых должны подписать блок.
Вычисление происходит исходя из последних 8 байт подписи подписываемого блока. Вычисление происходит исходя из последних 8 байт подписи подписываемого блока.
Блок должен быть подписан минимум четырьмя валидаторами. Блок должен быть подписан минимум четырьмя валидаторами. То есть, после 25-го блока каждый "полный" блок подписывается 4 пустыми блоками из 7 возможных.
## Дополнительные возможности ## Дополнительные возможности
ALFIS содержит несколько особенностей, которых нет в обычном DNS. ALFIS содержит несколько особенностей, которых нет в обычном DNS.

@ -15,7 +15,7 @@ use crate::blockchain::types::BlockQuality::*;
use crate::blockchain::hash_utils::*; use crate::blockchain::hash_utils::*;
use crate::settings::Settings; use crate::settings::Settings;
use crate::keys::check_public_key_strength; use crate::keys::check_public_key_strength;
use std::cmp::{min, max}; use std::cmp::max;
use crate::blockchain::transaction::{ZoneData, DomainData}; use crate::blockchain::transaction::{ZoneData, DomainData};
use std::ops::Deref; use std::ops::Deref;
use crate::blockchain::types::MineResult::*; 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 { match self.last_full_block {
None => { self.height() + 1 } None => { self.height() + 1 }
Some(ref block) => { Some(ref block) => {
if block.index < BLOCK_SIGNERS_START { if block.index < BLOCK_SIGNERS_START {
self.height() + 1 self.height() + 1
} else { } 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 mut set = HashSet::new();
let tail = block.signature.get_tail_u64(); 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 mut count = 1;
let window = self.height() - 1; // Without the last block
while set.len() < BLOCK_SIGNERS_ALL as usize { 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 let Some(b) = self.get_block(index) {
if b.pub_key != block.pub_key && !set.contains(&b.pub_key) { if b.pub_key != block.pub_key && !set.contains(&b.pub_key) {
result.push(b.pub_key.clone()); result.push(b.pub_key.clone());
set.insert(b.pub_key); set.insert(b.pub_key);
} }
count += 1;
} }
count += 1;
} }
trace!("Got signers for block {}: {:?}", block.index, &result); trace!("Got signers for block {}: {:?}", block.index, &result);
result result

@ -15,9 +15,6 @@ pub const BLOCK_SIGNERS_ALL: u64 = 7;
/// Minimal signatures needed /// Minimal signatures needed
pub const BLOCK_SIGNERS_MIN: u64 = 4; 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 /// 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; 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() { if let Some(b) = context.chain.last_block() {
block.prev_block_hash = b.hash; block.prev_block_hash = b.hash;
} }
context.chain.next_allowed_block() context.chain.next_allowed_full_block()
}; };
if full && next_allowed_block > block.index { if full && next_allowed_block > block.index {

Loading…
Cancel
Save