mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 13:27:57 +00:00
Add dev_getBlockStats RPC (#10939)
* Add chain_getBlockStats rpc * Fix broken doc link * Apply suggestions from code review Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * fmt * Fix compilation * Move Blockstats * Apply suggestions from code review Co-authored-by: David <dvdplm@gmail.com> * fmt Co-authored-by: ascjones <ascjones@gmail.com> Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: David <dvdplm@gmail.com>
This commit is contained in:
committed by
GitHub
parent
be11700658
commit
be6b6adbb4
@@ -0,0 +1,71 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
//! Error helpers for Dev RPC module.
|
||||
|
||||
use crate::errors;
|
||||
use jsonrpc_core as rpc;
|
||||
|
||||
/// Dev RPC Result type.
|
||||
pub type Result<T> = std::result::Result<T, Error>;
|
||||
|
||||
/// Dev RPC future Result type.
|
||||
pub type FutureResult<T> = jsonrpc_core::BoxFuture<Result<T>>;
|
||||
|
||||
/// Dev RPC errors.
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
pub enum Error {
|
||||
/// Failed to query specified block or its parent: Probably an invalid hash.
|
||||
#[error("Error while querying block: {0}")]
|
||||
BlockQueryError(Box<dyn std::error::Error + Send>),
|
||||
/// The re-execution of the specified block failed.
|
||||
#[error("Failed to re-execute the specified block")]
|
||||
BlockExecutionFailed,
|
||||
/// The witness compaction failed.
|
||||
#[error("Failed to create to compact the witness")]
|
||||
WitnessCompactionFailed,
|
||||
/// The method is marked as unsafe but unsafe flag wasn't supplied on the CLI.
|
||||
#[error(transparent)]
|
||||
UnsafeRpcCalled(#[from] crate::policy::UnsafeRpcError),
|
||||
}
|
||||
|
||||
/// Base error code for all dev errors.
|
||||
const BASE_ERROR: i64 = 6000;
|
||||
|
||||
impl From<Error> for rpc::Error {
|
||||
fn from(e: Error) -> Self {
|
||||
match e {
|
||||
Error::BlockQueryError(_) => rpc::Error {
|
||||
code: rpc::ErrorCode::ServerError(BASE_ERROR + 1),
|
||||
message: e.to_string(),
|
||||
data: None,
|
||||
},
|
||||
Error::BlockExecutionFailed => rpc::Error {
|
||||
code: rpc::ErrorCode::ServerError(BASE_ERROR + 3),
|
||||
message: e.to_string(),
|
||||
data: None,
|
||||
},
|
||||
Error::WitnessCompactionFailed => rpc::Error {
|
||||
code: rpc::ErrorCode::ServerError(BASE_ERROR + 4),
|
||||
message: e.to_string(),
|
||||
data: None,
|
||||
},
|
||||
e => errors::internal(e),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
// This file is part of Substrate.
|
||||
|
||||
// Copyright (C) 2022 Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
//! Substrate dev API containing RPCs that are mainly meant for debugging and stats collection for
|
||||
//! developers. The endpoints in this RPC module are not meant to be available to non-local users
|
||||
//! and are all marked `unsafe`.
|
||||
|
||||
pub mod error;
|
||||
|
||||
use self::error::Result;
|
||||
use codec::{Decode, Encode};
|
||||
use jsonrpc_derive::rpc;
|
||||
use scale_info::TypeInfo;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// Statistics of a block returned by the `dev_getBlockStats` RPC.
|
||||
#[derive(Eq, PartialEq, Clone, Copy, Encode, Decode, Debug, TypeInfo, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub struct BlockStats {
|
||||
/// The length in bytes of the storage proof produced by executing the block.
|
||||
pub witness_len: u64,
|
||||
/// The length in bytes of the storage proof after compaction.
|
||||
pub witness_compact_len: u64,
|
||||
/// Length of the block in bytes.
|
||||
///
|
||||
/// This information can also be acquired by downloading the whole block. This merely
|
||||
/// saves some complexity on the client side.
|
||||
pub block_len: u64,
|
||||
/// Number of extrinsics in the block.
|
||||
///
|
||||
/// This information can also be acquired by downloading the whole block. This merely
|
||||
/// saves some complexity on the client side.
|
||||
pub num_extrinsics: u64,
|
||||
}
|
||||
|
||||
/// Substrate dev API.
|
||||
///
|
||||
/// This API contains unstable and unsafe methods only meant for development nodes. They
|
||||
/// are all flagged as unsafe for this reason.
|
||||
#[rpc]
|
||||
pub trait DevApi<Hash> {
|
||||
/// Reexecute the specified `block_hash` and gather statistics while doing so.
|
||||
///
|
||||
/// This function requires the specified block and its parent to be available
|
||||
/// at the queried node. If either the specified block or the parent is pruned,
|
||||
/// this function will return `None`.
|
||||
#[rpc(name = "dev_getBlockStats")]
|
||||
fn block_stats(&self, block_hash: Hash) -> Result<Option<BlockStats>>;
|
||||
}
|
||||
@@ -35,6 +35,7 @@ pub use policy::{DenyUnsafe, UnsafeRpcError};
|
||||
pub mod author;
|
||||
pub mod chain;
|
||||
pub mod child_state;
|
||||
pub mod dev;
|
||||
pub mod offchain;
|
||||
pub mod state;
|
||||
pub mod system;
|
||||
|
||||
Reference in New Issue
Block a user