use beacon_chain::BeaconChain as RawBeaconChain; use beacon_chain::{ db::ClientDB, fork_choice::ForkChoice, parking_lot::{RwLockReadGuard, RwLockWriteGuard}, slot_clock::SlotClock, types::{BeaconState, ChainSpec, Signature}, AttestationValidationError, BlockProductionError, }; pub use beacon_chain::{BeaconChainError, BlockProcessingOutcome}; use types::{Attestation, AttestationData, BeaconBlock}; /// The RPC's API to the beacon chain. pub trait BeaconChain: Send + Sync { fn get_spec(&self) -> &ChainSpec; fn get_state(&self) -> RwLockReadGuard; fn get_mut_state(&self) -> RwLockWriteGuard; fn process_block(&self, block: BeaconBlock) -> Result; fn produce_block( &self, randao_reveal: Signature, ) -> Result<(BeaconBlock, BeaconState), BlockProductionError>; fn produce_attestation_data(&self, shard: u64) -> Result; fn process_attestation( &self, attestation: Attestation, ) -> Result<(), AttestationValidationError>; } impl BeaconChain for RawBeaconChain where T: ClientDB + Sized, U: SlotClock, F: ForkChoice, { fn get_spec(&self) -> &ChainSpec { &self.spec } fn get_state(&self) -> RwLockReadGuard { self.state.read() } fn get_mut_state(&self) -> RwLockWriteGuard { self.state.write() } fn process_block( &self, block: BeaconBlock, ) -> Result { self.process_block(block) } fn produce_block( &self, randao_reveal: Signature, ) -> Result<(BeaconBlock, BeaconState), BlockProductionError> { self.produce_block(randao_reveal) } fn produce_attestation_data(&self, shard: u64) -> Result { self.produce_attestation_data(shard) } fn process_attestation( &self, attestation: Attestation, ) -> Result<(), AttestationValidationError> { self.process_attestation(attestation) } }