starting memoized validatorset
This commit is contained in:
		
							parent
							
								
									a254b2098f
								
							
						
					
					
						commit
						7723d6281b
					
				@ -206,7 +206,7 @@ pub trait Engine : Sync + Send {
 | 
			
		||||
	///
 | 
			
		||||
	/// Engines which do draw consensus information from the state may only do so
 | 
			
		||||
	/// here.
 | 
			
		||||
	fn generate_validation_proof(&self, _call: &Call) -> ValidationProof {
 | 
			
		||||
	fn generate_validation_proof(&self, header: &Header, _call: &Call) -> ValidationProof {
 | 
			
		||||
		ValidationProof::default()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,11 +25,15 @@ use std::sync::Weak;
 | 
			
		||||
use util::{Address, H256};
 | 
			
		||||
use ethjson::spec::ValidatorSet as ValidatorSpec;
 | 
			
		||||
use client::Client;
 | 
			
		||||
use receipt::Receipt;
 | 
			
		||||
 | 
			
		||||
use self::simple_list::SimpleList;
 | 
			
		||||
use self::contract::ValidatorContract;
 | 
			
		||||
use self::safe_contract::ValidatorSafeContract;
 | 
			
		||||
use self::multi::Multi;
 | 
			
		||||
 | 
			
		||||
pub type Call = Fn(Address, Vec<u8>) -> Result<Vec<u8>, String>;
 | 
			
		||||
 | 
			
		||||
/// Creates a validator set from spec.
 | 
			
		||||
pub fn new_validator_set(spec: ValidatorSpec) -> Box<ValidatorSet> {
 | 
			
		||||
	match spec {
 | 
			
		||||
@ -42,7 +46,12 @@ pub fn new_validator_set(spec: ValidatorSpec) -> Box<ValidatorSet> {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A validator set.
 | 
			
		||||
pub trait ValidatorSet: Send + Sync {
 | 
			
		||||
	/// Get this validator set as a flexible validator set.
 | 
			
		||||
	/// Returning `None` indicates this is only usable for
 | 
			
		||||
	/// full nodes.
 | 
			
		||||
	fn as_memoized(&self) -> Option<&Memoized> { None }
 | 
			
		||||
	/// Checks if a given address is a validator.
 | 
			
		||||
	fn contains(&self, parent_block_hash: &H256, address: &Address) -> bool;
 | 
			
		||||
	/// Draws an validator nonce modulo number of validators.
 | 
			
		||||
@ -56,3 +65,35 @@ pub trait ValidatorSet: Send + Sync {
 | 
			
		||||
	/// Allows blockchain state access.
 | 
			
		||||
	fn register_contract(&self, _client: Weak<Client>) {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A flexible validator set can track its changes.
 | 
			
		||||
pub trait FlexibleValidatorSet: Send + Sync {
 | 
			
		||||
	/// Whether a validator set may have changed at this header.
 | 
			
		||||
	fn has_possibly_changed(&self, header: &Header) -> bool;
 | 
			
		||||
 | 
			
		||||
	/// Whether a validator set has changed at this header, given the block receipts.
 | 
			
		||||
	/// Called after `has_possibly_changed`.
 | 
			
		||||
	/// `Some` indicates the validator set has changed at this header and the new
 | 
			
		||||
	/// expected validator set.
 | 
			
		||||
	/// `None` indicates no change.
 | 
			
		||||
	fn has_changed(&self, header: &Header, receipts: &[Receipt]) -> Option<SimpleList>;
 | 
			
		||||
 | 
			
		||||
	/// Fetch validators at a block synchronously.
 | 
			
		||||
	fn fetch_validators(&self, header: &Header, call: &Call) -> Result<SimpleList, String>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// A memoized flexible validator set
 | 
			
		||||
pub struct Memoized {
 | 
			
		||||
	inner: Box<FlexibleValidatorSet>,
 | 
			
		||||
	memo: Mutex<(SimpleList, (H256, u64))>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Memoized {
 | 
			
		||||
	/// Denote that the
 | 
			
		||||
	pub fn use_memo_at(&self, list: SimpleList)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ValidatorSet for Memoized {
 | 
			
		||||
	fn as_memoized(&self) -> Option<&Memoized> { Some(self) }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ impl Multi {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn correct_set(&self, bh: &H256) -> Option<&Box<ValidatorSet>> {
 | 
			
		||||
	fn correct_set(&self, bh: &H256) -> Option<&ValidatorSet> {
 | 
			
		||||
		match self
 | 
			
		||||
			.block_number
 | 
			
		||||
			.read()(bh)
 | 
			
		||||
@ -55,7 +55,7 @@ impl Multi {
 | 
			
		||||
				) {
 | 
			
		||||
			Ok((block, set)) => {
 | 
			
		||||
				trace!(target: "engine", "Multi ValidatorSet retrieved for block {}.", block);
 | 
			
		||||
				Some(set)
 | 
			
		||||
				Some(&*set)
 | 
			
		||||
			},
 | 
			
		||||
			Err(e) => {
 | 
			
		||||
				debug!(target: "engine", "ValidatorSet could not be recovered: {}", e);
 | 
			
		||||
@ -66,6 +66,21 @@ impl Multi {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl ValidatorSet for Multi {
 | 
			
		||||
	fn has_possibly_changed(&self, header: &Header) -> bool {
 | 
			
		||||
		// if the sets are the same for each header, compare those.
 | 
			
		||||
		// otherwise, the sets have almost certainly changed.
 | 
			
		||||
		match (self.correct_set(&header.hash()), self.correct_set(header.parent_hash())) {
 | 
			
		||||
			(Some(a), Some(b)) if a as *const _ == b as *const _ => { a.has_possibly_changed(header) },
 | 
			
		||||
			_ => true,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn has_changed(&self, header: &Header, receipts: &[Receipt]) -> Option<Vec<Address>> {
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn fetch(&self) ->
 | 
			
		||||
 | 
			
		||||
	fn contains(&self, bh: &H256, address: &Address) -> bool {
 | 
			
		||||
		self.correct_set(bh).map_or(false, |set| set.contains(bh, address))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -22,13 +22,11 @@ use super::ValidatorSet;
 | 
			
		||||
#[derive(Debug, PartialEq, Eq, Default)]
 | 
			
		||||
pub struct SimpleList {
 | 
			
		||||
	validators: Vec<Address>,
 | 
			
		||||
	validator_n: usize,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl SimpleList {
 | 
			
		||||
	pub fn new(validators: Vec<Address>) -> Self {
 | 
			
		||||
		SimpleList {
 | 
			
		||||
			validator_n: validators.len(),
 | 
			
		||||
			validators: validators,
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -36,7 +34,7 @@ impl SimpleList {
 | 
			
		||||
 | 
			
		||||
impl HeapSizeOf for SimpleList {
 | 
			
		||||
	fn heap_size_of_children(&self) -> usize {
 | 
			
		||||
		self.validators.heap_size_of_children() + self.validator_n.heap_size_of_children()
 | 
			
		||||
		self.validators.heap_size_of_children()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -46,11 +44,12 @@ impl ValidatorSet for SimpleList {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn get(&self, _bh: &H256, nonce: usize) -> Address {
 | 
			
		||||
		self.validators.get(nonce % self.validator_n).expect("There are validator_n authorities; taking number modulo validator_n gives number in validator_n range; qed").clone()
 | 
			
		||||
		let validator_n = self.validators.len();
 | 
			
		||||
		self.validators.get(nonce % validator_n).expect("There are validator_n authorities; taking number modulo validator_n gives number in validator_n range; qed").clone()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn count(&self, _bh: &H256) -> usize {
 | 
			
		||||
		self.validator_n
 | 
			
		||||
		self.validators.len()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user