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