Add API endpoint for fork choice

This commit is contained in:
Paul Hauner
2020-01-27 12:51:28 +11:00
parent cc11e52f78
commit 8a61904d83
9 changed files with 81 additions and 2 deletions

View File

@@ -0,0 +1,18 @@
use crate::response_builder::ResponseBuilder;
use crate::{ApiError, ApiResult};
use beacon_chain::{BeaconChain, BeaconChainTypes};
use hyper::{Body, Request};
use std::sync::Arc;
/// Returns the `proto_array` fork choice struct, encoded as JSON.
///
/// Useful for debugging or advanced inspection of the chain.
pub fn get_fork_choice<T: BeaconChainTypes>(
req: Request<Body>,
beacon_chain: Arc<BeaconChain<T>>,
) -> ApiResult {
let json = beacon_chain.fork_choice.as_json().map_err(|e| {
ApiError::ServerError(format!("Unable to encode fork choice as JSON: {:?}", e))
})?;
ResponseBuilder::new(&req)?.body_no_ssz(&json)
}

View File

@@ -4,6 +4,7 @@ mod macros;
extern crate lazy_static;
extern crate network as client_network;
mod advanced;
mod beacon;
pub mod config;
mod consensus;

View File

@@ -1,6 +1,6 @@
use crate::{
beacon, consensus, error::ApiError, helpers, metrics, network, node, spec, validator, BoxFut,
NetworkChannel,
advanced, beacon, consensus, error::ApiError, helpers, metrics, network, node, spec, validator,
BoxFut, NetworkChannel,
};
use beacon_chain::{BeaconChain, BeaconChainTypes};
use client_network::Service as NetworkService;
@@ -147,6 +147,11 @@ pub fn route<T: BeaconChainTypes>(
into_boxfut(spec::get_eth2_config::<T>(req, eth2_config))
}
// Methods for advanced parameters
(&Method::GET, "/advanced/fork_choice") => {
into_boxfut(advanced::get_fork_choice::<T>(req, beacon_chain))
}
(&Method::GET, "/metrics") => into_boxfut(metrics::get_prometheus::<T>(
req,
beacon_chain,

View File

@@ -792,6 +792,24 @@ fn get_committees() {
assert_eq!(result, expected, "result should be as expected");
}
#[test]
fn get_fork_choice() {
let mut env = build_env();
let node = build_node(&mut env, testing_client_config());
let remote_node = node.remote_node().expect("should produce remote node");
// Ideally we would check that the returned fork choice is the same as the one in the
// `beacon_chain`, however that would involve exposing (making public) the core fork choice
// struct that is a bit messy.
//
// Given that serializing the fork choice is just vanilla serde, I think it's fair to assume it
// works.
env.runtime()
.block_on(remote_node.http.advanced().get_fork_choice())
.expect("should not error when getting fork choice");
}
fn compare_validator_response<T: EthSpec>(
state: &BeaconState<T>,
response: &ValidatorResponse,