diff --git a/beacon_node/beacon_chain/src/attestation_production.rs b/beacon_node/beacon_chain/src/attestation_production.rs new file mode 100644 index 0000000000..33d220b7f7 --- /dev/null +++ b/beacon_node/beacon_chain/src/attestation_production.rs @@ -0,0 +1,53 @@ +use super::{BeaconChain, ClientDB, SlotClock}; +use types::{AttestationData, Hash256}; + +#[derive(Debug, PartialEq)] +pub enum Error { + /* + DBError(String), + StateTransitionError(TransitionError), + PresentSlotIsNone, + */ + SlotTooOld, + PresentSlotUnknown, + StateError, +} + +impl BeaconChain +where + T: ClientDB, + U: SlotClock, +{ + pub fn produce_attestation_data( + &self, + slot: u64, + shard: u64, + ) -> Result { + let present_slot = self + .present_slot() + .ok_or_else(|| Error::PresentSlotUnknown)?; + let state = self.state(present_slot).map_err(|_| Error::StateError)?; + + let justified_slot = self.justified_slot(); + + let justified_block_root = *state + .get_block_root(justified_slot, &self.spec) + .ok_or_else(|| Error::SlotTooOld)?; + + let head_slot = self.head().beacon_block.slot; + let epoch_boundary_root = *state + .get_block_root(head_slot % self.spec.epoch_length, &self.spec) + .ok_or_else(|| Error::SlotTooOld)?; + + Ok(AttestationData { + slot, + shard, + beacon_block_root: self.head().beacon_block_root.clone(), + epoch_boundary_root, + shard_block_root: Hash256::zero(), + latest_crosslink_root: Hash256::zero(), + justified_slot, + justified_block_root, + }) + } +} diff --git a/beacon_node/beacon_chain/src/lib.rs b/beacon_node/beacon_chain/src/lib.rs index 6ea9576d82..bdb041b130 100644 --- a/beacon_node/beacon_chain/src/lib.rs +++ b/beacon_node/beacon_chain/src/lib.rs @@ -1,3 +1,4 @@ +mod attestation_production; mod attestation_targets; mod block_graph; pub mod block_processing;