Compare commits

...

4 commits

Author SHA1 Message Date
hinto.janai
8a3229b369
get_block 2024-10-11 21:07:32 -04:00
hinto.janai
b82ff278de
map tower::BoxError to anyhow::Error 2024-10-11 20:57:32 -04:00
hinto.janai
9459d59ce0
Merge branch 'main' into json 2024-10-11 20:14:48 -04:00
hinto-janai
f9b847b227
types: HardFork improvements (#309)
Some checks failed
Audit / audit (push) Has been cancelled
CI / fmt (push) Has been cancelled
CI / typo (push) Has been cancelled
CI / ci (macos-latest, stable, bash) (push) Has been cancelled
CI / ci (ubuntu-latest, stable, bash) (push) Has been cancelled
CI / ci (windows-latest, stable-x86_64-pc-windows-gnu, msys2 {0}) (push) Has been cancelled
Deny / audit (push) Has been cancelled
Doc / build (push) Has been cancelled
Doc / deploy (push) Has been cancelled
* apply diffs

* review fixes
2024-10-11 23:57:43 +01:00
4 changed files with 53 additions and 44 deletions

View file

@ -277,33 +277,36 @@ async fn get_block(
mut state: CupratedRpcHandler, mut state: CupratedRpcHandler,
request: GetBlockRequest, request: GetBlockRequest,
) -> Result<GetBlockResponse, Error> { ) -> Result<GetBlockResponse, Error> {
let block = if request.hash.is_empty() { let (block, block_header) = if request.hash.is_empty() {
helper::check_height(&mut state, request.height).await?; helper::check_height(&mut state, request.height).await?;
blockchain::block(&mut state.blockchain_read, request.height).await? let block = blockchain::block(&mut state.blockchain_read, request.height).await?;
let block_header =
helper::block_header(&mut state, request.height, request.fill_pow_hash).await?;
(block, block_header)
} else { } else {
let hash = helper::hex_to_hash(request.hash)?; let hash = helper::hex_to_hash(request.hash)?;
blockchain::block_by_hash(&mut state.blockchain_read, hash).await? let block = blockchain::block_by_hash(&mut state.blockchain_read, hash).await?;
let block_header =
helper::block_header_by_hash(&mut state, hash, request.fill_pow_hash).await?;
(block, block_header)
}; };
Ok(todo!()) let blob = hex::encode(block.serialize());
let miner_tx_hash = hex::encode(block.miner_transaction.hash());
let tx_hashes = block.transactions.iter().map(hex::encode).collect();
let json = {
let block = cuprate_types::json::block::Block::from(block);
serde_json::to_string_pretty(&block)?
};
// let block_header = (&block).into(); Ok(GetBlockResponse {
// let blob = hex::encode(block.block_blob); base: AccessResponseBase::ok(),
// let miner_tx_hash = hex::encode(block.block.miner_transaction.hash()); blob,
// let tx_hashes = block json,
// .txs miner_tx_hash,
// .into_iter() tx_hashes,
// .map(|tx| hex::encode(tx.tx_hash)) block_header,
// .collect(); })
// Ok(GetBlockResponse {
// base: AccessResponseBase::ok(),
// blob,
// json: todo!(), // TODO: make `JSON` type in `cuprate_rpc_types`
// miner_tx_hash,
// tx_hashes,
// block_header,
// })
} }
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2729-L2738> /// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2729-L2738>

View file

@ -2,7 +2,7 @@
use std::convert::Infallible; use std::convert::Infallible;
use anyhow::Error; use anyhow::{anyhow, Error};
use tower::ServiceExt; use tower::ServiceExt;
use cuprate_helper::cast::usize_to_u64; use cuprate_helper::cast::usize_to_u64;
@ -11,6 +11,8 @@ use cuprate_p2p_core::{
AddressBook, NetworkZone, AddressBook, NetworkZone,
}; };
// FIXME: use `anyhow::Error` over `tower::BoxError` in address book.
/// [`AddressBookRequest::PeerlistSize`] /// [`AddressBookRequest::PeerlistSize`]
pub(crate) async fn peerlist_size<Z: NetworkZone>( pub(crate) async fn peerlist_size<Z: NetworkZone>(
address_book: &mut impl AddressBook<Z>, address_book: &mut impl AddressBook<Z>,
@ -18,10 +20,10 @@ pub(crate) async fn peerlist_size<Z: NetworkZone>(
let AddressBookResponse::PeerlistSize { white, grey } = address_book let AddressBookResponse::PeerlistSize { white, grey } = address_book
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(AddressBookRequest::PeerlistSize) .call(AddressBookRequest::PeerlistSize)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -36,10 +38,10 @@ pub(crate) async fn connection_count<Z: NetworkZone>(
let AddressBookResponse::ConnectionCount { incoming, outgoing } = address_book let AddressBookResponse::ConnectionCount { incoming, outgoing } = address_book
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(AddressBookRequest::ConnectionCount) .call(AddressBookRequest::ConnectionCount)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -55,10 +57,10 @@ pub(crate) async fn set_ban<Z: NetworkZone>(
let AddressBookResponse::Ok = address_book let AddressBookResponse::Ok = address_book
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(AddressBookRequest::SetBan(peer)) .call(AddressBookRequest::SetBan(peer))
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -74,10 +76,10 @@ pub(crate) async fn get_ban<Z: NetworkZone>(
let AddressBookResponse::GetBan { unban_instant } = address_book let AddressBookResponse::GetBan { unban_instant } = address_book
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(AddressBookRequest::GetBan(peer)) .call(AddressBookRequest::GetBan(peer))
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -92,10 +94,10 @@ pub(crate) async fn get_bans<Z: NetworkZone>(
let AddressBookResponse::GetBans(bans) = address_book let AddressBookResponse::GetBans(bans) = address_book
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(AddressBookRequest::GetBans) .call(AddressBookRequest::GetBans)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };

View file

@ -2,7 +2,7 @@
use std::convert::Infallible; use std::convert::Infallible;
use anyhow::Error; use anyhow::{anyhow, Error};
use tower::{Service, ServiceExt}; use tower::{Service, ServiceExt};
use cuprate_consensus::context::{ use cuprate_consensus::context::{
@ -11,6 +11,8 @@ use cuprate_consensus::context::{
}; };
use cuprate_types::{FeeEstimate, HardFork, HardForkInfo}; use cuprate_types::{FeeEstimate, HardFork, HardForkInfo};
// FIXME: use `anyhow::Error` over `tower::BoxError` in blockchain context.
/// [`BlockChainContextRequest::Context`]. /// [`BlockChainContextRequest::Context`].
pub(crate) async fn context( pub(crate) async fn context(
service: &mut BlockChainContextService, service: &mut BlockChainContextService,
@ -18,10 +20,10 @@ pub(crate) async fn context(
let BlockChainContextResponse::Context(context) = service let BlockChainContextResponse::Context(context) = service
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(BlockChainContextRequest::Context) .call(BlockChainContextRequest::Context)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -37,10 +39,10 @@ pub(crate) async fn hard_fork_info(
let BlockChainContextResponse::HardForkInfo(hf_info) = service let BlockChainContextResponse::HardForkInfo(hf_info) = service
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(BlockChainContextRequest::HardForkInfo(hard_fork)) .call(BlockChainContextRequest::HardForkInfo(hard_fork))
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -56,10 +58,10 @@ pub(crate) async fn fee_estimate(
let BlockChainContextResponse::FeeEstimate(fee) = service let BlockChainContextResponse::FeeEstimate(fee) = service
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(BlockChainContextRequest::FeeEstimate { grace_blocks }) .call(BlockChainContextRequest::FeeEstimate { grace_blocks })
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };

View file

@ -2,7 +2,7 @@
use std::convert::Infallible; use std::convert::Infallible;
use anyhow::Error; use anyhow::{anyhow, Error};
use tower::{Service, ServiceExt}; use tower::{Service, ServiceExt};
use cuprate_helper::cast::usize_to_u64; use cuprate_helper::cast::usize_to_u64;
@ -14,15 +14,17 @@ use cuprate_txpool::{
TxEntry, TxEntry,
}; };
// FIXME: use `anyhow::Error` over `tower::BoxError` in txpool.
/// [`TxpoolReadRequest::Backlog`] /// [`TxpoolReadRequest::Backlog`]
pub(crate) async fn backlog(txpool_read: &mut TxpoolReadHandle) -> Result<Vec<TxEntry>, Error> { pub(crate) async fn backlog(txpool_read: &mut TxpoolReadHandle) -> Result<Vec<TxEntry>, Error> {
let TxpoolReadResponse::Backlog(tx_entries) = txpool_read let TxpoolReadResponse::Backlog(tx_entries) = txpool_read
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(TxpoolReadRequest::Backlog) .call(TxpoolReadRequest::Backlog)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };
@ -35,10 +37,10 @@ pub(crate) async fn size(txpool_read: &mut TxpoolReadHandle) -> Result<u64, Erro
let TxpoolReadResponse::Size(size) = txpool_read let TxpoolReadResponse::Size(size) = txpool_read
.ready() .ready()
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
.call(TxpoolReadRequest::Size) .call(TxpoolReadRequest::Size)
.await .await
.expect("TODO") .map_err(|e| anyhow!(e))?
else { else {
unreachable!(); unreachable!();
}; };