mirror of
https://github.com/Cuprate/cuprate.git
synced 2024-12-23 20:19:31 +00:00
add_aux_pow
This commit is contained in:
parent
5926f24d22
commit
7148ba1668
6 changed files with 94 additions and 15 deletions
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -289,6 +289,7 @@ pub enum BlockchainResponse {
|
|||
/// - Value = hardfork version
|
||||
HardForks(BTreeMap<usize, HardFork>),
|
||||
|
||||
/// TODO
|
||||
AltChains(Vec<ChainInfo>),
|
||||
|
||||
//------------------------------------------------------ Writes
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue