Rename fork_choice_2 to lmd_ghost

This commit is contained in:
Paul Hauner 2019-06-15 11:26:56 -04:00
parent 8f44402691
commit c43bbfe183
No known key found for this signature in database
GPG Key ID: 303E4494BB28068C
5 changed files with 104 additions and 40 deletions

View File

@ -1,7 +1,7 @@
[workspace]
members = [
"eth2/fork_choice",
"eth2/fork_choice_2",
"eth2/lmd_ghost",
"eth2/operation_pool",
"eth2/state_processing",
"eth2/types",

View File

@ -1,36 +0,0 @@
pub mod reduced_tree;
use std::sync::Arc;
use types::{Hash256, Slot};
type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, PartialEq)]
pub enum Error {
BackendError(String),
}
pub trait LmdGhostBackend<T>: Send + Sync {
fn new(store: Arc<T>) -> Self;
fn process_message(
&self,
validator_index: usize,
block_hash: Hash256,
block_slot: Slot,
) -> Result<()>;
fn find_head(&self) -> Result<Hash256>;
}
pub struct ForkChoice<T> {
algorithm: T,
}
impl<T: LmdGhostBackend<T>> ForkChoice<T> {
pub fn new(store: Arc<T>) -> Self {
Self {
algorithm: T::new(store),
}
}
}

View File

@ -1,19 +1,20 @@
[package]
name = "fork_choice_2"
name = "lmd_ghost"
version = "0.1.0"
authors = ["Age Manning <Age@AgeManning.com>", "Paul Hauner <paul@sigmaprime.io>"]
edition = "2018"
[dependencies]
parking_lot = "0.7"
store = { path = "../../beacon_node/store" }
ssz = { path = "../utils/ssz" }
state_processing = { path = "../state_processing" }
types = { path = "../types" }
log = "0.4.6"
bit-vec = "0.5.0"
[dev-dependencies]
criterion = "0.2"
parking_lot = "0.7"
hex = "0.3.2"
yaml-rust = "0.4.2"
bls = { path = "../utils/bls" }

99
eth2/lmd_ghost/src/lib.rs Normal file
View File

@ -0,0 +1,99 @@
pub mod reduced_tree;
use state_processing::common::get_attesting_indices_unsorted;
use std::marker::PhantomData;
use std::sync::Arc;
use types::{Attestation, BeaconBlock, BeaconState, BeaconStateError, EthSpec, Hash256, Slot};
type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, PartialEq)]
pub enum Error {
BackendError(String),
BeaconStateError(BeaconStateError),
}
pub trait LmdGhostBackend<T, E: EthSpec>: Send + Sync {
fn new(store: Arc<T>) -> Self;
fn process_message(
&self,
validator_index: usize,
block_hash: Hash256,
block_slot: Slot,
) -> Result<()>;
fn find_head(&self) -> Result<Hash256>;
}
pub struct ForkChoice<T, E> {
backend: T,
_phantom: PhantomData<E>,
}
impl<T, E> ForkChoice<T, E>
where
T: LmdGhostBackend<T, E>,
E: EthSpec,
{
pub fn new(store: Arc<T>) -> Self {
Self {
backend: T::new(store),
_phantom: PhantomData,
}
}
pub fn find_head(&self) -> Result<Hash256> {
self.backend.find_head()
}
pub fn process_attestation(
&self,
state: &BeaconState<E>,
attestation: &Attestation,
) -> Result<()> {
let validator_indices = get_attesting_indices_unsorted(
state,
&attestation.data,
&attestation.aggregation_bitfield,
)?;
let block_hash = attestation.data.target_root;
// TODO: what happens when the target root is not the same slot as the block?
let block_slot = attestation
.data
.target_epoch
.start_slot(E::slots_per_epoch());
for validator_index in validator_indices {
self.backend
.process_message(validator_index, block_hash, block_slot)?;
}
Ok(())
}
pub fn process_block(
&self,
state: &BeaconState<E>,
block: &BeaconBlock,
block_hash: Hash256,
block_proposer: usize,
) -> Result<()> {
self.backend
.process_message(block_proposer, block_hash, block.slot)?;
for attestation in &block.body.attestations {
self.process_attestation(state, attestation)?;
}
Ok(())
}
}
impl From<BeaconStateError> for Error {
fn from(e: BeaconStateError) -> Error {
Error::BeaconStateError(e)
}
}

View File

@ -69,7 +69,7 @@ pub struct Vote {
slot: Slot,
}
impl<T, E> LmdGhostBackend<T> for ThreadSafeReducedTree<T, E>
impl<T, E> LmdGhostBackend<T, E> for ThreadSafeReducedTree<T, E>
where
T: Store,
E: EthSpec,