setup api bindings for reaching out to light servers
This commit is contained in:
commit
2dd11e6a1c
|
@ -0,0 +1 @@
|
||||||
|
/target
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "lightclient"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
reqwest = { version = "0.11", features = ["json"] }
|
||||||
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
eyre = "0.6.8"
|
||||||
|
serde = { version = "1.0.143", features = ["derive"] }
|
|
@ -0,0 +1,125 @@
|
||||||
|
use eyre::Result;
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<()> {
|
||||||
|
|
||||||
|
let client = LightClient::new("http://testing.prater.beacon-api.nimbus.team");
|
||||||
|
let bootstrap = client.get_bootstrap("0x29d7ba1ef23b01a8b9024ee0cd73d0b7181edc0eb16e4645300092838c07783f").await?;
|
||||||
|
|
||||||
|
let current_slot = bootstrap.header.slot;
|
||||||
|
let current_sync_period = LightClient::calc_sync_period(current_slot.parse()?);
|
||||||
|
let next_sync_period = current_sync_period + 1;
|
||||||
|
|
||||||
|
println!("{}", next_sync_period);
|
||||||
|
|
||||||
|
let updates = client.get_updates(next_sync_period).await?;
|
||||||
|
let attested_headers = updates.iter().map(|update| &update.attested_header).collect::<Vec<&Header>>();
|
||||||
|
let finalized_headers = updates.iter().map(|update| &update.finalized_header).collect::<Vec<&Header>>();
|
||||||
|
|
||||||
|
println!("{:?}", attested_headers);
|
||||||
|
println!("{:?}", finalized_headers);
|
||||||
|
|
||||||
|
let finality_update = client.get_finality_update().await?;
|
||||||
|
|
||||||
|
println!("{:?}", finality_update.attested_header);
|
||||||
|
println!("{:?}", finality_update.finalized_header);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LightClient {
|
||||||
|
nimbus_rpc: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LightClient {
|
||||||
|
fn new(nimbus_rpc: &str) -> LightClient {
|
||||||
|
LightClient { nimbus_rpc: nimbus_rpc.to_string() }
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_bootstrap(&self, block_root: &str) -> Result<Bootstrap> {
|
||||||
|
let req = format!("{}/eth/v0/beacon/light_client/bootstrap/{}", self.nimbus_rpc, block_root);
|
||||||
|
let res = reqwest::get(req).await?.json::<BootstrapResponse>().await?;
|
||||||
|
Ok(res.data.v)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_updates(&self, period: u64) -> Result<Vec<Update>> {
|
||||||
|
let req = format!("{}/eth/v0/beacon/light_client/updates?start_period={}&count=1000", self.nimbus_rpc, period);
|
||||||
|
let res = reqwest::get(req).await?.json::<UpdateResponse>().await?;
|
||||||
|
Ok(res.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_finality_update(&self) -> Result<FinalityUpdate> {
|
||||||
|
let req = format!("{}/eth/v0/beacon/light_client/finality_update", self.nimbus_rpc);
|
||||||
|
let res = reqwest::get(req).await?.json::<FinalityUpdateResponse>().await?;
|
||||||
|
Ok(res.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calc_sync_period(slot: u64) -> u64 {
|
||||||
|
let epoch = slot / 32;
|
||||||
|
epoch / 256
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct BootstrapResponse {
|
||||||
|
data: BootstrapData,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct BootstrapData {
|
||||||
|
v: Bootstrap,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct Bootstrap {
|
||||||
|
header: Header,
|
||||||
|
current_sync_committee: SyncCommittee,
|
||||||
|
current_sync_committee_branch: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
|
struct SyncCommittee {
|
||||||
|
pubkeys: Vec<String>,
|
||||||
|
aggregate_pubkey: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
|
struct Header {
|
||||||
|
slot: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct UpdateResponse {
|
||||||
|
data: Vec<Update>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
|
struct Update {
|
||||||
|
attested_header: Header,
|
||||||
|
next_sync_committee: SyncCommittee,
|
||||||
|
next_sync_committee_branch: Vec<String>,
|
||||||
|
finalized_header: Header,
|
||||||
|
finality_branch: Vec<String>,
|
||||||
|
sync_aggregate: SyncAggregate,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
|
struct SyncAggregate {
|
||||||
|
sync_committee_bits: String,
|
||||||
|
sync_committee_signature: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct FinalityUpdateResponse {
|
||||||
|
data: FinalityUpdate,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Debug)]
|
||||||
|
struct FinalityUpdate {
|
||||||
|
attested_header: Header,
|
||||||
|
finalized_header: Header,
|
||||||
|
finality_branch: Vec<String>,
|
||||||
|
sync_aggregate: SyncAggregate,
|
||||||
|
signature_slot: String,
|
||||||
|
}
|
Loading…
Reference in New Issue