add_aux_pow

This commit is contained in:
hinto.janai 2024-10-15 16:45:54 -04:00
parent 5926f24d22
commit 7148ba1668
No known key found for this signature in database
GPG key ID: D47CE05FA175A499
6 changed files with 94 additions and 15 deletions

View file

@ -3,14 +3,13 @@
use std::task::{Context, Poll};
use anyhow::Error;
use cuprate_consensus::BlockChainContextService;
use cuprate_pruning::PruningSeed;
use cuprate_types::HardFork;
use futures::future::BoxFuture;
use monero_serai::block::Block;
use tower::Service;
use cuprate_blockchain::service::{BlockchainReadHandle, BlockchainWriteHandle};
use cuprate_consensus::BlockChainContextService;
use cuprate_pruning::PruningSeed;
use cuprate_rpc_interface::RpcHandler;
use cuprate_rpc_types::{
bin::{BinRequest, BinResponse},
@ -18,6 +17,7 @@ use cuprate_rpc_types::{
other::{OtherRequest, OtherResponse},
};
use cuprate_txpool::service::{TxpoolReadHandle, TxpoolWriteHandle};
use cuprate_types::{AddAuxPow, AuxPow, HardFork};
use crate::rpc::{bin, json, other};
@ -69,6 +69,12 @@ pub enum BlockchainManagerRequest {
/// The seed hash for the proof-of-work.
seed_hash: [u8; 32],
},
/// TODO
AddAuxPow {
blocktemplate_blob: Vec<u8>,
aux_pow: Vec<AuxPow>,
},
}
/// TODO: use real type when public.
@ -104,6 +110,9 @@ pub enum BlockchainManagerResponse {
/// Response to [`BlockchainManagerRequest::CalculatePow`]
CalculatePow([u8; 32]),
/// Response to [`BlockchainManagerRequest::AddAuxPow`]
AddAuxPow(AddAuxPow),
}
/// TODO: use real type when public.

View file

@ -40,7 +40,10 @@ use cuprate_rpc_types::{
SetBansRequest, SetBansResponse, SubmitBlockRequest, SubmitBlockResponse, SyncInfoRequest,
SyncInfoResponse,
},
misc::{BlockHeader, ChainInfo, GetBan, HardforkEntry, HistogramEntry, Status, TxBacklogEntry},
misc::{
AuxPow, BlockHeader, ChainInfo, GetBan, HardforkEntry, HistogramEntry, Status,
TxBacklogEntry,
},
CORE_RPC_VERSION,
};
use cuprate_types::HardFork;
@ -761,7 +764,7 @@ async fn flush_cache(
state: CupratedRpcHandler,
request: FlushCacheRequest,
) -> Result<FlushCacheResponse, Error> {
todo!();
// TODO: cuprated doesn't need this call; decide behavior.
Ok(FlushCacheResponse {
base: ResponseBase::OK,
@ -770,16 +773,43 @@ async fn flush_cache(
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2072-L2207>
async fn add_aux_pow(
state: CupratedRpcHandler,
mut state: CupratedRpcHandler,
request: AddAuxPowRequest,
) -> Result<AddAuxPowResponse, Error> {
let blocktemplate_blob = hex::decode(request.blocktemplate_blob)?;
let aux_pow = request
.aux_pow
.into_iter()
.map(|aux| {
let id = helper::hex_to_hash(aux.id)?;
let hash = helper::hex_to_hash(aux.hash)?;
Ok(cuprate_types::AuxPow { id, hash })
})
.collect::<Result<Vec<_>, Error>>()?;
let resp =
blockchain_manager::add_aux_pow(&mut state.blockchain_manager, blocktemplate_blob, aux_pow)
.await?;
let blocktemplate_blob = hex::encode(resp.blocktemplate_blob);
let blockhashing_blob = hex::encode(resp.blockhashing_blob);
let merkle_root = hex::encode(resp.merkle_root);
let aux_pow = resp
.aux_pow
.into_iter()
.map(|aux| AuxPow {
id: hex::encode(aux.id),
hash: hex::encode(aux.hash),
})
.collect::<Vec<AuxPow>>();
Ok(AddAuxPowResponse {
base: ResponseBase::OK,
blocktemplate_blob: todo!(),
blockhashing_blob: todo!(),
merkle_root: todo!(),
merkle_tree_depth: todo!(),
aux_pow: todo!(),
blocktemplate_blob,
blockhashing_blob,
merkle_root,
merkle_tree_depth: resp.merkle_tree_depth,
aux_pow,
})
}

View file

@ -1,7 +1,7 @@
//! Functions for [`BlockchainManagerRequest`] & [`BlockchainManagerResponse`].
use anyhow::Error;
use cuprate_types::HardFork;
use cuprate_types::{AddAuxPow, AuxPow, HardFork};
use monero_serai::block::Block;
use tower::{Service, ServiceExt};
@ -168,3 +168,24 @@ pub(crate) async fn calculate_pow(
Ok(hash)
}
/// [`BlockchainManagerRequest::AddAuxPow`]
pub(crate) async fn add_aux_pow(
blockchain_manager: &mut BlockchainManagerHandle,
blocktemplate_blob: Vec<u8>,
aux_pow: Vec<AuxPow>,
) -> Result<AddAuxPow, Error> {
let BlockchainManagerResponse::AddAuxPow(response) = blockchain_manager
.ready()
.await?
.call(BlockchainManagerRequest::AddAuxPow {
blocktemplate_blob,
aux_pow,
})
.await?
else {
unreachable!();
};
Ok(response)
}

View file

@ -289,6 +289,7 @@ pub enum BlockchainResponse {
/// - Value = hardfork version
HardForks(BTreeMap<usize, HardFork>),
/// TODO
AltChains(Vec<ChainInfo>),
//------------------------------------------------------ Writes

View file

@ -20,9 +20,10 @@ pub use transaction_verification_data::{
CachedVerificationState, TransactionVerificationData, TxVersion,
};
pub use types::{
AltBlockInformation, Chain, ChainId, ChainInfo, CoinbaseTxSum, ExtendedBlockHeader,
FeeEstimate, HardForkInfo, MinerData, MinerDataTxBacklogEntry, OutputHistogramEntry,
OutputHistogramInput, OutputOnChain, VerifiedBlockInformation, VerifiedTransactionInformation,
AddAuxPow, AltBlockInformation, AuxPow, Chain, ChainId, ChainInfo, CoinbaseTxSum,
ExtendedBlockHeader, FeeEstimate, HardForkInfo, MinerData, MinerDataTxBacklogEntry,
OutputHistogramEntry, OutputHistogramInput, OutputOnChain, VerifiedBlockInformation,
VerifiedTransactionInformation,
};
//---------------------------------------------------------------------------------------------------- Feature-gated

View file

@ -242,6 +242,23 @@ pub struct ChainInfo {
pub main_chain_parent_block: [u8; 32],
}
/// Used in RPC's `add_aux_pow`.
#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AuxPow {
pub id: [u8; 32],
pub hash: [u8; 32],
}
/// Used in RPC's `add_aux_pow`.
#[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AddAuxPow {
pub blocktemplate_blob: Vec<u8>,
pub blockhashing_blob: Vec<u8>,
pub merkle_root: [u8; 32],
pub merkle_tree_depth: u64,
pub aux_pow: Vec<AuxPow>,
}
//---------------------------------------------------------------------------------------------------- Tests
#[cfg(test)]
mod test {