Added YAML types for list of validators and added some logging to duties function.
This commit is contained in:
parent
6cbef7b58b
commit
e6a0d038e9
@ -6,7 +6,7 @@ use serde::Serialize;
|
|||||||
use ssz_derive::Encode;
|
use ssz_derive::Encode;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use store::Store;
|
use store::Store;
|
||||||
use types::{BeaconBlock, BeaconState, Epoch, EthSpec, Hash256, Slot};
|
use types::{BeaconBlock, BeaconState, Epoch, EthSpec, Hash256, Slot, Validator};
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
pub struct HeadResponse {
|
pub struct HeadResponse {
|
||||||
@ -162,21 +162,13 @@ pub fn get_validators<T: BeaconChainTypes + 'static>(req: Request<Body>) -> ApiR
|
|||||||
};
|
};
|
||||||
|
|
||||||
let all_validators = &beacon_chain.head().beacon_state.validators;
|
let all_validators = &beacon_chain.head().beacon_state.validators;
|
||||||
let mut active_validators = Vec::with_capacity(all_validators.len());
|
let active_vals: Vec<Validator> = all_validators
|
||||||
for (_index, validator) in all_validators.iter().enumerate() {
|
.iter()
|
||||||
if validator.is_active_at(epoch) {
|
.filter(|v| v.is_active_at(epoch))
|
||||||
active_validators.push(validator)
|
.cloned()
|
||||||
}
|
.collect();
|
||||||
}
|
|
||||||
active_validators.shrink_to_fit();
|
|
||||||
let json: String = serde_json::to_string(&active_validators).map_err(|e| {
|
|
||||||
ApiError::ServerError(format!(
|
|
||||||
"Unable to serialize list of active validators: {:?}",
|
|
||||||
e
|
|
||||||
))
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(success_response(Body::from(json)))
|
ResponseBuilder::new(&req).body(&active_vals)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Encode)]
|
#[derive(Serialize, Encode)]
|
||||||
|
@ -179,6 +179,7 @@ pub fn get_beacon_chain_from_request<T: BeaconChainTypes + 'static>(
|
|||||||
.get::<Arc<BeaconChain<T>>>()
|
.get::<Arc<BeaconChain<T>>>()
|
||||||
.ok_or_else(|| ApiError::ServerError("Beacon chain extension missing".into()))?;
|
.ok_or_else(|| ApiError::ServerError("Beacon chain extension missing".into()))?;
|
||||||
|
|
||||||
|
/*
|
||||||
let _state_now = beacon_chain
|
let _state_now = beacon_chain
|
||||||
.state_now()
|
.state_now()
|
||||||
.map_err(|e| ApiError::ServerError(format!("Unable to get current BeaconState {:?}", e)))?
|
.map_err(|e| ApiError::ServerError(format!("Unable to get current BeaconState {:?}", e)))?
|
||||||
@ -188,10 +189,19 @@ pub fn get_beacon_chain_from_request<T: BeaconChainTypes + 'static>(
|
|||||||
))?
|
))?
|
||||||
.build_all_caches(&beacon_chain.spec)
|
.build_all_caches(&beacon_chain.spec)
|
||||||
.map_err(|e| ApiError::ServerError(format!("Unable to build state caches: {:?}", e)))?;
|
.map_err(|e| ApiError::ServerError(format!("Unable to build state caches: {:?}", e)))?;
|
||||||
|
*/
|
||||||
|
|
||||||
Ok(beacon_chain.clone())
|
Ok(beacon_chain.clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_logger_from_request(req: &Request<Body>) -> slog::Logger {
|
||||||
|
let log = req
|
||||||
|
.extensions()
|
||||||
|
.get::<slog::Logger>()
|
||||||
|
.expect("Should always get the logger from the request, since we put it in there.");
|
||||||
|
log.to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
@ -32,27 +32,44 @@ impl ValidatorDuty {
|
|||||||
|
|
||||||
/// HTTP Handler to retrieve a the duties for a set of validators during a particular epoch
|
/// HTTP Handler to retrieve a the duties for a set of validators during a particular epoch
|
||||||
pub fn get_validator_duties<T: BeaconChainTypes + 'static>(req: Request<Body>) -> ApiResult {
|
pub fn get_validator_duties<T: BeaconChainTypes + 'static>(req: Request<Body>) -> ApiResult {
|
||||||
|
let log = get_logger_from_request(&req);
|
||||||
|
slog::trace!(log, "Validator duties requested of API: {:?}", &req);
|
||||||
let beacon_chain = get_beacon_chain_from_request::<T>(&req)?;
|
let beacon_chain = get_beacon_chain_from_request::<T>(&req)?;
|
||||||
let head_state = &beacon_chain.head().beacon_state;
|
let mut head_state = beacon_chain
|
||||||
|
.state_now()
|
||||||
|
.map_err(|e| ApiError::ServerError(format!("Unable to get current BeaconState {:?}", e)))?;
|
||||||
|
|
||||||
|
slog::trace!(log, "Got head state from request.");
|
||||||
// Parse and check query parameters
|
// Parse and check query parameters
|
||||||
let query = UrlQuery::from_request(&req)?;
|
let query = UrlQuery::from_request(&req)?;
|
||||||
let current_epoch = head_state.current_epoch();
|
let current_epoch = head_state.current_epoch();
|
||||||
let epoch = match query.first_of(&["epoch"]) {
|
let epoch = match query.first_of(&["epoch"]) {
|
||||||
Ok((_, v)) => Epoch::new(v.parse::<u64>().map_err(|e| {
|
Ok((_, v)) => {
|
||||||
ApiError::InvalidQueryParams(format!("Invalid epoch parameter, must be a u64. {:?}", e))
|
slog::trace!(log, "Requested epoch {:?}", v);
|
||||||
})?),
|
Epoch::new(v.parse::<u64>().map_err(|e| {
|
||||||
|
slog::info!(log, "Invalid epoch {:?}", e);
|
||||||
|
ApiError::InvalidQueryParams(format!(
|
||||||
|
"Invalid epoch parameter, must be a u64. {:?}",
|
||||||
|
e
|
||||||
|
))
|
||||||
|
})?)
|
||||||
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
// epoch not supplied, use the current epoch
|
// epoch not supplied, use the current epoch
|
||||||
|
slog::info!(log, "Using default epoch {:?}", current_epoch);
|
||||||
current_epoch
|
current_epoch
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let relative_epoch = RelativeEpoch::from_epoch(current_epoch, epoch).map_err(|e| {
|
let relative_epoch = RelativeEpoch::from_epoch(current_epoch, epoch).map_err(|e| {
|
||||||
|
slog::info!(log, "Requested epoch out of range.");
|
||||||
ApiError::InvalidQueryParams(format!(
|
ApiError::InvalidQueryParams(format!(
|
||||||
"Cannot get RelativeEpoch, epoch out of range: {:?}",
|
"Cannot get RelativeEpoch, epoch out of range: {:?}",
|
||||||
e
|
e
|
||||||
))
|
))
|
||||||
})?;
|
})?;
|
||||||
|
if let Some(s) = head_state.maybe_as_mut_ref() {
|
||||||
|
s.build_all_caches(&beacon_chain.spec).ok();
|
||||||
|
}
|
||||||
let validators: Vec<PublicKey> = query
|
let validators: Vec<PublicKey> = query
|
||||||
.all_of("validator_pubkeys")?
|
.all_of("validator_pubkeys")?
|
||||||
.iter()
|
.iter()
|
||||||
|
Loading…
Reference in New Issue
Block a user