add initial attestation validation structure
This commit is contained in:
parent
16bc6ba82a
commit
b6f4d1c968
@ -15,3 +15,4 @@ pub mod crosslink_record;
|
|||||||
pub mod shard_and_committee;
|
pub mod shard_and_committee;
|
||||||
pub mod transition;
|
pub mod transition;
|
||||||
pub mod validator_record;
|
pub mod validator_record;
|
||||||
|
pub mod validation;
|
||||||
|
66
lighthouse/state/validation/attestation_validation.rs
Normal file
66
lighthouse/state/validation/attestation_validation.rs
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
1
lighthouse/state/validation/mod.rs
Normal file
1
lighthouse/state/validation/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
mod attestation_validation;
|
12
lighthouse/utils/errors.rs
Normal file
12
lighthouse/utils/errors.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Collection of custom errors
|
||||||
|
|
||||||
|
#[derive(Debug,PartialEq)]
|
||||||
|
pub enum AttestationValidationError {
|
||||||
|
SlotTooHigh,
|
||||||
|
SlotTooLow(String),
|
||||||
|
IncorrectBitField,
|
||||||
|
NonZeroTrailingBits,
|
||||||
|
AggregateSignatureFail
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -7,3 +7,4 @@ pub mod types;
|
|||||||
pub mod bls;
|
pub mod bls;
|
||||||
pub mod test_helpers;
|
pub mod test_helpers;
|
||||||
pub mod logging;
|
pub mod logging;
|
||||||
|
pub mod errors;
|
||||||
|
Loading…
Reference in New Issue
Block a user