mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-08 17:26:04 +00:00
Add first version of safe check
This commit is contained in:
@@ -910,6 +910,45 @@ where
|
|||||||
.is_descendant(self.fc_store.finalized_checkpoint().root, block_root)
|
.is_descendant(self.fc_store.finalized_checkpoint().root, block_root)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn safe_to_import_optimistically(
|
||||||
|
&self,
|
||||||
|
current_slot: Slot,
|
||||||
|
block_slot: Slot,
|
||||||
|
block_parent_root: &Hash256,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Result<bool, Error<T::Error>> {
|
||||||
|
// If the block is sufficiently old, import it.
|
||||||
|
if block_slot + spec.safe_slots_to_import_optimistically > current_slot {
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the block has an ancestor with a verified parent, import this block.
|
||||||
|
//
|
||||||
|
// TODO(paul): this is not in the spec, add it.
|
||||||
|
//
|
||||||
|
// ## Note
|
||||||
|
//
|
||||||
|
// If `block_parent_root` is unknown this iter will always return `None`.
|
||||||
|
if self
|
||||||
|
.proto_array
|
||||||
|
.iter_nodes(block_parent_root)
|
||||||
|
.any(|node| node.execution_status.is_valid())
|
||||||
|
{
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the justified block has execution enabled, then optimistically import any block.
|
||||||
|
if !self
|
||||||
|
.get_justified_block()?
|
||||||
|
.execution_status
|
||||||
|
.is_execution_enabled()
|
||||||
|
{
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(false)
|
||||||
|
}
|
||||||
|
|
||||||
/// Return the current finalized checkpoint.
|
/// Return the current finalized checkpoint.
|
||||||
pub fn finalized_checkpoint(&self) -> Checkpoint {
|
pub fn finalized_checkpoint(&self) -> Checkpoint {
|
||||||
*self.fc_store.finalized_checkpoint()
|
*self.fc_store.finalized_checkpoint()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use crate::proto_array::{ProposerBoost, ProtoArray};
|
use crate::proto_array::{Iter, ProposerBoost, ProtoArray};
|
||||||
use crate::ssz_container::SszContainer;
|
use crate::ssz_container::SszContainer;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use ssz::{Decode, Encode};
|
use ssz::{Decode, Encode};
|
||||||
@@ -37,6 +37,14 @@ pub enum ExecutionStatus {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ExecutionStatus {
|
impl ExecutionStatus {
|
||||||
|
pub fn is_valid(&self) -> bool {
|
||||||
|
matches!(self, ExecutionStatus::Valid(_))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_execution_enabled(&self) -> bool {
|
||||||
|
!matches!(self, ExecutionStatus::Irrelevant(_))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn irrelevant() -> Self {
|
pub fn irrelevant() -> Self {
|
||||||
ExecutionStatus::Irrelevant(false)
|
ExecutionStatus::Irrelevant(false)
|
||||||
}
|
}
|
||||||
@@ -302,6 +310,11 @@ impl ProtoArrayForkChoice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// See `ProtoArray::iter_nodes`
|
||||||
|
pub fn iter_nodes<'a>(&'a self, block_root: &Hash256) -> Iter<'a> {
|
||||||
|
self.proto_array.iter_nodes(block_root)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn as_bytes(&self) -> Vec<u8> {
|
pub fn as_bytes(&self) -> Vec<u8> {
|
||||||
SszContainer::from(self).as_ssz_bytes()
|
SszContainer::from(self).as_ssz_bytes()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user