sync_info

This commit is contained in:
hinto.janai 2024-10-16 16:46:13 -04:00
parent e2f25bd52d
commit 4b1d7bc897
No known key found for this signature in database
GPG key ID: D47CE05FA175A499
8 changed files with 142 additions and 12 deletions

View file

@ -88,6 +88,11 @@ pub enum BlockchainManagerRequest {
/// TODO
wallet_address: String,
},
/// TODO
///
/// <https://github.com/monero-project/monero/blob/master/src/cryptonote_protocol/block_queue.cpp#L178>
Overview { height: usize },
}
/// TODO: use real type when public.
@ -134,6 +139,9 @@ pub enum BlockchainManagerResponse {
/// TODO
height: usize,
},
/// Response to [`BlockchainManagerRequest::Overview`]
Overview(String),
}
/// TODO: use real type when public.

View file

@ -42,7 +42,7 @@ use cuprate_rpc_types::{
},
misc::{
AuxPow, BlockHeader, ChainInfo, GetBan, HardforkEntry, HistogramEntry, Status,
TxBacklogEntry,
SyncInfoPeer, TxBacklogEntry,
},
CORE_RPC_VERSION,
};
@ -758,17 +758,39 @@ async fn relay_tx(
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L3306-L3330>
async fn sync_info(
state: CupratedRpcHandler,
mut state: CupratedRpcHandler,
request: SyncInfoRequest,
) -> Result<SyncInfoResponse, Error> {
let height = usize_to_u64(
blockchain_context::context(&mut state.blockchain_context)
.await?
.unchecked_blockchain_context()
.chain_height,
);
let target_height = blockchain_manager::target_height(&mut state.blockchain_manager).await?;
let peers = address_book::connection_info::<ClearNet>(&mut DummyAddressBook)
.await?
.into_iter()
.map(|info| SyncInfoPeer { info })
.collect();
let next_needed_pruning_seed =
address_book::next_needed_pruning_seed::<ClearNet>(&mut DummyAddressBook)
.await?
.compress();
let overview = blockchain_manager::overview(&mut state.blockchain_manager, height).await?;
let spans = address_book::spans::<ClearNet>(&mut DummyAddressBook).await?;
Ok(SyncInfoResponse {
base: AccessResponseBase::OK,
height: todo!(),
next_needed_pruning_seed: todo!(),
overview: todo!(),
peers: todo!(),
spans: todo!(),
target_height: todo!(),
height,
next_needed_pruning_seed,
overview,
peers,
spans,
target_height,
})
}

View file

@ -3,7 +3,8 @@
use std::convert::Infallible;
use anyhow::{anyhow, Error};
use cuprate_rpc_types::misc::ConnectionInfo;
use cuprate_pruning::PruningSeed;
use cuprate_rpc_types::misc::{ConnectionInfo, Span};
use tower::ServiceExt;
use cuprate_helper::cast::usize_to_u64;
@ -156,3 +157,53 @@ pub(crate) async fn get_bans<Z: NetworkZone>(
Ok(bans)
}
/// [`AddressBookRequest::Spans`]
pub(crate) async fn spans<Z: NetworkZone>(
address_book: &mut impl AddressBook<Z>,
) -> Result<Vec<Span>, Error> {
let AddressBookResponse::Spans(vec) = address_book
.ready()
.await
.map_err(|e| anyhow!(e))?
.call(AddressBookRequest::Spans)
.await
.map_err(|e| anyhow!(e))?
else {
unreachable!();
};
// FIXME: impl this map somewhere instead of inline.
let vec = vec
.into_iter()
.map(|span| Span {
connection_id: span.connection_id,
nblocks: span.nblocks,
rate: span.rate,
remote_address: span.remote_address,
size: span.size,
speed: span.speed,
start_block_height: span.start_block_height,
})
.collect();
Ok(vec)
}
/// [`AddressBookRequest::NextNeededPruningSeed`]
pub(crate) async fn next_needed_pruning_seed<Z: NetworkZone>(
address_book: &mut impl AddressBook<Z>,
) -> Result<PruningSeed, Error> {
let AddressBookResponse::NextNeededPruningSeed(seed) = address_book
.ready()
.await
.map_err(|e| anyhow!(e))?
.call(AddressBookRequest::NextNeededPruningSeed)
.await
.map_err(|e| anyhow!(e))?
else {
unreachable!();
};
Ok(seed)
}

View file

@ -214,3 +214,22 @@ pub(crate) async fn generate_blocks(
Ok((blocks, usize_to_u64(height)))
}
/// [`BlockchainManagerRequest::Overview`]
pub(crate) async fn overview(
blockchain_manager: &mut BlockchainManagerHandle,
height: u64,
) -> Result<String, Error> {
let BlockchainManagerResponse::Overview(overview) = blockchain_manager
.ready()
.await?
.call(BlockchainManagerRequest::Overview {
height: u64_to_usize(height),
})
.await?
else {
unreachable!();
};
Ok(overview)
}

View file

@ -424,7 +424,9 @@ impl<Z: BorshNetworkZone> Service<AddressBookRequest<Z>> for AddressBook<Z> {
| AddressBookRequest::ConnectionCount
| AddressBookRequest::SetBan(_)
| AddressBookRequest::GetBans
| AddressBookRequest::ConnectionInfo => {
| AddressBookRequest::ConnectionInfo
| AddressBookRequest::NextNeededPruningSeed
| AddressBookRequest::Spans => {
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
}
};

View file

@ -112,7 +112,9 @@ impl<N: NetworkZone> Service<AddressBookRequest<N>> for DummyAddressBook {
| AddressBookRequest::ConnectionCount
| AddressBookRequest::SetBan(_)
| AddressBookRequest::GetBans
| AddressBookRequest::ConnectionInfo => {
| AddressBookRequest::ConnectionInfo
| AddressBookRequest::NextNeededPruningSeed
| AddressBookRequest::Spans => {
todo!("finish https://github.com/Cuprate/cuprate/pull/297")
}
}))

View file

@ -6,7 +6,7 @@ use cuprate_wire::{CoreSyncData, PeerListEntryBase};
use crate::{
client::InternalPeerID,
handles::ConnectionHandle,
types::{BanState, ConnectionInfo, SetBan},
types::{BanState, ConnectionInfo, SetBan, Span},
NetZoneAddress, NetworkAddressIncorrectZone, NetworkZone,
};
@ -132,6 +132,12 @@ pub enum AddressBookRequest<Z: NetworkZone> {
/// Get the state of all bans.
GetBans,
/// TODO
Spans,
/// TODO
NextNeededPruningSeed,
}
/// A response from the address book service.
@ -169,4 +175,10 @@ pub enum AddressBookResponse<Z: NetworkZone> {
/// Response to [`AddressBookRequest::GetBans`].
GetBans(Vec<BanState<Z::Addr>>),
/// Response to [`AddressBookRequest::Spans`].
Spans(Vec<Span>),
/// Response to [`AddressBookRequest::NextNeededPruningSeed`].
NextNeededPruningSeed(PruningSeed),
}

View file

@ -52,3 +52,17 @@ pub struct ConnectionInfo<A: NetZoneAddress> {
pub state: String,
pub support_flags: u32,
}
/// Used in RPC's `sync_info`.
///
/// Data within [`crate::services::AddressBookResponse::Spans`].
#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Span {
pub connection_id: String,
pub nblocks: u64,
pub rate: u32,
pub remote_address: String,
pub size: u64,
pub speed: u32,
pub start_block_height: u64,
}