Address some review comments
This commit is contained in:
parent
b912e26b79
commit
5a34f86e77
@ -10,7 +10,7 @@ use url::Host;
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Error {
|
enum Error {
|
||||||
UrlCannotBeBase,
|
InvalidUrl,
|
||||||
HttpError(HttpError),
|
HttpError(HttpError),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ impl Bootstrapper {
|
|||||||
|
|
||||||
/// Build a multiaddr using the HTTP server URL that is not guaranteed to be correct.
|
/// Build a multiaddr using the HTTP server URL that is not guaranteed to be correct.
|
||||||
///
|
///
|
||||||
/// The address is created by querying the HTTP server for it's listening libp2p addresses.
|
/// The address is created by querying the HTTP server for its listening libp2p addresses.
|
||||||
/// Then, we find the first TCP port in those addresses and combine the port with the URL of
|
/// Then, we find the first TCP port in those addresses and combine the port with the URL of
|
||||||
/// the server.
|
/// the server.
|
||||||
///
|
///
|
||||||
@ -124,7 +124,7 @@ fn get_slots_per_epoch(mut url: Url) -> Result<Slot, Error> {
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("spec").push("slots_per_epoch");
|
url.push("spec").push("slots_per_epoch");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
reqwest::get(url)?
|
reqwest::get(url)?
|
||||||
.error_for_status()?
|
.error_for_status()?
|
||||||
@ -137,7 +137,7 @@ fn get_finalized_slot(mut url: Url, slots_per_epoch: u64) -> Result<Slot, Error>
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("beacon").push("latest_finalized_checkpoint");
|
url.push("beacon").push("latest_finalized_checkpoint");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
let checkpoint: Checkpoint = reqwest::get(url)?.error_for_status()?.json()?;
|
let checkpoint: Checkpoint = reqwest::get(url)?.error_for_status()?.json()?;
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ fn get_state<T: EthSpec>(mut url: Url, slot: Slot) -> Result<BeaconState<T>, Err
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("beacon").push("state");
|
url.push("beacon").push("state");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
url.query_pairs_mut()
|
url.query_pairs_mut()
|
||||||
.append_pair("slot", &format!("{}", slot.as_u64()));
|
.append_pair("slot", &format!("{}", slot.as_u64()));
|
||||||
@ -165,7 +165,7 @@ fn get_block<T: EthSpec>(mut url: Url, slot: Slot) -> Result<BeaconBlock<T>, Err
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("beacon").push("block");
|
url.push("beacon").push("block");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
url.query_pairs_mut()
|
url.query_pairs_mut()
|
||||||
.append_pair("slot", &format!("{}", slot.as_u64()));
|
.append_pair("slot", &format!("{}", slot.as_u64()));
|
||||||
@ -181,7 +181,7 @@ fn get_enr(mut url: Url) -> Result<Enr, Error> {
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("node").push("network").push("enr");
|
url.push("node").push("network").push("enr");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
reqwest::get(url)?
|
reqwest::get(url)?
|
||||||
.error_for_status()?
|
.error_for_status()?
|
||||||
@ -194,7 +194,7 @@ fn get_listen_addresses(mut url: Url) -> Result<Vec<Multiaddr>, Error> {
|
|||||||
.map(|mut url| {
|
.map(|mut url| {
|
||||||
url.push("node").push("network").push("listen_addresses");
|
url.push("node").push("network").push("listen_addresses");
|
||||||
})
|
})
|
||||||
.map_err(|_| Error::UrlCannotBeBase)?;
|
.map_err(|_| Error::InvalidUrl)?;
|
||||||
|
|
||||||
reqwest::get(url)?
|
reqwest::get(url)?
|
||||||
.error_for_status()?
|
.error_for_status()?
|
||||||
|
@ -54,14 +54,9 @@ pub fn get_block<T: BeaconChainTypes + 'static>(req: Request<Body>) -> ApiResult
|
|||||||
("slot", value) => {
|
("slot", value) => {
|
||||||
let target = parse_slot(&value)?;
|
let target = parse_slot(&value)?;
|
||||||
|
|
||||||
beacon_chain
|
block_root_at_slot(&beacon_chain, target).ok_or_else(|| {
|
||||||
.rev_iter_block_roots()
|
ApiError::NotFound(format!("Unable to find BeaconBlock for slot {}", target))
|
||||||
.take_while(|(_root, slot)| *slot >= target)
|
})?
|
||||||
.find(|(_root, slot)| *slot == target)
|
|
||||||
.map(|(root, _slot)| root)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
ApiError::NotFound(format!("Unable to find BeaconBlock for slot {}", target))
|
|
||||||
})?
|
|
||||||
}
|
}
|
||||||
("root", value) => parse_root(&value)?,
|
("root", value) => parse_root(&value)?,
|
||||||
_ => return Err(ApiError::ServerError("Unexpected query parameter".into())),
|
_ => return Err(ApiError::ServerError("Unexpected query parameter".into())),
|
||||||
@ -99,14 +94,9 @@ pub fn get_block_root<T: BeaconChainTypes + 'static>(req: Request<Body>) -> ApiR
|
|||||||
let slot_string = UrlQuery::from_request(&req)?.only_one("slot")?;
|
let slot_string = UrlQuery::from_request(&req)?.only_one("slot")?;
|
||||||
let target = parse_slot(&slot_string)?;
|
let target = parse_slot(&slot_string)?;
|
||||||
|
|
||||||
let root = beacon_chain
|
let root = block_root_at_slot(&beacon_chain, target).ok_or_else(|| {
|
||||||
.rev_iter_block_roots()
|
ApiError::NotFound(format!("Unable to find BeaconBlock for slot {}", target))
|
||||||
.take_while(|(_root, slot)| *slot >= target)
|
})?;
|
||||||
.find(|(_root, slot)| *slot == target)
|
|
||||||
.map(|(root, _slot)| root)
|
|
||||||
.ok_or_else(|| {
|
|
||||||
ApiError::NotFound(format!("Unable to find BeaconBlock for slot {}", target))
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let json: String = serde_json::to_string(&root)
|
let json: String = serde_json::to_string(&root)
|
||||||
.map_err(|e| ApiError::ServerError(format!("Unable to serialize root: {:?}", e)))?;
|
.map_err(|e| ApiError::ServerError(format!("Unable to serialize root: {:?}", e)))?;
|
||||||
|
@ -31,6 +31,21 @@ pub fn parse_root(string: &str) -> Result<Hash256, ApiError> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the root of the `BeaconBlock` in the canonical chain of `beacon_chain` at the given
|
||||||
|
/// `slot`, if possible.
|
||||||
|
///
|
||||||
|
/// May return a root for a previous slot, in the case of skip slots.
|
||||||
|
pub fn block_root_at_slot<T: BeaconChainTypes>(
|
||||||
|
beacon_chain: &BeaconChain<T>,
|
||||||
|
target: Slot,
|
||||||
|
) -> Option<Hash256> {
|
||||||
|
beacon_chain
|
||||||
|
.rev_iter_block_roots()
|
||||||
|
.take_while(|(_root, slot)| *slot >= target)
|
||||||
|
.find(|(_root, slot)| *slot == target)
|
||||||
|
.map(|(root, _slot)| root)
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns a `BeaconState` and it's root in the canonical chain of `beacon_chain` at the given
|
/// Returns a `BeaconState` and it's root in the canonical chain of `beacon_chain` at the given
|
||||||
/// `slot`, if possible.
|
/// `slot`, if possible.
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user