use beacon_chain::block_processing::{Error as ProcessingError, Outcome as ProcessingOutcome}; use beacon_chain::{block_production::Error as BlockProductionError, BeaconChain}; use block_producer::{ BeaconNode as BeaconBlockNode, BeaconNodeError as BeaconBlockNodeError, PublishOutcome, }; use db::ClientDB; use slot_clock::SlotClock; use std::sync::Arc; use types::{BeaconBlock, PublicKey, Signature}; pub struct DirectBeaconNode { beacon_chain: Arc>, } impl DirectBeaconNode { pub fn new(beacon_chain: Arc>) -> Self { Self { beacon_chain } } } impl BeaconBlockNode for DirectBeaconNode where BlockProductionError: From<::Error>, ProcessingError: From<::Error>, { fn proposer_nonce(&self, pubkey: &PublicKey) -> Result { let validator_index = self .beacon_chain .validator_index(pubkey) .ok_or_else(|| BeaconBlockNodeError::RemoteFailure("pubkey unknown.".to_string()))?; self.beacon_chain .proposer_slots(validator_index) .ok_or_else(|| { BeaconBlockNodeError::RemoteFailure("validator_index unknown.".to_string()) }) } fn produce_beacon_block( &self, slot: u64, randao_reveal: &Signature, ) -> Result, BeaconBlockNodeError> where { let (block, _state) = self .beacon_chain .produce_block(randao_reveal.clone()) .map_err(|e| BeaconBlockNodeError::RemoteFailure(format!("{:?}", e)))?; if block.slot == slot { Ok(Some(block)) } else { Err(BeaconBlockNodeError::RemoteFailure( "Unable to produce at non-current slot.".to_string(), )) } } fn publish_beacon_block( &self, block: BeaconBlock, ) -> Result { match self.beacon_chain.process_block(block) { Ok(ProcessingOutcome::ValidBlock(_)) => Ok(PublishOutcome::ValidBlock), Ok(ProcessingOutcome::InvalidBlock(reason)) => { Ok(PublishOutcome::InvalidBlock(format!("{:?}", reason))) } Err(error) => Err(BeaconBlockNodeError::RemoteFailure(format!("{:?}", error))), } } }