Refactor out external parts to generics

Also creates a dedicated file for the message log.
This commit is contained in:
Luke Parker
2022-10-16 03:29:55 -04:00
parent 1237c41c53
commit a5f1ddaf1b
5 changed files with 243 additions and 158 deletions

View File

@@ -0,0 +1,28 @@
use core::{hash::Hash, fmt::Debug};
pub trait ValidatorId: Clone + Copy + PartialEq + Eq + Hash + Debug {}
impl<V: Clone + Copy + PartialEq + Eq + Hash + Debug> ValidatorId for V {}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum BlockError {
// Invalid behavior entirely
Fatal,
// Potentially valid behavior dependent on unsynchronized state
Temporal,
}
pub trait Block: Clone + PartialEq {
type Id: Copy + Clone + PartialEq;
fn id(&self) -> Self::Id;
}
pub trait Network<V: ValidatorId, B: Block> {
fn total_weight(&self) -> u64;
fn weight(&self, validator: V) -> u64;
fn threshold(&self) -> u64 {
((self.total_weight() * 2) / 3) + 1
}
fn validate(&mut self, block: B) -> Result<(), BlockError>;
}