From b0e3ce78855c8823f1929a4205cc2e1577006a86 Mon Sep 17 00:00:00 2001 From: Luke Anderson Date: Fri, 13 Sep 2019 18:58:08 +1000 Subject: [PATCH] Addressed Paul's comments regarding head_state. --- beacon_node/rest_api/src/beacon.rs | 6 +++--- beacon_node/rest_api/src/helpers.rs | 10 ---------- beacon_node/rest_api/src/metrics.rs | 1 + beacon_node/rest_api/src/node.rs | 9 ++------- beacon_node/rest_api/src/validator.rs | 19 +++++++++++++++---- 5 files changed, 21 insertions(+), 24 deletions(-) diff --git a/beacon_node/rest_api/src/beacon.rs b/beacon_node/rest_api/src/beacon.rs index 3b9b2a008..c1f49c1fc 100644 --- a/beacon_node/rest_api/src/beacon.rs +++ b/beacon_node/rest_api/src/beacon.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use store::Store; use types::{BeaconBlock, BeaconState, Epoch, EthSpec, Hash256, Slot, Validator}; -#[derive(Serialize)] +#[derive(Serialize, Encode)] pub struct HeadResponse { pub slot: Slot, pub block_root: Hash256, @@ -184,7 +184,7 @@ pub struct StateResponse { /// the current head by skipping slots. pub fn get_state(req: Request) -> ApiResult { let beacon_chain = get_beacon_chain_from_request::(&req)?; - let head_state = get_head_state(beacon_chain.clone())?; + let head_state = beacon_chain.head().beacon_state; let (key, value) = match UrlQuery::from_request(&req) { Ok(query) => { @@ -253,7 +253,7 @@ pub fn get_current_finalized_checkpoint( req: Request, ) -> ApiResult { let beacon_chain = get_beacon_chain_from_request::(&req)?; - let head_state = get_head_state(beacon_chain)?; + let head_state = beacon_chain.head().beacon_state; let checkpoint = head_state.finalized_checkpoint.clone(); diff --git a/beacon_node/rest_api/src/helpers.rs b/beacon_node/rest_api/src/helpers.rs index 4dd8a475d..c58bf1038 100644 --- a/beacon_node/rest_api/src/helpers.rs +++ b/beacon_node/rest_api/src/helpers.rs @@ -182,16 +182,6 @@ pub fn get_beacon_chain_from_request( Ok(beacon_chain.clone()) } -pub fn get_head_state( - bc: Arc>, -) -> Result, ApiError> { - let mut head_state = bc.head().beacon_state; - head_state - .build_all_caches(&bc.spec) - .map_err(|e| ApiError::ServerError(format!("Unable to build state cache: {:?}", e)))?; - Ok(head_state) -} - pub fn get_logger_from_request(req: &Request) -> slog::Logger { let log = req .extensions() diff --git a/beacon_node/rest_api/src/metrics.rs b/beacon_node/rest_api/src/metrics.rs index 01dc4d22d..8ce9cb6af 100644 --- a/beacon_node/rest_api/src/metrics.rs +++ b/beacon_node/rest_api/src/metrics.rs @@ -1,3 +1,4 @@ +use crate::response_builder::ResponseBuilder; use crate::{helpers::*, success_response, ApiError, ApiResult, DBPath}; use beacon_chain::BeaconChainTypes; use http::HeaderValue; diff --git a/beacon_node/rest_api/src/node.rs b/beacon_node/rest_api/src/node.rs index 4a9f11be0..9048cb0f7 100644 --- a/beacon_node/rest_api/src/node.rs +++ b/beacon_node/rest_api/src/node.rs @@ -1,4 +1,5 @@ use crate::helpers::*; +use crate::response_builder::ResponseBuilder; use crate::{success_response, ApiResult}; use beacon_chain::BeaconChainTypes; use hyper::{Body, Request}; @@ -16,11 +17,5 @@ pub fn get_version(_req: Request) -> ApiResult { /// Read the genesis time from the current beacon chain state. pub fn get_genesis_time(req: Request) -> ApiResult { let beacon_chain = get_beacon_chain_from_request::(&req)?; - let head_state = get_head_state(beacon_chain)?; - let gen_time: u64 = head_state.genesis_time; - let body = Body::from( - serde_json::to_string(&gen_time) - .expect("Genesis should time always have a valid JSON serialization."), - ); - Ok(success_response(body)) + ResponseBuilder::new(&req).body(&beacon_chain.head().beacon_state.genesis_time) } diff --git a/beacon_node/rest_api/src/validator.rs b/beacon_node/rest_api/src/validator.rs index 84cb7a308..e3075e623 100644 --- a/beacon_node/rest_api/src/validator.rs +++ b/beacon_node/rest_api/src/validator.rs @@ -1,4 +1,5 @@ use super::{success_response, ApiResult}; +use crate::response_builder::ResponseBuilder; use crate::{helpers::*, ApiError, UrlQuery}; use beacon_chain::BeaconChainTypes; use bls::{AggregateSignature, PublicKey, Signature}; @@ -35,7 +36,7 @@ pub fn get_validator_duties(req: Request) - let log = get_logger_from_request(&req); slog::trace!(log, "Validator duties requested of API: {:?}", &req); let beacon_chain = get_beacon_chain_from_request::(&req)?; - let head_state = get_head_state(beacon_chain.clone())?; + let mut head_state = beacon_chain.head().beacon_state; slog::trace!(log, "Got head state from request."); // Parse and check query parameters @@ -72,6 +73,10 @@ pub fn get_validator_duties(req: Request) - .collect::, _>>()?; let mut duties: Vec = Vec::new(); + // Build cache for the requested epoch + head_state + .build_committee_cache(relative_epoch, &beacon_chain.spec) + .map_err(|e| ApiError::ServerError(format!("Unable to build committee cache: {:?}", e)))?; // Get a list of all validators for this epoch let validator_proposers: Vec = epoch .slot_iter(T::EthSpec::slots_per_epoch()) @@ -79,7 +84,6 @@ pub fn get_validator_duties(req: Request) - head_state .get_beacon_proposer_index(slot, relative_epoch, &beacon_chain.spec) .map_err(|e| { - // TODO: why are we getting an uninitialized state error here??? ApiError::ServerError(format!( "Unable to get proposer index for validator: {:?}", e @@ -181,13 +185,13 @@ pub fn get_new_beacon_block(req: Request) - serde_json::to_string(&new_block) .expect("We should always be able to serialize a new block that we produced."), ); - Ok(success_response(body)) + ResponseBuilder::new(&req).body(&new_block) } /// HTTP Handler to produce a new Attestation from the current state, ready to be signed by a validator. pub fn get_new_attestation(req: Request) -> ApiResult { let beacon_chain = get_beacon_chain_from_request::(&req)?; - let head_state = get_head_state(beacon_chain.clone())?; + let mut head_state = beacon_chain.head().beacon_state; let query = UrlQuery::from_request(&req)?; let val_pk_str = query @@ -195,6 +199,9 @@ pub fn get_new_attestation(req: Request) -> .map(|(_key, value)| value)?; let val_pk = parse_pubkey(val_pk_str.as_str())?; + head_state + .update_pubkey_cache() + .map_err(|e| ApiError::ServerError(format!("Unable to build pubkey cache: {:?}", e)))?; // Get the validator index from the supplied public key // If it does not exist in the index, we cannot continue. let val_index = head_state @@ -206,6 +213,10 @@ pub fn get_new_attestation(req: Request) -> "The provided validator public key does not correspond to a validator index.".into(), ))?; + // Build cache for the requested epoch + head_state + .build_committee_cache(RelativeEpoch::Current, &beacon_chain.spec) + .map_err(|e| ApiError::ServerError(format!("Unable to build committee cache: {:?}", e)))?; // Get the duties of the validator, to make sure they match up. // If they don't have duties this epoch, then return an error let val_duty = head_state