Validator client fixes. Hack fix for genesis start time
This commit is contained in:
parent
b4c21ccca3
commit
33473892f2
@ -37,14 +37,29 @@ impl AttestationService for AttestationServiceInstance {
|
|||||||
let state = self.chain.get_state();
|
let state = self.chain.get_state();
|
||||||
|
|
||||||
// Start by performing some checks
|
// Start by performing some checks
|
||||||
// Check that the the AttestionData is for the current slot (otherwise it will not be valid)
|
// Check that the AttestionData is for the current slot (otherwise it will not be valid)
|
||||||
if slot_requested != state.slot.as_u64() {
|
if slot_requested > state.slot.as_u64() {
|
||||||
let log_clone = self.log.clone();
|
let log_clone = self.log.clone();
|
||||||
let f = sink
|
let f = sink
|
||||||
.fail(RpcStatus::new(
|
.fail(RpcStatus::new(
|
||||||
RpcStatusCode::OutOfRange,
|
RpcStatusCode::OutOfRange,
|
||||||
Some(format!(
|
Some(format!(
|
||||||
"AttestationData request for a slot that is not the current slot."
|
"AttestationData request for a slot that is in the future."
|
||||||
|
)),
|
||||||
|
))
|
||||||
|
.map_err(move |e| {
|
||||||
|
error!(log_clone, "Failed to reply with failure {:?}: {:?}", req, e)
|
||||||
|
});
|
||||||
|
return ctx.spawn(f);
|
||||||
|
}
|
||||||
|
// currently cannot handle past slots. TODO: Handle this case
|
||||||
|
else if slot_requested < state.slot.as_u64() {
|
||||||
|
let log_clone = self.log.clone();
|
||||||
|
let f = sink
|
||||||
|
.fail(RpcStatus::new(
|
||||||
|
RpcStatusCode::InvalidArgument,
|
||||||
|
Some(format!(
|
||||||
|
"AttestationData request for a slot that is in the past."
|
||||||
)),
|
)),
|
||||||
))
|
))
|
||||||
.map_err(move |e| {
|
.map_err(move |e| {
|
||||||
@ -71,6 +86,9 @@ impl AttestationService for AttestationServiceInstance {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dbg!("Produced attestation");
|
||||||
|
dbg!(attestation_data.clone());
|
||||||
|
|
||||||
let mut attestation_data_proto = AttestationDataProto::new();
|
let mut attestation_data_proto = AttestationDataProto::new();
|
||||||
attestation_data_proto.set_ssz(ssz_encode(&attestation_data));
|
attestation_data_proto.set_ssz(ssz_encode(&attestation_data));
|
||||||
|
|
||||||
|
@ -30,22 +30,11 @@ impl ValidatorService for ValidatorServiceInstance {
|
|||||||
trace!(self.log, "RPC request"; "endpoint" => "GetValidatorDuties", "epoch" => req.get_epoch());
|
trace!(self.log, "RPC request"; "endpoint" => "GetValidatorDuties", "epoch" => req.get_epoch());
|
||||||
|
|
||||||
let spec = self.chain.get_spec();
|
let spec = self.chain.get_spec();
|
||||||
// update the caches if necessary
|
let state = self.chain.get_state();
|
||||||
{
|
|
||||||
let mut mut_state = self.chain.get_mut_state();
|
|
||||||
|
|
||||||
let _ = mut_state.build_epoch_cache(RelativeEpoch::NextWithoutRegistryChange, spec);
|
|
||||||
|
|
||||||
let _ = mut_state.build_epoch_cache(RelativeEpoch::NextWithRegistryChange, spec);
|
|
||||||
let _ = mut_state.update_pubkey_cache();
|
|
||||||
}
|
|
||||||
|
|
||||||
let epoch = Epoch::from(req.get_epoch());
|
let epoch = Epoch::from(req.get_epoch());
|
||||||
let mut resp = GetDutiesResponse::new();
|
let mut resp = GetDutiesResponse::new();
|
||||||
let resp_validators = resp.mut_active_validators();
|
let resp_validators = resp.mut_active_validators();
|
||||||
|
|
||||||
let state = self.chain.get_state();
|
|
||||||
|
|
||||||
let relative_epoch =
|
let relative_epoch =
|
||||||
match RelativeEpoch::from_epoch(state.slot.epoch(spec.slots_per_epoch), epoch) {
|
match RelativeEpoch::from_epoch(state.slot.epoch(spec.slots_per_epoch), epoch) {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
|
@ -99,6 +99,9 @@ fn validate_attestation_parametric(
|
|||||||
crosslink_data_root: attestation.data.crosslink_data_root,
|
crosslink_data_root: attestation.data.crosslink_data_root,
|
||||||
epoch: attestation.data.slot.epoch(spec.slots_per_epoch),
|
epoch: attestation.data.slot.epoch(spec.slots_per_epoch),
|
||||||
};
|
};
|
||||||
|
dbg!(attestation.clone());
|
||||||
|
dbg!(state.latest_crosslinks[attestation.data.shard as usize].clone());
|
||||||
|
dbg!(potential_crosslink.clone());
|
||||||
verify!(
|
verify!(
|
||||||
(attestation.data.previous_crosslink
|
(attestation.data.previous_crosslink
|
||||||
== state.latest_crosslinks[attestation.data.shard as usize])
|
== state.latest_crosslinks[attestation.data.shard as usize])
|
||||||
|
@ -6,6 +6,8 @@ use dirs;
|
|||||||
use log::debug;
|
use log::debug;
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
//TODO: testing only
|
||||||
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
pub const KEYPAIRS_FILE: &str = "keypairs.raw_keypairs";
|
pub const KEYPAIRS_FILE: &str = "keypairs.raw_keypairs";
|
||||||
|
|
||||||
@ -120,7 +122,13 @@ impl TestingBeaconStateBuilder {
|
|||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let genesis_time = 1553977336; // arbitrary
|
//TODO: Testing only
|
||||||
|
let now = SystemTime::now()
|
||||||
|
.duration_since(SystemTime::UNIX_EPOCH)
|
||||||
|
.unwrap()
|
||||||
|
.as_secs()
|
||||||
|
- 30;
|
||||||
|
let genesis_time = now; // arbitrary
|
||||||
|
|
||||||
let mut state = BeaconState::genesis(
|
let mut state = BeaconState::genesis(
|
||||||
genesis_time,
|
genesis_time,
|
||||||
|
@ -29,11 +29,15 @@ use std::sync::RwLock;
|
|||||||
use std::time::{Duration, Instant, SystemTime};
|
use std::time::{Duration, Instant, SystemTime};
|
||||||
use tokio::prelude::*;
|
use tokio::prelude::*;
|
||||||
use tokio::runtime::Builder;
|
use tokio::runtime::Builder;
|
||||||
use tokio::timer::Interval;
|
use tokio::timer::{Delay, Interval};
|
||||||
use tokio_timer::clock::Clock;
|
use tokio_timer::clock::Clock;
|
||||||
use types::test_utils::generate_deterministic_keypairs;
|
use types::test_utils::generate_deterministic_keypairs;
|
||||||
use types::{ChainSpec, Epoch, Fork, Slot};
|
use types::{ChainSpec, Epoch, Fork, Slot};
|
||||||
|
|
||||||
|
/// A fixed amount of time after a slot to perform operations. This gives the node time to complete
|
||||||
|
/// per-slot processes.
|
||||||
|
const TIME_DELAY_FROM_SLOT: Duration = Duration::from_millis(200);
|
||||||
|
|
||||||
/// The validator service. This is the main thread that executes and maintains validator
|
/// The validator service. This is the main thread that executes and maintains validator
|
||||||
/// duties.
|
/// duties.
|
||||||
//TODO: Generalize the BeaconNode types to use testing
|
//TODO: Generalize the BeaconNode types to use testing
|
||||||
@ -230,6 +234,8 @@ impl<B: BeaconNodeDuties + 'static, S: Signer + 'static> Service<B, S> {
|
|||||||
runtime.block_on(
|
runtime.block_on(
|
||||||
interval
|
interval
|
||||||
.for_each(move |_| {
|
.for_each(move |_| {
|
||||||
|
// wait for node to process
|
||||||
|
std::thread::sleep(TIME_DELAY_FROM_SLOT);
|
||||||
// if a non-fatal error occurs, proceed to the next slot.
|
// if a non-fatal error occurs, proceed to the next slot.
|
||||||
let _ignore_error = service.per_slot_execution();
|
let _ignore_error = service.per_slot_execution();
|
||||||
// completed a slot process
|
// completed a slot process
|
||||||
|
Loading…
Reference in New Issue
Block a user