helios/consensus/src/rpc/nimbus_rpc.rs

124 lines
3.1 KiB
Rust
Raw Normal View History

use async_trait::async_trait;
use common::errors::RpcError;
2022-08-21 15:21:50 +00:00
use eyre::Result;
use super::Rpc;
use crate::types::*;
2022-08-21 15:21:50 +00:00
pub struct NimbusRpc {
2022-08-21 15:21:50 +00:00
rpc: String,
}
#[async_trait]
impl Rpc for NimbusRpc {
fn new(rpc: &str) -> Self {
NimbusRpc {
2022-08-21 16:59:47 +00:00
rpc: rpc.to_string(),
}
2022-08-21 15:21:50 +00:00
}
async fn get_bootstrap(&self, block_root: &Vec<u8>) -> Result<Bootstrap> {
2022-08-27 00:05:12 +00:00
let root_hex = hex::encode(block_root);
2022-08-21 15:21:50 +00:00
let req = format!(
2022-08-27 00:05:12 +00:00
"{}/eth/v0/beacon/light_client/bootstrap/0x{}",
self.rpc, root_hex
2022-08-21 15:21:50 +00:00
);
let res = reqwest::get(req)
.await
.map_err(|e| RpcError::new(e.to_string()))?
.json::<BootstrapResponse>()
.await
.map_err(|e| RpcError::new(e.to_string()))?;
2022-08-21 15:21:50 +00:00
Ok(res.data.v)
}
async fn get_updates(&self, period: u64) -> Result<Vec<Update>> {
2022-08-21 15:21:50 +00:00
let req = format!(
"{}/eth/v0/beacon/light_client/updates?start_period={}&count=1000",
self.rpc, period
);
let res = reqwest::get(req)
.await
.map_err(|e| RpcError::new(e.to_string()))?
.json::<UpdateResponse>()
.await
.map_err(|e| RpcError::new(e.to_string()))?;
2022-08-21 15:21:50 +00:00
Ok(res.data)
}
async fn get_finality_update(&self) -> Result<FinalityUpdate> {
2022-08-21 15:21:50 +00:00
let req = format!("{}/eth/v0/beacon/light_client/finality_update", self.rpc);
let res = reqwest::get(req)
.await
.map_err(|e| RpcError::new(e.to_string()))?
2022-08-21 15:21:50 +00:00
.json::<FinalityUpdateResponse>()
.await
.map_err(|e| RpcError::new(e.to_string()))?;
2022-08-21 15:21:50 +00:00
Ok(res.data)
}
async fn get_optimistic_update(&self) -> Result<OptimisticUpdate> {
2022-08-31 00:31:58 +00:00
let req = format!("{}/eth/v0/beacon/light_client/optimistic_update", self.rpc);
let res = reqwest::get(req)
.await
.map_err(|e| RpcError::new(e.to_string()))?
2022-08-31 00:31:58 +00:00
.json::<OptimisticUpdateResponse>()
.await
.map_err(|e| RpcError::new(e.to_string()))?;
2022-08-31 00:31:58 +00:00
Ok(res.data)
}
async fn get_block(&self, slot: u64) -> Result<BeaconBlock> {
2022-08-21 15:21:50 +00:00
let req = format!("{}/eth/v2/beacon/blocks/{}", self.rpc, slot);
let res = reqwest::get(req)
.await
.map_err(|e| RpcError::new(e.to_string()))?
2022-08-21 15:21:50 +00:00
.json::<BeaconBlockResponse>()
.await
.map_err(|e| RpcError::new(e.to_string()))?;
2022-08-21 15:21:50 +00:00
Ok(res.data.message)
}
}
#[derive(serde::Deserialize, Debug)]
struct BeaconBlockResponse {
data: BeaconBlockData,
}
#[derive(serde::Deserialize, Debug)]
struct BeaconBlockData {
message: BeaconBlock,
}
#[derive(serde::Deserialize, Debug)]
struct UpdateResponse {
data: Vec<Update>,
}
#[derive(serde::Deserialize, Debug)]
struct FinalityUpdateResponse {
data: FinalityUpdate,
}
2022-08-31 00:31:58 +00:00
#[derive(serde::Deserialize, Debug)]
struct OptimisticUpdateResponse {
data: OptimisticUpdate,
}
2022-08-21 15:21:50 +00:00
#[derive(serde::Deserialize, Debug)]
struct BootstrapResponse {
data: BootstrapData,
}
#[derive(serde::Deserialize, Debug)]
struct BootstrapData {
v: Bootstrap,
}