Fix issue with last_justified_block_hash
Previously we were just checking it exists in the DB. This is incorrect because the last_justified_block_hash _must_ be in the chain referenced by the block. I.e., it's not OK for a block to reference a justified block in another chain.
This commit is contained in:
		
							parent
							
								
									f13a4fffea
								
							
						
					
					
						commit
						cf9f8c1e85
					
				| @ -12,10 +12,7 @@ use super::db::{ | |||||||
|     ClientDB, |     ClientDB, | ||||||
|     DBError |     DBError | ||||||
| }; | }; | ||||||
| use super::db::stores::{ | use super::db::stores::ValidatorStore; | ||||||
|     BlockStore, |  | ||||||
|     ValidatorStore, |  | ||||||
| }; |  | ||||||
| use super::types::{ | use super::types::{ | ||||||
|     Hash256, |     Hash256, | ||||||
| }; | }; | ||||||
| @ -57,10 +54,10 @@ pub struct AttestationValidationContext<T> | |||||||
|     pub cycle_length: u8, |     pub cycle_length: u8, | ||||||
|     /// The last justified slot as per the client's view of the canonical chain.
 |     /// The last justified slot as per the client's view of the canonical chain.
 | ||||||
|     pub last_justified_slot: u64, |     pub last_justified_slot: u64, | ||||||
|  |     /// The last justified block hash as per the client's view of the canonical chain.
 | ||||||
|  |     pub last_justified_block_hash: Hash256, | ||||||
|     /// A vec of the hashes of the blocks preceeding the present slot.
 |     /// A vec of the hashes of the blocks preceeding the present slot.
 | ||||||
|     pub parent_hashes: Arc<Vec<Hash256>>, |     pub parent_hashes: Arc<Vec<Hash256>>, | ||||||
|     /// The store containing block information.
 |  | ||||||
|     pub block_store: Arc<BlockStore<T>>, |  | ||||||
|     /// The store containing validator information.
 |     /// The store containing validator information.
 | ||||||
|     pub validator_store: Arc<ValidatorStore<T>>, |     pub validator_store: Arc<ValidatorStore<T>>, | ||||||
|     /// A map of (slot, shard_id) to the attestation set of validation indices.
 |     /// A map of (slot, shard_id) to the attestation set of validation indices.
 | ||||||
| @ -104,6 +101,14 @@ impl<T> AttestationValidationContext<T> | |||||||
|             return Err(AttestationValidationError::JustifiedSlotIncorrect); |             return Err(AttestationValidationError::JustifiedSlotIncorrect); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         /* | ||||||
|  |          * The specified justified block hash supplied in the attestation must match our knowledge | ||||||
|  |          * of the last justified block this chain. | ||||||
|  |          */ | ||||||
|  |         if a.justified_block_hash != self.last_justified_block_hash { | ||||||
|  |             return Err(AttestationValidationError::UnknownJustifiedBlock) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         /* |         /* | ||||||
|          * There is no need to include more oblique parents hashes than there are blocks |          * There is no need to include more oblique parents hashes than there are blocks | ||||||
|          * in a cycle. |          * in a cycle. | ||||||
| @ -142,13 +147,6 @@ impl<T> AttestationValidationContext<T> | |||||||
|             return Err(AttestationValidationError::InvalidBitfieldEndBits) |             return Err(AttestationValidationError::InvalidBitfieldEndBits) | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /* |  | ||||||
|          * The specified justified block hash must be known to us |  | ||||||
|          */ |  | ||||||
|         if !self.block_store.block_exists(&a.justified_block_hash)? { |  | ||||||
|             return Err(AttestationValidationError::UnknownJustifiedBlock) |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         let signed_message = { |         let signed_message = { | ||||||
|             let parent_hashes = attestation_parent_hashes( |             let parent_hashes = attestation_parent_hashes( | ||||||
|                 self.cycle_length, |                 self.cycle_length, | ||||||
|  | |||||||
| @ -72,6 +72,8 @@ pub struct BlockValidationContext<T> | |||||||
|     pub cycle_length: u8, |     pub cycle_length: u8, | ||||||
|     /// The last justified slot as per the client's view of the canonical chain.
 |     /// The last justified slot as per the client's view of the canonical chain.
 | ||||||
|     pub last_justified_slot: u64, |     pub last_justified_slot: u64, | ||||||
|  |     /// The last justified block hash as per the client's view of the canonical chain.
 | ||||||
|  |     pub last_justified_block_hash: Hash256, | ||||||
|     /// The last finalized slot as per the client's view of the canonical chain.
 |     /// The last finalized slot as per the client's view of the canonical chain.
 | ||||||
|     pub last_finalized_slot: u64, |     pub last_finalized_slot: u64, | ||||||
|     /// A vec of the hashes of the blocks preceeding the present slot.
 |     /// A vec of the hashes of the blocks preceeding the present slot.
 | ||||||
| @ -205,8 +207,8 @@ impl<T> BlockValidationContext<T> | |||||||
|             block_slot, |             block_slot, | ||||||
|             cycle_length: self.cycle_length, |             cycle_length: self.cycle_length, | ||||||
|             last_justified_slot: self.last_justified_slot, |             last_justified_slot: self.last_justified_slot, | ||||||
|  |             last_justified_block_hash: self.last_justified_block_hash, | ||||||
|             parent_hashes: self.parent_hashes.clone(), |             parent_hashes: self.parent_hashes.clone(), | ||||||
|             block_store: self.block_store.clone(), |  | ||||||
|             validator_store: self.validator_store.clone(), |             validator_store: self.validator_store.clone(), | ||||||
|             attester_map: self.attester_map.clone(), |             attester_map: self.attester_map.clone(), | ||||||
|         }); |         }); | ||||||
|  | |||||||
| @ -3,10 +3,7 @@ use std::sync::Arc; | |||||||
| use super::db::{ | use super::db::{ | ||||||
|     MemoryDB, |     MemoryDB, | ||||||
| }; | }; | ||||||
| use super::db::stores::{ | use super::db::stores::ValidatorStore; | ||||||
|     BlockStore, |  | ||||||
|     ValidatorStore, |  | ||||||
| }; |  | ||||||
| use super::types::{ | use super::types::{ | ||||||
|     AttestationRecord, |     AttestationRecord, | ||||||
|     AttesterMap, |     AttesterMap, | ||||||
| @ -30,18 +27,15 @@ use super::hashing::{ | |||||||
| 
 | 
 | ||||||
| pub struct TestStore { | pub struct TestStore { | ||||||
|     pub db: Arc<MemoryDB>, |     pub db: Arc<MemoryDB>, | ||||||
|     pub block: Arc<BlockStore<MemoryDB>>, |  | ||||||
|     pub validator: Arc<ValidatorStore<MemoryDB>>, |     pub validator: Arc<ValidatorStore<MemoryDB>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl TestStore { | impl TestStore { | ||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         let db = Arc::new(MemoryDB::open()); |         let db = Arc::new(MemoryDB::open()); | ||||||
|         let block = Arc::new(BlockStore::new(db.clone())); |  | ||||||
|         let validator = Arc::new(ValidatorStore::new(db.clone())); |         let validator = Arc::new(ValidatorStore::new(db.clone())); | ||||||
|         Self { |         Self { | ||||||
|             db, |             db, | ||||||
|             block, |  | ||||||
|             validator, |             validator, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -141,8 +135,6 @@ pub fn setup_attestation_validation_test(shard_id: u16, attester_count: usize) | |||||||
|     let justified_block_hash = Hash256::from("justified_block".as_bytes()); |     let justified_block_hash = Hash256::from("justified_block".as_bytes()); | ||||||
|     let shard_block_hash = Hash256::from("shard_block".as_bytes()); |     let shard_block_hash = Hash256::from("shard_block".as_bytes()); | ||||||
| 
 | 
 | ||||||
|     stores.block.put_serialized_block(&justified_block_hash.as_ref(), &[42]).unwrap(); |  | ||||||
| 
 |  | ||||||
|     let attestation_slot = block_slot - 1; |     let attestation_slot = block_slot - 1; | ||||||
| 
 | 
 | ||||||
|     let mut keypairs = vec![]; |     let mut keypairs = vec![]; | ||||||
| @ -167,8 +159,8 @@ pub fn setup_attestation_validation_test(shard_id: u16, attester_count: usize) | |||||||
|         block_slot, |         block_slot, | ||||||
|         cycle_length, |         cycle_length, | ||||||
|         last_justified_slot, |         last_justified_slot, | ||||||
|  |         last_justified_block_hash: justified_block_hash, | ||||||
|         parent_hashes: parent_hashes.clone(), |         parent_hashes: parent_hashes.clone(), | ||||||
|         block_store: stores.block.clone(), |  | ||||||
|         validator_store: stores.validator.clone(), |         validator_store: stores.validator.clone(), | ||||||
|         attester_map: Arc::new(attester_map), |         attester_map: Arc::new(attester_map), | ||||||
|     }; |     }; | ||||||
|  | |||||||
| @ -41,6 +41,7 @@ pub struct BlockTestParams { | |||||||
|     pub parent_proposer_index: usize, |     pub parent_proposer_index: usize, | ||||||
|     pub validation_context_slot: u64, |     pub validation_context_slot: u64, | ||||||
|     pub validation_context_justified_slot: u64, |     pub validation_context_justified_slot: u64, | ||||||
|  |     pub validation_context_justified_block_hash: Hash256, | ||||||
|     pub validation_context_finalized_slot: u64, |     pub validation_context_finalized_slot: u64, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -93,7 +94,6 @@ pub fn setup_block_validation_scenario(params: &BlockTestParams) | |||||||
|     let shard_block_hash = Hash256::from("shard_block_hash".as_bytes()); |     let shard_block_hash = Hash256::from("shard_block_hash".as_bytes()); | ||||||
| 
 | 
 | ||||||
|     stores.pow_chain.put_block_hash(pow_chain_ref.as_ref()).unwrap(); |     stores.pow_chain.put_block_hash(pow_chain_ref.as_ref()).unwrap(); | ||||||
|     stores.block.put_serialized_block(justified_block_hash.as_ref(), &vec![42]).unwrap(); |  | ||||||
| 
 | 
 | ||||||
|     /* |     /* | ||||||
|      * Generate a minimum viable parent block and store it in the database. |      * Generate a minimum viable parent block and store it in the database. | ||||||
| @ -205,6 +205,7 @@ pub fn run_block_validation_scenario<F>( | |||||||
|         present_slot: params.validation_context_slot, |         present_slot: params.validation_context_slot, | ||||||
|         cycle_length: params.cycle_length, |         cycle_length: params.cycle_length, | ||||||
|         last_justified_slot: params.validation_context_justified_slot, |         last_justified_slot: params.validation_context_justified_slot, | ||||||
|  |         last_justified_block_hash: params.validation_context_justified_block_hash, | ||||||
|         last_finalized_slot: params.validation_context_finalized_slot, |         last_finalized_slot: params.validation_context_finalized_slot, | ||||||
|         parent_hashes: Arc::new(parent_hashes), |         parent_hashes: Arc::new(parent_hashes), | ||||||
|         proposer_map: Arc::new(proposer_map), |         proposer_map: Arc::new(proposer_map), | ||||||
|  | |||||||
| @ -34,6 +34,7 @@ fn get_simple_params() -> BlockTestParams { | |||||||
| 
 | 
 | ||||||
|     let validation_context_slot = block_slot; |     let validation_context_slot = block_slot; | ||||||
|     let validation_context_justified_slot = attestations_justified_slot; |     let validation_context_justified_slot = attestations_justified_slot; | ||||||
|  |     let validation_context_justified_block_hash = Hash256::from("justified_hash".as_bytes()); | ||||||
|     let validation_context_finalized_slot = 0; |     let validation_context_finalized_slot = 0; | ||||||
| 
 | 
 | ||||||
|     BlockTestParams { |     BlockTestParams { | ||||||
| @ -47,6 +48,7 @@ fn get_simple_params() -> BlockTestParams { | |||||||
|         attestations_justified_slot, |         attestations_justified_slot, | ||||||
|         validation_context_slot, |         validation_context_slot, | ||||||
|         validation_context_justified_slot, |         validation_context_justified_slot, | ||||||
|  |         validation_context_justified_block_hash, | ||||||
|         validation_context_finalized_slot, |         validation_context_finalized_slot, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user