Improve reduced tree fork choice

This commit is contained in:
Paul Hauner
2019-06-15 18:19:08 -04:00
parent 7756a658a7
commit f4621a9f1a
6 changed files with 225 additions and 107 deletions

View File

@@ -21,9 +21,9 @@ pub struct ForkChoice<T: BeaconChainTypes> {
}
impl<T: BeaconChainTypes> ForkChoice<T> {
pub fn new(store: Arc<T::Store>) -> Self {
pub fn new(store: Arc<T::Store>, genesis_block_root: Hash256) -> Self {
Self {
backend: T::LmdGhost::new(store),
backend: T::LmdGhost::new(store, genesis_block_root),
}
}
@@ -67,7 +67,29 @@ impl<T: BeaconChainTypes> ForkChoice<T> {
.map_err(Into::into)
}
pub fn process_attestation(
/// Process all attestations in the given `block`.
///
/// Assumes the block (and therefore it's attestations) are valid. It is a logic error to
/// provide an invalid block.
pub fn process_block(
&self,
state: &BeaconState<T::EthSpec>,
block: &BeaconBlock,
) -> Result<()> {
// Note: we never count the block as a latest message, only attestations.
//
// I (Paul H) do not have an explicit reference to this, but I derive it from this
// document:
//
// https://github.com/ethereum/eth2.0-specs/blob/v0.7.0/specs/core/0_fork-choice.md
for attestation in &block.body.attestations {
self.process_attestation_from_block(state, attestation)?;
}
Ok(())
}
fn process_attestation_from_block(
&self,
state: &BeaconState<T::EthSpec>,
attestation: &Attestation,
@@ -94,28 +116,6 @@ impl<T: BeaconChainTypes> ForkChoice<T> {
Ok(())
}
/// A helper function which runs `self.process_attestation` on all `Attestation` in the given `BeaconBlock`.
///
/// Assumes the block (and therefore it's attestations) are valid. It is a logic error to
/// provide an invalid block.
pub fn process_block(
&self,
state: &BeaconState<T::EthSpec>,
block: &BeaconBlock,
) -> Result<()> {
// Note: we never count the block as a latest message, only attestations.
//
// I (Paul H) do not have an explicit reference to this, however I derive it from this
// document:
//
// https://github.com/ethereum/eth2.0-specs/blob/v0.7.0/specs/core/0_fork-choice.md
for attestation in &block.body.attestations {
self.process_attestation(state, attestation)?;
}
Ok(())
}
}
impl From<BeaconStateError> for Error {