add initial attestation validation structure

This commit is contained in:
Age 2018-09-15 22:53:45 +10:00
parent 16bc6ba82a
commit b6f4d1c968
No known key found for this signature in database
GPG Key ID: 05EED64B79E06A93
5 changed files with 81 additions and 0 deletions

View File

@ -15,3 +15,4 @@ pub mod crosslink_record;
pub mod shard_and_committee;
pub mod transition;
pub mod validator_record;
pub mod validation;

View File

@ -0,0 +1,66 @@
use super::super::crystallized_state::CrystallizedState;
use super::super::active_state::ActiveState;
use super::super::attestation_record::AttestationRecord;
use super::super::block::Block;
use super::super::chain_config::ChainConfig;
use ::utils::errors::AttestationValidationError;
// implementation of validate_attestation in the v2.1 python reference implementation
// see: https://github.com/ethereum/beacon_chain/blob/a79ab2c6f03cbdabf2b6d9d435c26e2b216e09a5/beacon_chain/state/state_transition.py#L61
pub fn validate_attestation(
crystallized_state: &CrystallizedState,
active_state: &ActiveState,
attestation: &AttestationRecord,
block: &Block,
chain_config: &ChainConfig)
-> Result<bool, AttestationValidationError> {
if !(attestation.slot < block.slot_number) {
return Err(AttestationValidationError::SlotTooHigh);
}
if !(attestation.slot > (block.slot_number - chain_config.cycle_length as u64)) {
return Err(AttestationValidationError::SlotTooLow(format!("Attestation slot number too low\n\tFound: {:?}, Needed greater than: {:?}", attestation.slot, block.slot_number - chain_config.cycle_length as u64)));
}
return Ok(true);
}
#[cfg(test)]
mod tests {
use super::*;
// test helper functions
fn generate_standard_state() -> (
CrystallizedState,
ActiveState,
AttestationRecord,
Block,
ChainConfig) {
let mut crystallized_state = CrystallizedState::zero();
let mut active_state = ActiveState::zero();
let mut attestation_record = AttestationRecord::zero();
let mut block = Block::zero();
let chain_config = ChainConfig::standard();
return (crystallized_state, active_state, attestation_record, block, chain_config);
}
#[test]
fn test_attestation_validation_slot_high() {
// generate standard state
let (mut crystallized_state, mut active_state, mut attestation_record, mut block, mut chain_config) = generate_standard_state();
// set slot too high
attestation_record.slot = 30;
block.slot_number = 10;
let result = validate_attestation(&crystallized_state, &active_state, &attestation_record, &block, &chain_config);
assert_eq!(result, Err(AttestationValidationError::SlotTooHigh));
}
}

View File

@ -0,0 +1 @@
mod attestation_validation;

View File

@ -0,0 +1,12 @@
// Collection of custom errors
#[derive(Debug,PartialEq)]
pub enum AttestationValidationError {
SlotTooHigh,
SlotTooLow(String),
IncorrectBitField,
NonZeroTrailingBits,
AggregateSignatureFail
}

View File

@ -7,3 +7,4 @@ pub mod types;
pub mod bls;
pub mod test_helpers;
pub mod logging;
pub mod errors;