Fix beacon node rpc compilation issues
This commit is contained in:
parent
1f437a3e7b
commit
086ebb1485
@ -1,13 +1,12 @@
|
||||
use crate::beacon_chain::BeaconChain;
|
||||
use bls::PublicKey;
|
||||
use futures::Future;
|
||||
use grpcio::{RpcContext, RpcStatus, RpcStatusCode, UnarySink};
|
||||
use protos::services::{
|
||||
GetDutiesRequest, GetDutiesResponse, Validators};
|
||||
use protos::services::{ActiveValidator, GetDutiesRequest, GetDutiesResponse, ValidatorDuty};
|
||||
use protos::services_grpc::ValidatorService;
|
||||
use slog::{debug, Logger};
|
||||
use ssz::Decodable;
|
||||
use std::sync::Arc;
|
||||
use crate::beacon_chain::BeaconChain;
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ValidatorServiceInstance {
|
||||
@ -17,11 +16,10 @@ pub struct ValidatorServiceInstance {
|
||||
//TODO: Refactor Errors
|
||||
|
||||
impl ValidatorService for ValidatorServiceInstance {
|
||||
|
||||
/// For a list of validator public keys, this function returns the slot at which each
|
||||
/// validator must propose a block, attest to a shard, their shard committee and the shard they
|
||||
/// need to attest to.
|
||||
fn get_validator_duties (
|
||||
fn get_validator_duties(
|
||||
&mut self,
|
||||
ctx: RpcContext,
|
||||
req: GetDutiesRequest,
|
||||
@ -32,102 +30,110 @@ impl ValidatorService for ValidatorServiceInstance {
|
||||
|
||||
let epoch = req.get_epoch();
|
||||
let mut resp = GetDutiesResponse::new();
|
||||
let resp_validators = resp.mut_active_validators();
|
||||
|
||||
let spec = self.chain.spec;
|
||||
let state = self.chain.state.read();
|
||||
let spec = self.chain.get_spec();
|
||||
let state = self.chain.get_state();
|
||||
|
||||
//TODO: Decide whether to rebuild the cache
|
||||
//TODO: Get the active validator indicies
|
||||
//let active_validator_indices = self.chain.state.read().get_cached_active_validator_indices(
|
||||
let active_validator_indices = &[1,2,3,4,5,6,7,8];
|
||||
let active_validator_indices = vec![1, 2, 3, 4, 5, 6, 7, 8];
|
||||
// TODO: Is this the most efficient? Perhaps we cache this data structure.
|
||||
|
||||
// this is an array of validators who are to propose this epoch
|
||||
// TODO: RelativeEpoch?
|
||||
let validator_proposers = 0..spec.slots_per_epoch.to_iter().map(|slot| state.get_beacon_proposer_index(slot, epoch, &spec)).collect();
|
||||
//let validator_proposers = [0..spec.slots_per_epoch].iter().map(|slot| state.get_beacon_proposer_index(Slot::from(slot), epoch, &spec)).collect();
|
||||
let validator_proposers: Vec<u64> = vec![1, 2, 3, 4, 5];
|
||||
|
||||
// get the duties for each validator
|
||||
for validator in validators {
|
||||
let active_validator = ActiveValidator::new();
|
||||
for validator_pk in validators.get_public_keys() {
|
||||
let mut active_validator = ActiveValidator::new();
|
||||
|
||||
|
||||
let public_key = match PublicKey::ssz_decode(validator, 0) {
|
||||
Ok((v_) => v,
|
||||
Err(_) => {
|
||||
let f = sink
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::InvalidArgument,
|
||||
Some("Invalid public_key".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
return ctx.spawn(f);
|
||||
}
|
||||
let public_key = match PublicKey::ssz_decode(validator_pk, 0) {
|
||||
Ok((v, _index)) => v,
|
||||
Err(_) => {
|
||||
let f = sink
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::InvalidArgument,
|
||||
Some("Invalid public_key".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
return ctx.spawn(f);
|
||||
}
|
||||
};
|
||||
|
||||
// is the validator active
|
||||
let val_index = match state.get_validator_index(&public_key) {
|
||||
Ok(index) => {
|
||||
if active_validator_indices.contains(index) {
|
||||
Ok(Some(index)) => {
|
||||
if active_validator_indices.contains(&index) {
|
||||
// validator is active, return the index
|
||||
index
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// validator is inactive, go to the next validator
|
||||
active_validator.set_none();
|
||||
resp.push(active_validator);
|
||||
active_validator.set_none(false);
|
||||
resp_validators.push(active_validator);
|
||||
break;
|
||||
}
|
||||
},
|
||||
}
|
||||
// validator index is not known, skip it
|
||||
Ok(_) => {
|
||||
active_validator.set_none(false);
|
||||
resp_validators.push(active_validator);
|
||||
break;
|
||||
}
|
||||
// the cache is not built, throw an error
|
||||
Err(_) =>{
|
||||
Err(_) => {
|
||||
let f = sink
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::FailedPreCondition,
|
||||
Some("Beacon state cache is not built".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::FailedPrecondition,
|
||||
Some("Beacon state cache is not built".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
return ctx.spawn(f);
|
||||
}
|
||||
};
|
||||
|
||||
// we have an active validator, set its duties
|
||||
let duty = ValidatorDuty::new();
|
||||
let mut duty = ValidatorDuty::new();
|
||||
|
||||
// check if it needs to propose a block
|
||||
let Some(slot) = validator_proposers.iter().position(|&v| val_index ==v) {
|
||||
duty.set_block_production_slot(slot);
|
||||
}
|
||||
else {
|
||||
// check if the validator needs to propose a block
|
||||
if let Some(slot) = validator_proposers
|
||||
.iter()
|
||||
.position(|&v| val_index as u64 == v)
|
||||
{
|
||||
duty.set_block_production_slot(epoch * spec.slots_per_epoch + slot as u64);
|
||||
} else {
|
||||
// no blocks to propose this epoch
|
||||
duty.set_none()
|
||||
duty.set_none(false)
|
||||
}
|
||||
|
||||
// get attestation duties
|
||||
let attestation_duties = match state.get_attestation_duties(val_index, &spec) {
|
||||
Ok(v) => v,
|
||||
Ok(Some(v)) => v,
|
||||
Ok(_) => unreachable!(), //we've checked the validator index
|
||||
// the cache is not built, throw an error
|
||||
Err(_) =>{
|
||||
Err(_) => {
|
||||
let f = sink
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::FailedPreCondition,
|
||||
Some("Beacon state cache is not built".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
.fail(RpcStatus::new(
|
||||
RpcStatusCode::FailedPrecondition,
|
||||
Some("Beacon state cache is not built".to_string()),
|
||||
))
|
||||
//TODO: Handle error correctly
|
||||
.map_err(move |e| println!("failed to reply {:?}: {:?}", req, e));
|
||||
return ctx.spawn(f);
|
||||
}
|
||||
};
|
||||
|
||||
duty.set_committee_index(attestation_duties.committee_index);
|
||||
duty.set_attestation_slot(attestation_duties.slot);
|
||||
duty.set_committee_index(attestation_duties.committee_index as u64);
|
||||
duty.set_attestation_slot(attestation_duties.slot.as_u64());
|
||||
duty.set_attestation_shard(attestation_duties.shard);
|
||||
|
||||
active_validator.set_duty(duty);
|
||||
resp.push(active_validator);
|
||||
}
|
||||
|
||||
resp_validators.push(active_validator);
|
||||
}
|
||||
|
||||
let f = sink
|
||||
.success(resp)
|
||||
|
Loading…
Reference in New Issue
Block a user