beacon 0.2.0

Minimal Serenity beacon chain implementation
Documentation
use crate::types::*;
use crate::{Config, BeaconState, Error, BLSConfig};
use bm_le::tree_root;

impl<C: Config> BeaconState<C> {
	/// Process a block header.
	pub fn process_block_header<'a, 'b, B: Block, BLS: BLSConfig>(
		&'a mut self,
		block: &'b B
	) -> Result<(), Error> where
		UnsealedBeaconBlock<C>: From<&'b B>,
	{
		if block.slot() != self.slot {
			return Err(Error::BlockSlotInvalid)
		}

		if block.parent_root() != &tree_root::<C::Digest, _>(
			&SigningBeaconBlockHeader::from(self.latest_block_header.clone())
		) {
			return Err(Error::BlockPreviousRootInvalid)
		}

		self.latest_block_header = BeaconBlockHeader {
			slot: block.slot(),
			parent_root: *block.parent_root(),
			body_root: tree_root::<C::Digest, _>(block.body()),
			..Default::default()
		};

		let proposer = &self.validators[
			self.beacon_proposer_index()? as usize
		];
		if proposer.slashed {
			return Err(Error::BlockProposerSlashed)
		}

		if let Some(signature) = block.signature() {
			if !BLS::verify(
				&proposer.pubkey,
				&tree_root::<C::Digest, _>(&UnsealedBeaconBlock::from(block)),
				signature,
				self.domain(C::domain_beacon_proposer(), None)
			) {
				return Err(Error::BlockSignatureInvalid)
			}
		}

		Ok(())
	}
}