Add first block validation benches
This commit is contained in:
		
							parent
							
								
									84bb40855f
								
							
						
					
					
						commit
						a8b08fb300
					
				| @ -1,3 +1,5 @@ | ||||
| #![feature(test)] | ||||
| 
 | ||||
| #[macro_use] | ||||
| extern crate slog; | ||||
| extern crate slog_term; | ||||
|  | ||||
							
								
								
									
										154
									
								
								lighthouse/state/block/validation/benches.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								lighthouse/state/block/validation/benches.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,154 @@ | ||||
| /* | ||||
|  * Note: this is a copy of the ./tests.rs file that is rigged to give some fast and easy | ||||
|  * benchmarking. | ||||
|  * | ||||
|  * This file should be moved into a bench/ dir in the root and structured correctly. | ||||
|  */ | ||||
| 
 | ||||
| extern crate ssz; | ||||
| extern crate test; | ||||
| 
 | ||||
| use self::test::Bencher; | ||||
| use self::ssz::{ | ||||
|     SszStream, | ||||
| }; | ||||
| use std::sync::Arc; | ||||
| use super::{ | ||||
|     validate_ssz_block, | ||||
|     BlockStatus, | ||||
|     ProposerMap, | ||||
| }; | ||||
| use super::utils::types::{ | ||||
|     Hash256, | ||||
| }; | ||||
| use super::SszBlock; | ||||
| use super::super::Block; | ||||
| 
 | ||||
| use super::tests::{ | ||||
|     TestStore, | ||||
|     generate_attestations_for_slot, | ||||
| }; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| struct BenchmarkParams { | ||||
|     total_validators: usize, | ||||
|     cycle_length: u8, | ||||
|     shard_count: u16, | ||||
|     shards_per_slot: u16, | ||||
|     validators_per_shard: usize, | ||||
| } | ||||
| 
 | ||||
| impl BenchmarkParams { | ||||
|     pub fn danny_wants() -> Self { | ||||
|         /* | ||||
|          * 10M Eth where each validator is 32 ETH | ||||
|          */ | ||||
|         let total_validators: usize = 10_000_000 / 32; | ||||
|         /* | ||||
|          * 64 slots per cycle | ||||
|          */ | ||||
|         let cycle_length: u8 = 64; | ||||
|         /* | ||||
|          * 1024 shards | ||||
|          */ | ||||
|         let shard_count: u16 = 1024; | ||||
|         /* | ||||
|          * Number of shards per slot | ||||
|          */ | ||||
|         let shards_per_slot: u16 = 1024 / u16::from(cycle_length); | ||||
|         /* | ||||
|          * Number of validators in each shard | ||||
|          */ | ||||
|         let validators_per_shard: usize = total_validators / usize::from(shard_count); | ||||
| 
 | ||||
|         Self { | ||||
|             total_validators, | ||||
|             cycle_length, | ||||
|             shard_count, | ||||
|             shards_per_slot, | ||||
|             validators_per_shard, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[bench] | ||||
| fn bench_block_validation(b: &mut Bencher) { | ||||
|     let stores = TestStore::new(); | ||||
| 
 | ||||
|     let params = BenchmarkParams::danny_wants(); | ||||
| 
 | ||||
|     println!("{:?}", params); | ||||
| 
 | ||||
|     let cycle_length = params.cycle_length; | ||||
|     let shards_per_slot = params.shards_per_slot; | ||||
|     let validators_per_shard = params.validators_per_shard; | ||||
| 
 | ||||
|     let present_slot = u64::from(cycle_length) * 10000; | ||||
|     let justified_slot = present_slot - u64::from(cycle_length); | ||||
|     let justified_block_hash = Hash256::from("justified_hash".as_bytes()); | ||||
|     let shard_block_hash = Hash256::from("shard_hash".as_bytes()); | ||||
|     let parent_hashes: Vec<Hash256> = (0..(cycle_length * 2)) | ||||
|         .map(|i| Hash256::from(i as u64)) | ||||
|         .collect(); | ||||
|     let pow_chain_ref = Hash256::from("pow_chain".as_bytes()); | ||||
|     let active_state_root = Hash256::from("active_state".as_bytes()); | ||||
|     let crystallized_state_root = Hash256::from("cry_state".as_bytes()); | ||||
| 
 | ||||
|     stores.pow_chain.put_block_hash(pow_chain_ref.as_ref()).unwrap(); | ||||
|     stores.block.put_block(justified_block_hash.as_ref(), &vec![42]).unwrap(); | ||||
| 
 | ||||
| 
 | ||||
|     let block_slot = present_slot; | ||||
|     let validator_index: usize = 0; | ||||
|     let proposer_map = { | ||||
|         let mut proposer_map = ProposerMap::new(); | ||||
|         proposer_map.insert(present_slot, validator_index); | ||||
|         proposer_map | ||||
|     }; | ||||
|     let attestation_slot = block_slot - 1; | ||||
|     let (attester_map, attestations, _keypairs) = | ||||
|         generate_attestations_for_slot( | ||||
|             attestation_slot, | ||||
|             block_slot, | ||||
|             shards_per_slot, | ||||
|             validators_per_shard, | ||||
|             cycle_length, | ||||
|             &parent_hashes, | ||||
|             &shard_block_hash, | ||||
|             &justified_block_hash, | ||||
|             justified_slot, | ||||
|             &stores); | ||||
| 
 | ||||
|     let block = Block { | ||||
|         parent_hash: Hash256::from("parent".as_bytes()), | ||||
|         slot_number: block_slot, | ||||
|         randao_reveal: Hash256::from("randao".as_bytes()), | ||||
|         attestations, | ||||
|         pow_chain_ref, | ||||
|         active_state_root, | ||||
|         crystallized_state_root, | ||||
|     }; | ||||
| 
 | ||||
|     let mut stream = SszStream::new(); | ||||
|     stream.append(&block); | ||||
|     let serialized_block = stream.drain(); | ||||
|     let ssz_block = SszBlock::from_slice(&serialized_block[..]).unwrap(); | ||||
| 
 | ||||
|     let parent_hashes = Arc::new(parent_hashes); | ||||
|     let proposer_map = Arc::new(proposer_map); | ||||
|     let attester_map = Arc::new(attester_map); | ||||
|     b.iter(|| { | ||||
|         let status = validate_ssz_block( | ||||
|             &ssz_block, | ||||
|             present_slot, | ||||
|             cycle_length, | ||||
|             justified_slot, | ||||
|             &parent_hashes, | ||||
|             &proposer_map, | ||||
|             &attester_map, | ||||
|             &stores.block.clone(), | ||||
|             &stores.validator.clone(), | ||||
|             &stores.pow_chain.clone()).unwrap(); | ||||
|         assert_eq!(status, BlockStatus::NewBlock); | ||||
|     }); | ||||
| } | ||||
| @ -1,6 +1,8 @@ | ||||
| mod validate_ssz_block; | ||||
| #[cfg(test)] | ||||
| mod tests; | ||||
| #[cfg(test)] | ||||
| mod benches; | ||||
| 
 | ||||
| use super::attestation_record; | ||||
| use super::SszBlock; | ||||
|  | ||||
| @ -32,11 +32,11 @@ use super::super::super::bls::{ | ||||
|     AggregateSignature, | ||||
| }; | ||||
| 
 | ||||
| struct TestStore { | ||||
|     db: Arc<MemoryDB>, | ||||
|     block: Arc<BlockStore<MemoryDB>>, | ||||
|     pow_chain: Arc<PoWChainStore<MemoryDB>>, | ||||
|     validator: Arc<ValidatorStore<MemoryDB>>, | ||||
| pub struct TestStore { | ||||
|     pub db: Arc<MemoryDB>, | ||||
|     pub block: Arc<BlockStore<MemoryDB>>, | ||||
|     pub pow_chain: Arc<PoWChainStore<MemoryDB>>, | ||||
|     pub validator: Arc<ValidatorStore<MemoryDB>>, | ||||
| } | ||||
| 
 | ||||
| impl TestStore { | ||||
| @ -54,7 +54,7 @@ impl TestStore { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn generate_attestations_for_slot(attestation_slot: u64, | ||||
| pub fn generate_attestations_for_slot(attestation_slot: u64, | ||||
|                                   block_slot: u64, | ||||
|                                   shard_count: u16, | ||||
|                                   validators_per_shard: usize, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user