refactor: add count parameter to get_update and use 128 as the limit (#97)
* Make get_update take count. Limit count to 128 as specified in the spec * use u8 instead of u32 * run cargo fmt to fix formating * fix compilation in tests * moved constants module into the consensus package
This commit is contained in:
parent
b5d1dbc638
commit
2dbe057e3a
|
@ -13,6 +13,7 @@ use common::types::*;
|
||||||
use common::utils::*;
|
use common::utils::*;
|
||||||
use config::Config;
|
use config::Config;
|
||||||
|
|
||||||
|
use crate::constants::MAX_REQUEST_LIGHT_CLIENT_UPDATES;
|
||||||
use crate::errors::ConsensusError;
|
use crate::errors::ConsensusError;
|
||||||
|
|
||||||
use super::rpc::ConsensusRpc;
|
use super::rpc::ConsensusRpc;
|
||||||
|
@ -96,7 +97,10 @@ impl<R: ConsensusRpc> ConsensusClient<R> {
|
||||||
self.bootstrap().await?;
|
self.bootstrap().await?;
|
||||||
|
|
||||||
let current_period = calc_sync_period(self.store.finalized_header.slot);
|
let current_period = calc_sync_period(self.store.finalized_header.slot);
|
||||||
let updates = self.rpc.get_updates(current_period).await?;
|
let updates = self
|
||||||
|
.rpc
|
||||||
|
.get_updates(current_period, MAX_REQUEST_LIGHT_CLIENT_UPDATES)
|
||||||
|
.await?;
|
||||||
|
|
||||||
for mut update in updates {
|
for mut update in updates {
|
||||||
self.verify_update(&mut update)?;
|
self.verify_update(&mut update)?;
|
||||||
|
@ -126,7 +130,7 @@ impl<R: ConsensusRpc> ConsensusClient<R> {
|
||||||
if self.store.next_sync_committee.is_none() {
|
if self.store.next_sync_committee.is_none() {
|
||||||
debug!("checking for sync committee update");
|
debug!("checking for sync committee update");
|
||||||
let current_period = calc_sync_period(self.store.finalized_header.slot);
|
let current_period = calc_sync_period(self.store.finalized_header.slot);
|
||||||
let mut updates = self.rpc.get_updates(current_period).await?;
|
let mut updates = self.rpc.get_updates(current_period, 1).await?;
|
||||||
|
|
||||||
if updates.len() == 1 {
|
if updates.len() == 1 {
|
||||||
let mut update = updates.get_mut(0).unwrap();
|
let mut update = updates.get_mut(0).unwrap();
|
||||||
|
@ -558,6 +562,7 @@ fn is_current_committee_proof_valid(
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
use crate::constants::MAX_REQUEST_LIGHT_CLIENT_UPDATES;
|
||||||
use ssz_rs::Vector;
|
use ssz_rs::Vector;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -593,7 +598,11 @@ mod tests {
|
||||||
async fn test_verify_update() {
|
async fn test_verify_update() {
|
||||||
let client = get_client().await;
|
let client = get_client().await;
|
||||||
let period = calc_sync_period(client.store.finalized_header.slot);
|
let period = calc_sync_period(client.store.finalized_header.slot);
|
||||||
let updates = client.rpc.get_updates(period).await.unwrap();
|
let updates = client
|
||||||
|
.rpc
|
||||||
|
.get_updates(period, MAX_REQUEST_LIGHT_CLIENT_UPDATES)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut update = updates[0].clone();
|
let mut update = updates[0].clone();
|
||||||
client.verify_update(&mut update).unwrap();
|
client.verify_update(&mut update).unwrap();
|
||||||
|
@ -603,7 +612,11 @@ mod tests {
|
||||||
async fn test_verify_update_invalid_committee() {
|
async fn test_verify_update_invalid_committee() {
|
||||||
let client = get_client().await;
|
let client = get_client().await;
|
||||||
let period = calc_sync_period(client.store.finalized_header.slot);
|
let period = calc_sync_period(client.store.finalized_header.slot);
|
||||||
let updates = client.rpc.get_updates(period).await.unwrap();
|
let updates = client
|
||||||
|
.rpc
|
||||||
|
.get_updates(period, MAX_REQUEST_LIGHT_CLIENT_UPDATES)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut update = updates[0].clone();
|
let mut update = updates[0].clone();
|
||||||
update.next_sync_committee.pubkeys[0] = Vector::default();
|
update.next_sync_committee.pubkeys[0] = Vector::default();
|
||||||
|
@ -619,7 +632,11 @@ mod tests {
|
||||||
async fn test_verify_update_invalid_finality() {
|
async fn test_verify_update_invalid_finality() {
|
||||||
let client = get_client().await;
|
let client = get_client().await;
|
||||||
let period = calc_sync_period(client.store.finalized_header.slot);
|
let period = calc_sync_period(client.store.finalized_header.slot);
|
||||||
let updates = client.rpc.get_updates(period).await.unwrap();
|
let updates = client
|
||||||
|
.rpc
|
||||||
|
.get_updates(period, MAX_REQUEST_LIGHT_CLIENT_UPDATES)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut update = updates[0].clone();
|
let mut update = updates[0].clone();
|
||||||
update.finalized_header = Header::default();
|
update.finalized_header = Header::default();
|
||||||
|
@ -635,7 +652,11 @@ mod tests {
|
||||||
async fn test_verify_update_invalid_sig() {
|
async fn test_verify_update_invalid_sig() {
|
||||||
let client = get_client().await;
|
let client = get_client().await;
|
||||||
let period = calc_sync_period(client.store.finalized_header.slot);
|
let period = calc_sync_period(client.store.finalized_header.slot);
|
||||||
let updates = client.rpc.get_updates(period).await.unwrap();
|
let updates = client
|
||||||
|
.rpc
|
||||||
|
.get_updates(period, MAX_REQUEST_LIGHT_CLIENT_UPDATES)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let mut update = updates[0].clone();
|
let mut update = updates[0].clone();
|
||||||
update.sync_aggregate.sync_committee_signature = Vector::default();
|
update.sync_aggregate.sync_committee_signature = Vector::default();
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Consensus constants
|
||||||
|
|
||||||
|
// https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/light-client/p2p-interface.md#configuration
|
||||||
|
pub const MAX_REQUEST_LIGHT_CLIENT_UPDATES: u8 = 128;
|
|
@ -5,4 +5,5 @@ pub mod types;
|
||||||
mod consensus;
|
mod consensus;
|
||||||
pub use crate::consensus::*;
|
pub use crate::consensus::*;
|
||||||
|
|
||||||
|
mod constants;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
|
@ -23,7 +23,7 @@ impl ConsensusRpc for MockRpc {
|
||||||
Ok(serde_json::from_str(&bootstrap)?)
|
Ok(serde_json::from_str(&bootstrap)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_updates(&self, _period: u64) -> Result<Vec<Update>> {
|
async fn get_updates(&self, _period: u64, _count: u8) -> Result<Vec<Update>> {
|
||||||
let updates = read_to_string(self.testdata.join("updates.json"))?;
|
let updates = read_to_string(self.testdata.join("updates.json"))?;
|
||||||
Ok(serde_json::from_str(&updates)?)
|
Ok(serde_json::from_str(&updates)?)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::types::{BeaconBlock, Bootstrap, FinalityUpdate, OptimisticUpdate, Upd
|
||||||
pub trait ConsensusRpc {
|
pub trait ConsensusRpc {
|
||||||
fn new(path: &str) -> Self;
|
fn new(path: &str) -> Self;
|
||||||
async fn get_bootstrap(&self, block_root: &Vec<u8>) -> Result<Bootstrap>;
|
async fn get_bootstrap(&self, block_root: &Vec<u8>) -> Result<Bootstrap>;
|
||||||
async fn get_updates(&self, period: u64) -> Result<Vec<Update>>;
|
async fn get_updates(&self, period: u64, count: u8) -> Result<Vec<Update>>;
|
||||||
async fn get_finality_update(&self) -> Result<FinalityUpdate>;
|
async fn get_finality_update(&self) -> Result<FinalityUpdate>;
|
||||||
async fn get_optimistic_update(&self) -> Result<OptimisticUpdate>;
|
async fn get_optimistic_update(&self) -> Result<OptimisticUpdate>;
|
||||||
async fn get_block(&self, slot: u64) -> Result<BeaconBlock>;
|
async fn get_block(&self, slot: u64) -> Result<BeaconBlock>;
|
||||||
|
|
|
@ -3,8 +3,10 @@ use common::errors::RpcError;
|
||||||
use eyre::Result;
|
use eyre::Result;
|
||||||
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
|
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
|
||||||
use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware};
|
use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware};
|
||||||
|
use std::cmp;
|
||||||
|
|
||||||
use super::ConsensusRpc;
|
use super::ConsensusRpc;
|
||||||
|
use crate::constants::MAX_REQUEST_LIGHT_CLIENT_UPDATES;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
|
|
||||||
pub struct NimbusRpc {
|
pub struct NimbusRpc {
|
||||||
|
@ -49,10 +51,11 @@ impl ConsensusRpc for NimbusRpc {
|
||||||
Ok(res.data)
|
Ok(res.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn get_updates(&self, period: u64) -> Result<Vec<Update>> {
|
async fn get_updates(&self, period: u64, count: u8) -> Result<Vec<Update>> {
|
||||||
|
let count = cmp::min(count, MAX_REQUEST_LIGHT_CLIENT_UPDATES);
|
||||||
let req = format!(
|
let req = format!(
|
||||||
"{}/eth/v1/beacon/light_client/updates?start_period={}&count=1000",
|
"{}/eth/v1/beacon/light_client/updates?start_period={}&count={}",
|
||||||
self.rpc, period
|
self.rpc, period, count
|
||||||
);
|
);
|
||||||
|
|
||||||
let res = self
|
let res = self
|
||||||
|
|
Loading…
Reference in New Issue