mirror of
https://gitlab.com/pulsechaincom/lighthouse-pulse.git
synced 2025-01-01 00:41:20 +00:00
Add attesatation aggregation to test harness
This commit is contained in:
parent
be7e326c33
commit
2882110525
@ -45,6 +45,13 @@ where
|
|||||||
.into_beacon_state()
|
.into_beacon_state()
|
||||||
.ok_or_else(|| Error::DBError("State invalid.".to_string()))?;
|
.ok_or_else(|| Error::DBError("State invalid.".to_string()))?;
|
||||||
|
|
||||||
|
let attestations = self
|
||||||
|
.attestation_aggregator
|
||||||
|
.read()
|
||||||
|
.unwrap()
|
||||||
|
// TODO: advance the parent_state slot.
|
||||||
|
.get_attestations_for_state(&parent_state, &self.spec);
|
||||||
|
|
||||||
let mut block = BeaconBlock {
|
let mut block = BeaconBlock {
|
||||||
slot: present_slot,
|
slot: present_slot,
|
||||||
parent_root: parent_root.clone(),
|
parent_root: parent_root.clone(),
|
||||||
@ -59,7 +66,7 @@ where
|
|||||||
body: BeaconBlockBody {
|
body: BeaconBlockBody {
|
||||||
proposer_slashings: vec![],
|
proposer_slashings: vec![],
|
||||||
casper_slashings: vec![],
|
casper_slashings: vec![],
|
||||||
attestations: vec![],
|
attestations: attestations,
|
||||||
custody_reseeds: vec![],
|
custody_reseeds: vec![],
|
||||||
custody_challenges: vec![],
|
custody_challenges: vec![],
|
||||||
custody_responses: vec![],
|
custody_responses: vec![],
|
||||||
@ -70,7 +77,6 @@ where
|
|||||||
|
|
||||||
let state =
|
let state =
|
||||||
self.state_transition_without_verifying_block_signature(parent_state, &block)?;
|
self.state_transition_without_verifying_block_signature(parent_state, &block)?;
|
||||||
|
|
||||||
let state_root = state.canonical_root();
|
let state_root = state.canonical_root();
|
||||||
|
|
||||||
block.state_root = state_root;
|
block.state_root = state_root;
|
||||||
|
@ -9,7 +9,7 @@ use slot_clock::TestingSlotClock;
|
|||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use types::{BeaconBlock, ChainSpec, Keypair, Validator};
|
use types::{BeaconBlock, ChainSpec, FreeAttestation, Keypair, Validator};
|
||||||
|
|
||||||
pub struct BeaconChainHarness {
|
pub struct BeaconChainHarness {
|
||||||
pub db: Arc<MemoryDB>,
|
pub db: Arc<MemoryDB>,
|
||||||
@ -74,33 +74,69 @@ impl BeaconChainHarness {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn advance_chain_without_block(&mut self) -> BeaconBlock {
|
/// Move the `slot_clock` for the `BeaconChain` forward one slot.
|
||||||
self.produce_next_slot()
|
///
|
||||||
}
|
/// This is the equivalent of advancing a system clock forward one `SLOT_DURATION`.
|
||||||
|
pub fn increment_beacon_chain_slot(&mut self) {
|
||||||
pub fn advance_chain_with_block(&mut self) {
|
|
||||||
let block = self.produce_next_slot();
|
|
||||||
self.beacon_chain.process_block(block).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn produce_next_slot(&mut self) -> BeaconBlock {
|
|
||||||
let slot = self
|
let slot = self
|
||||||
.beacon_chain
|
.beacon_chain
|
||||||
.present_slot()
|
.present_slot()
|
||||||
.expect("Unable to determine slot.")
|
.expect("Unable to determine slot.")
|
||||||
+ 1;
|
+ 1;
|
||||||
|
|
||||||
self.beacon_chain.slot_clock.set_slot(slot);
|
self.beacon_chain.slot_clock.set_slot(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gather the `FreeAttestation`s from the valiators.
|
||||||
|
///
|
||||||
|
/// Note: validators will only produce attestations _once per slot_. So, if you call this twice
|
||||||
|
/// you'll only get attestations on the first run.
|
||||||
|
pub fn gather_free_attesations(&mut self) -> Vec<FreeAttestation> {
|
||||||
|
let present_slot = self.beacon_chain.present_slot().unwrap();
|
||||||
|
|
||||||
|
let mut free_attestations = vec![];
|
||||||
|
for validator in &mut self.validators {
|
||||||
|
// Advance the validator slot.
|
||||||
|
validator.set_slot(present_slot);
|
||||||
|
|
||||||
|
// Prompt the validator to produce an attestation (if required).
|
||||||
|
if let Ok(free_attestation) = validator.produce_free_attestation() {
|
||||||
|
free_attestations.push(free_attestation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free_attestations
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the block from the proposer for the slot.
|
||||||
|
///
|
||||||
|
/// Note: the validator will only produce it _once per slot_. So, if you call this twice you'll
|
||||||
|
/// only get a block once.
|
||||||
|
pub fn produce_block(&mut self) -> BeaconBlock {
|
||||||
|
let present_slot = self.beacon_chain.present_slot().unwrap();
|
||||||
|
|
||||||
let proposer = self
|
let proposer = self
|
||||||
.beacon_chain
|
.beacon_chain
|
||||||
.block_proposer(slot)
|
.block_proposer(present_slot)
|
||||||
.expect("Unable to determine proposer.");
|
.expect("Unable to determine proposer.");
|
||||||
|
|
||||||
self.validators[proposer].set_slot(slot);
|
|
||||||
self.validators[proposer].produce_block().unwrap()
|
self.validators[proposer].produce_block().unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Advances the chain with a BeaconBlock and attestations from all validators.
|
||||||
|
///
|
||||||
|
/// This is the ideal scenario for the Beacon Chain, 100% honest participation from
|
||||||
|
/// validators.
|
||||||
|
pub fn advance_chain_with_block(&mut self) {
|
||||||
|
self.increment_beacon_chain_slot();
|
||||||
|
let free_attestations = self.gather_free_attesations();
|
||||||
|
for free_attestation in free_attestations {
|
||||||
|
self.beacon_chain
|
||||||
|
.process_free_attestation(free_attestation.clone())
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
let block = self.produce_block();
|
||||||
|
self.beacon_chain.process_block(block).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn chain_dump(&self) -> Result<Vec<SlotDump>, DumpError> {
|
pub fn chain_dump(&self) -> Result<Vec<SlotDump>, DumpError> {
|
||||||
self.beacon_chain.chain_dump()
|
self.beacon_chain.chain_dump()
|
||||||
}
|
}
|
||||||
|
@ -26,9 +26,7 @@ where
|
|||||||
&self,
|
&self,
|
||||||
free_attestation: FreeAttestation,
|
free_attestation: FreeAttestation,
|
||||||
) -> Result<PublishOutcome, NodeError> {
|
) -> Result<PublishOutcome, NodeError> {
|
||||||
match self.beacon_chain.process_free_attestation(free_attestation) {
|
self.published_attestations.write().push(free_attestation);
|
||||||
Ok(_) => Ok(PublishOutcome::ValidAttestation),
|
Ok(PublishOutcome::ValidAttestation)
|
||||||
Err(e) => Err(NodeError::RemoteFailure(format!("{:?}", e))),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ fn it_can_build_on_genesis_block() {
|
|||||||
#[test]
|
#[test]
|
||||||
#[ignore]
|
#[ignore]
|
||||||
fn it_can_produce_past_first_epoch_boundary() {
|
fn it_can_produce_past_first_epoch_boundary() {
|
||||||
let validator_count = 2;
|
let validator_count = 100;
|
||||||
let mut harness = BeaconChainHarness::new(ChainSpec::foundation(), validator_count);
|
let mut harness = BeaconChainHarness::new(ChainSpec::foundation(), validator_count);
|
||||||
|
|
||||||
let blocks = harness.spec.epoch_length + 1;
|
let blocks = harness.spec.epoch_length + 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user