Updated consensus code.
This commit is contained in:
+3
-3
@@ -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;
|
||||
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user