mirror of
https://github.com/Cuprate/cuprate.git
synced 2024-12-25 21:19:22 +00:00
add CumulativeBlockWeightLimit
, submit_block
This commit is contained in:
parent
6dc85c606f
commit
0d0a544e68
6 changed files with 62 additions and 3 deletions
|
@ -206,6 +206,23 @@ pub(super) async fn find_first_unknown(
|
||||||
Ok(resp.map(|(index, height)| (index, usize_to_u64(height))))
|
Ok(resp.map(|(index, height)| (index, usize_to_u64(height))))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// [`BlockchainResponse::CumulativeBlockWeightLimit`]
|
||||||
|
pub(super) async fn cumulative_block_weight_limit(
|
||||||
|
state: &mut CupratedRpcHandlerState,
|
||||||
|
) -> Result<usize, Error> {
|
||||||
|
let BlockchainResponse::CumulativeBlockWeightLimit(limit) = state
|
||||||
|
.blockchain_read
|
||||||
|
.ready()
|
||||||
|
.await?
|
||||||
|
.call(BlockchainReadRequest::CumulativeBlockWeightLimit)
|
||||||
|
.await?
|
||||||
|
else {
|
||||||
|
unreachable!();
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(limit)
|
||||||
|
}
|
||||||
|
|
||||||
// FindBlock([u8; 32]),
|
// FindBlock([u8; 32]),
|
||||||
// FilterUnknownHashes(HashSet<[u8; 32]>),
|
// FilterUnknownHashes(HashSet<[u8; 32]>),
|
||||||
// BlockExtendedHeaderInRange(Range<usize>, Chain),
|
// BlockExtendedHeaderInRange(Range<usize>, Chain),
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
//! TODO
|
//! TODO
|
||||||
//!
|
//!
|
||||||
//! <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L63-L77>
|
//! - <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L63-L77>
|
||||||
|
//! - <https://github.com/monero-project/monero/blob/a1dc85c5373a30f14aaf7dcfdd95f5a7375d3623/src/cryptonote_core/cryptonote_core.cpp#L63-L72>
|
||||||
|
|
||||||
pub const MAX_RESTRICTED_FAKE_OUTS_COUNT: usize = 40;
|
pub const MAX_RESTRICTED_FAKE_OUTS_COUNT: usize = 40;
|
||||||
pub const MAX_RESTRICTED_GLOBAL_FAKE_OUTS_COUNT: usize = 5000;
|
pub const MAX_RESTRICTED_GLOBAL_FAKE_OUTS_COUNT: usize = 5000;
|
||||||
|
@ -15,3 +16,5 @@ pub const RESTRICTED_BLOCK_HEADER_RANGE: u64 = 1000;
|
||||||
pub const RESTRICTED_TRANSACTIONS_COUNT: usize = 100;
|
pub const RESTRICTED_TRANSACTIONS_COUNT: usize = 100;
|
||||||
pub const RESTRICTED_SPENT_KEY_IMAGES_COUNT: usize = 5000;
|
pub const RESTRICTED_SPENT_KEY_IMAGES_COUNT: usize = 5000;
|
||||||
pub const RESTRICTED_BLOCK_COUNT: usize = 1000;
|
pub const RESTRICTED_BLOCK_COUNT: usize = 1000;
|
||||||
|
|
||||||
|
pub const BLOCK_SIZE_SANITY_LEEWAY: usize = 100;
|
||||||
|
|
|
@ -10,6 +10,7 @@ use std::sync::Arc;
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
use cuprate_rpc_types::misc::{BlockHeader, KeyImageSpentStatus};
|
use cuprate_rpc_types::misc::{BlockHeader, KeyImageSpentStatus};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
|
use monero_serai::block::Block;
|
||||||
use tower::{Service, ServiceExt};
|
use tower::{Service, ServiceExt};
|
||||||
|
|
||||||
use cuprate_consensus::BlockchainResponse;
|
use cuprate_consensus::BlockchainResponse;
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
|
use core::slice::SlicePattern;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use anyhow::{anyhow, Error};
|
use anyhow::{anyhow, Error};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
|
use monero_serai::block::Block;
|
||||||
use tower::{Service, ServiceExt};
|
use tower::{Service, ServiceExt};
|
||||||
|
|
||||||
use cuprate_consensus::BlockchainResponse;
|
use cuprate_consensus::BlockchainResponse;
|
||||||
|
@ -44,6 +46,8 @@ use crate::{
|
||||||
version::CUPRATED_VERSION_IS_RELEASE,
|
version::CUPRATED_VERSION_IS_RELEASE,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use super::constants::BLOCK_SIZE_SANITY_LEEWAY;
|
||||||
|
|
||||||
/// Map a [`JsonRpcRequest`] to the function that will lead to a [`JsonRpcResponse`].
|
/// Map a [`JsonRpcRequest`] to the function that will lead to a [`JsonRpcResponse`].
|
||||||
pub(super) async fn map_request(
|
pub(super) async fn map_request(
|
||||||
state: CupratedRpcHandlerState,
|
state: CupratedRpcHandlerState,
|
||||||
|
@ -127,12 +131,28 @@ async fn on_get_block_hash(
|
||||||
|
|
||||||
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2209-L2266>
|
/// <https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/src/rpc/core_rpc_server.cpp#L2209-L2266>
|
||||||
async fn submit_block(
|
async fn submit_block(
|
||||||
state: CupratedRpcHandlerState,
|
mut state: CupratedRpcHandlerState,
|
||||||
request: SubmitBlockRequest,
|
request: SubmitBlockRequest,
|
||||||
) -> Result<SubmitBlockResponse, Error> {
|
) -> Result<SubmitBlockResponse, Error> {
|
||||||
|
let [blob] = request.block_blob;
|
||||||
|
|
||||||
|
let limit = blockchain::cumulative_block_weight_limit(&mut state).await?;
|
||||||
|
|
||||||
|
if blob.len() > limit + BLOCK_SIZE_SANITY_LEEWAY {
|
||||||
|
return Err(anyhow!("Block size is too big, rejecting block"));
|
||||||
|
}
|
||||||
|
|
||||||
|
let bytes = hex::decode(blob)?;
|
||||||
|
let block = Block::read(&mut bytes.as_slice())?;
|
||||||
|
|
||||||
|
// <https://github.com/monero-project/monero/blob/master/src/cryptonote_core/cryptonote_core.cpp#L1540>
|
||||||
|
let block_id = todo!("submit block to DB");
|
||||||
|
todo!("relay to P2P");
|
||||||
|
todo!("send to txpool");
|
||||||
|
|
||||||
Ok(SubmitBlockResponse {
|
Ok(SubmitBlockResponse {
|
||||||
base: ResponseBase::ok(),
|
base: ResponseBase::ok(),
|
||||||
block_id: todo!(),
|
block_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,7 @@ fn map_request(
|
||||||
R::KeyImagesSpent(set) => key_images_spent(env, set),
|
R::KeyImagesSpent(set) => key_images_spent(env, set),
|
||||||
R::CompactChainHistory => compact_chain_history(env),
|
R::CompactChainHistory => compact_chain_history(env),
|
||||||
R::FindFirstUnknown(block_ids) => find_first_unknown(env, &block_ids),
|
R::FindFirstUnknown(block_ids) => find_first_unknown(env, &block_ids),
|
||||||
|
R::CumulativeBlockWeightLimit => cumulative_block_weight_limit(env),
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SOMEDAY: post-request handling, run some code for each request? */
|
/* SOMEDAY: post-request handling, run some code for each request? */
|
||||||
|
@ -544,3 +545,14 @@ fn find_first_unknown(env: &ConcreteEnv, block_ids: &[BlockHash]) -> ResponseRes
|
||||||
BlockchainResponse::FindFirstUnknown(Some((idx, last_known_height + 1)))
|
BlockchainResponse::FindFirstUnknown(Some((idx, last_known_height + 1)))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// [`BlockchainReadRequest::CumulativeBlockWeightLimit`]
|
||||||
|
fn cumulative_block_weight_limit(env: &ConcreteEnv) -> ResponseResult {
|
||||||
|
let env_inner = env.env_inner();
|
||||||
|
let tx_ro = env_inner.tx_ro()?;
|
||||||
|
|
||||||
|
let table_blocks = env_inner.open_db_ro::<BlockInfos>(&tx_ro)?;
|
||||||
|
let limit = todo!();
|
||||||
|
|
||||||
|
Ok(BlockchainResponse::CumulativeBlockWeightLimit(limit))
|
||||||
|
}
|
||||||
|
|
|
@ -118,6 +118,9 @@ pub enum BlockchainReadRequest {
|
||||||
/// order, or else the returned response is unspecified and meaningless,
|
/// order, or else the returned response is unspecified and meaningless,
|
||||||
/// as this request performs a binary search.
|
/// as this request performs a binary search.
|
||||||
FindFirstUnknown(Vec<[u8; 32]>),
|
FindFirstUnknown(Vec<[u8; 32]>),
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
CumulativeBlockWeightLimit,
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------- WriteRequest
|
//---------------------------------------------------------------------------------------------------- WriteRequest
|
||||||
|
@ -239,6 +242,9 @@ pub enum BlockchainResponse {
|
||||||
/// This will be [`None`] if all blocks were known.
|
/// This will be [`None`] if all blocks were known.
|
||||||
FindFirstUnknown(Option<(usize, usize)>),
|
FindFirstUnknown(Option<(usize, usize)>),
|
||||||
|
|
||||||
|
/// TODO
|
||||||
|
CumulativeBlockWeightLimit(usize),
|
||||||
|
|
||||||
//------------------------------------------------------ Writes
|
//------------------------------------------------------ Writes
|
||||||
/// Response to [`BlockchainWriteRequest::WriteBlock`].
|
/// Response to [`BlockchainWriteRequest::WriteBlock`].
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in a new issue