some cleanup

This commit is contained in:
Grant Wuerker
2019-11-20 23:43:44 +09:00
parent f95eccffb1
commit a17be85a78
2 changed files with 18 additions and 27 deletions

View File

@@ -201,10 +201,10 @@ impl<T: BeaconChainTypes + 'static> MessageHandler<T> {
match gossip_message { match gossip_message {
PubsubMessage::Block(message) => match self.decode_gossip_block(message) { PubsubMessage::Block(message) => match self.decode_gossip_block(message) {
Ok(block) => { Ok(block) => {
if self.message_processor.should_forward_block(block.clone()) { self.message_processor.on_block_gossip(peer_id.clone(), block.clone());
if self.message_processor.should_forward_block(block) {
self.propagate_message(id, peer_id.clone()); self.propagate_message(id, peer_id.clone());
} }
self.message_processor.on_block_gossip(peer_id.clone(), block);
} }
Err(e) => { Err(e) => {
debug!(self.log, "Invalid gossiped beacon block"; "peer_id" => format!("{}", peer_id), "Error" => format!("{:?}", e)); debug!(self.log, "Invalid gossiped beacon block"; "peer_id" => format!("{}", peer_id), "Error" => format!("{:?}", e));
@@ -294,7 +294,7 @@ impl<T: BeaconChainTypes + 'static> MessageHandler<T> {
&self, &self,
beacon_block: Vec<u8>, beacon_block: Vec<u8>,
) -> Result<BeaconBlock<T::EthSpec>, DecodeError> { ) -> Result<BeaconBlock<T::EthSpec>, DecodeError> {
//TODO: Apply verification before decoding. - 524 //TODO: Apply verification before decoding.
BeaconBlock::from_ssz_bytes(&beacon_block) BeaconBlock::from_ssz_bytes(&beacon_block)
} }
@@ -302,7 +302,7 @@ impl<T: BeaconChainTypes + 'static> MessageHandler<T> {
&self, &self,
beacon_block: Vec<u8>, beacon_block: Vec<u8>,
) -> Result<Attestation<T::EthSpec>, DecodeError> { ) -> Result<Attestation<T::EthSpec>, DecodeError> {
//TODO: Apply verification before decoding. - 524 //TODO: Apply verification before decoding.
Attestation::from_ssz_bytes(&beacon_block) Attestation::from_ssz_bytes(&beacon_block)
} }

View File

@@ -385,17 +385,6 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
/// Process a gossip message declaring a new block. /// Process a gossip message declaring a new block.
/// ///
/// Attempts to apply a block to the beacon chain. May queue the block for later processing. /// Attempts to apply a block to the beacon chain. May queue the block for later processing.
///
/// Returns a `bool` which, if `true`, indicates we should forward the block to our peers. 524
/// Old blocks or blocks on a different fork. Will need to recalc proposer shuffle.
/// May need heuristics...
/// Cases:
/// Do we know the block's parent?
/// 1.) It's a recent block on the same chain. We can use the current cache in the BeaconChain. (cheap)
/// 2.) Old block on a different fork. (may have to recalc shuffling)
/// If we don't know the block's parent, we don't know who is supposed to sign it, therefore we can
/// not validate the signature.
/// 1.) We can try to look up the block's parent using the syncing thread. (it's expensive not sure how to reprop from sync thread)
pub fn on_block_gossip(&mut self, peer_id: PeerId, block: BeaconBlock<T::EthSpec>) { pub fn on_block_gossip(&mut self, peer_id: PeerId, block: BeaconBlock<T::EthSpec>) {
match self.chain.process_block(block.clone()) { match self.chain.process_block(block.clone()) {
Ok(outcome) => match outcome { Ok(outcome) => match outcome {
@@ -440,6 +429,7 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
} }
} }
/// Determines whether or not a given block is fit to be forwarded to other peers.
pub fn should_forward_block(&mut self, block: BeaconBlock<T::EthSpec>) -> bool { pub fn should_forward_block(&mut self, block: BeaconBlock<T::EthSpec>) -> bool {
// Retrieve the parent block used to generate the signature. // Retrieve the parent block used to generate the signature.
// This will eventually return false if this operation fails or returns an empty option. // This will eventually return false if this operation fails or returns an empty option.
@@ -470,7 +460,7 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
}; };
// If we found a parent block and state to validate the signature with, we enter this // If we found a parent block and state to validate the signature with, we enter this
// section, otherwise, we return false. // section and find the proposer for the block's slot, otherwise, we return false.
if let Some((parent_block, mut state)) = parent_block_opt { if let Some((parent_block, mut state)) = parent_block_opt {
// Determine the epochal relationship between the parent block and the block being verified. // Determine the epochal relationship between the parent block and the block being verified.
let relative_epoch = if let Ok(relative_epoch) = RelativeEpoch::from_slot( let relative_epoch = if let Ok(relative_epoch) = RelativeEpoch::from_slot(
@@ -488,8 +478,8 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
return false; return false;
} }
// If the block is more than one epoch in the future, we must fast-forward to // If the block is more than one epoch in the future, we must fast-forward to the
// the state and compute the committee. // state and compute the committee.
for _ in state.slot.as_u64()..block.slot.as_u64() { for _ in state.slot.as_u64()..block.slot.as_u64() {
if per_slot_processing(&mut state, &self.chain.spec).is_err() { if per_slot_processing(&mut state, &self.chain.spec).is_err() {
// Return false if something goes wrong. // Return false if something goes wrong.
@@ -507,7 +497,7 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
RelativeEpoch::Current RelativeEpoch::Current
}; };
// Retrieve the block's designated proposer. // Compute the proposer for the block's slot.
let proposer_result = state let proposer_result = state
.get_beacon_proposer_index( .get_beacon_proposer_index(
block.slot, block.slot,
@@ -532,7 +522,7 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
domain domain
); );
// TODO: downvote if the signature is invalid. // TODO: Downvote if the signature is invalid.
return signature.is_valid(); return signature.is_valid();
} }
} }
@@ -572,10 +562,11 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
}; };
} }
/// Determines whether or not a given attestation is fit to be forwarded to other peers.
pub fn should_forward_attestation(&self, attestation: Attestation<T::EthSpec>) -> bool { pub fn should_forward_attestation(&self, attestation: Attestation<T::EthSpec>) -> bool {
// Attempt to validate the attestation's signature against the head state. // Attempt to validate the attestation's signature against the head state.
// In this case, we do not read anything from the database, which should be fast and will // In this case, we do not read anything from the database, which should be fast and will
// work for most attestations getting passed around the network. // work for most attestations that get passed around the network.
let head_state = &self.chain.head().beacon_state; let head_state = &self.chain.head().beacon_state;
// Convert the attestation to an indexed attestation. // Convert the attestation to an indexed attestation.
@@ -589,32 +580,32 @@ impl<T: BeaconChainTypes> MessageProcessor<T> {
&self.chain.spec &self.chain.spec
) { ) {
// An invalid signature here does not necessarily mean the attestation is invalid. // An invalid signature here does not necessarily mean the attestation is invalid.
// It could be the case that our head state does not have the same registry. // It could be the case that our state has a different validator registry.
if signature.is_valid() { if signature.is_valid() {
return true; return true;
} }
} }
} }
// Retrieve the block being attested to. // If the first check did not pass, we retrieve the block for the beacon_block_root in the
// attestation's data and use that to check the signature.
if let Ok(Some(block)) = self if let Ok(Some(block)) = self
.chain .chain
.store .store
.get::<BeaconBlock<T::EthSpec>>(&attestation.data.beacon_block_root) .get::<BeaconBlock<T::EthSpec>>(&attestation.data.beacon_block_root)
{ {
// Retrieve the block's state.
if let Ok(Some(state)) = self.chain.store.get::<BeaconState<T::EthSpec>>(&block.state_root) { if let Ok(Some(state)) = self.chain.store.get::<BeaconState<T::EthSpec>>(&block.state_root) {
// Convert the attestation to an indexed attestation. // Convert the attestation to an indexed attestation.
if let Ok(indexed_attestation) = get_indexed_attestation(&state, &attestation) { if let Ok(indexed_attestation) = get_indexed_attestation(&state, &attestation) {
// Validate the indexed attestation against the state we retrieved using the // Check if the signature is valid against the state we got from the database.
// attestation's LMD Ghost vote.
if let Ok(signature) = indexed_attestation_signature_set( if let Ok(signature) = indexed_attestation_signature_set(
&state, &state,
&indexed_attestation.signature, &indexed_attestation.signature,
&indexed_attestation, &indexed_attestation,
&self.chain.spec &self.chain.spec
) { ) {
// TODO: Downvote peer if the signature is invalid. // TODO: Maybe downvote peer if the signature is invalid.
// Also maybe downvote the peer for getting here in the first place.
return signature.is_valid(); return signature.is_valid();
} }
} }