mirror of
https://github.com/Cuprate/cuprate.git
synced 2025-01-23 03:04:49 +00:00
calc_pow
This commit is contained in:
parent
d7d8b3509e
commit
5926f24d22
3 changed files with 61 additions and 3 deletions
|
@ -5,6 +5,7 @@ use std::task::{Context, Poll};
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
use cuprate_consensus::BlockChainContextService;
|
use cuprate_consensus::BlockChainContextService;
|
||||||
use cuprate_pruning::PruningSeed;
|
use cuprate_pruning::PruningSeed;
|
||||||
|
use cuprate_types::HardFork;
|
||||||
use futures::future::BoxFuture;
|
use futures::future::BoxFuture;
|
||||||
use monero_serai::block::Block;
|
use monero_serai::block::Block;
|
||||||
use tower::Service;
|
use tower::Service;
|
||||||
|
@ -56,6 +57,18 @@ pub enum BlockchainManagerRequest {
|
||||||
|
|
||||||
/// The height of the next block in the chain.
|
/// The height of the next block in the chain.
|
||||||
TargetHeight,
|
TargetHeight,
|
||||||
|
|
||||||
|
/// Calculate proof-of-work for this block.
|
||||||
|
CalculatePow {
|
||||||
|
/// The hardfork of the protocol at this block height.
|
||||||
|
hardfork: HardFork,
|
||||||
|
/// The height of the block.
|
||||||
|
height: usize,
|
||||||
|
/// The block data.
|
||||||
|
block: Block,
|
||||||
|
/// The seed hash for the proof-of-work.
|
||||||
|
seed_hash: [u8; 32],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: use real type when public.
|
/// TODO: use real type when public.
|
||||||
|
@ -88,6 +101,9 @@ pub enum BlockchainManagerResponse {
|
||||||
|
|
||||||
/// Response to [`BlockchainManagerRequest::TargetHeight`]
|
/// Response to [`BlockchainManagerRequest::TargetHeight`]
|
||||||
TargetHeight { height: usize },
|
TargetHeight { height: usize },
|
||||||
|
|
||||||
|
/// Response to [`BlockchainManagerRequest::CalculatePow`]
|
||||||
|
CalculatePow([u8; 32]),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// TODO: use real type when public.
|
/// TODO: use real type when public.
|
||||||
|
|
|
@ -734,10 +734,26 @@ async fn prune_blockchain(
|
||||||
|
|
||||||
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2035-L2070>
|
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2035-L2070>
|
||||||
async fn calc_pow(
|
async fn calc_pow(
|
||||||
state: CupratedRpcHandler,
|
mut state: CupratedRpcHandler,
|
||||||
request: CalcPowRequest,
|
mut request: CalcPowRequest,
|
||||||
) -> Result<CalcPowResponse, Error> {
|
) -> Result<CalcPowResponse, Error> {
|
||||||
Ok(CalcPowResponse { pow_hash: todo!() })
|
let hardfork = HardFork::from_version(request.major_version)?;
|
||||||
|
let mut block_blob: Vec<u8> = hex::decode(request.block_blob)?;
|
||||||
|
let block = Block::read(&mut block_blob.as_slice())?;
|
||||||
|
let seed_hash = helper::hex_to_hash(request.seed_hash)?;
|
||||||
|
|
||||||
|
let pow_hash = blockchain_manager::calculate_pow(
|
||||||
|
&mut state.blockchain_manager,
|
||||||
|
hardfork,
|
||||||
|
request.height,
|
||||||
|
block,
|
||||||
|
seed_hash,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let hex = hex::encode(pow_hash);
|
||||||
|
|
||||||
|
Ok(CalcPowResponse { pow_hash: hex })
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L3542-L3551>
|
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L3542-L3551>
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! Functions for [`BlockchainManagerRequest`] & [`BlockchainManagerResponse`].
|
//! Functions for [`BlockchainManagerRequest`] & [`BlockchainManagerResponse`].
|
||||||
|
|
||||||
use anyhow::Error;
|
use anyhow::Error;
|
||||||
|
use cuprate_types::HardFork;
|
||||||
use monero_serai::block::Block;
|
use monero_serai::block::Block;
|
||||||
use tower::{Service, ServiceExt};
|
use tower::{Service, ServiceExt};
|
||||||
|
|
||||||
|
@ -142,3 +143,28 @@ pub(crate) async fn target_height(
|
||||||
|
|
||||||
Ok(usize_to_u64(height))
|
Ok(usize_to_u64(height))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// [`BlockchainManagerRequest::CalculatePow`]
|
||||||
|
pub(crate) async fn calculate_pow(
|
||||||
|
blockchain_manager: &mut BlockchainManagerHandle,
|
||||||
|
hardfork: HardFork,
|
||||||
|
height: u64,
|
||||||
|
block: Block,
|
||||||
|
seed_hash: [u8; 32],
|
||||||
|
) -> Result<[u8; 32], Error> {
|
||||||
|
let BlockchainManagerResponse::CalculatePow(hash) = blockchain_manager
|
||||||
|
.ready()
|
||||||
|
.await?
|
||||||
|
.call(BlockchainManagerRequest::CalculatePow {
|
||||||
|
hardfork,
|
||||||
|
height: u64_to_usize(height),
|
||||||
|
block,
|
||||||
|
seed_hash,
|
||||||
|
})
|
||||||
|
.await?
|
||||||
|
else {
|
||||||
|
unreachable!();
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(hash)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue