Struct sc_rpc_api::state::StateClient [−][src]
pub struct StateClient<Hash> { /* fields omitted */ }
Expand description
The Client.
Implementations
Creates a new Client
.
Call a contract at a block’s state.
pub fn storage_keys(
&self,
prefix: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageKey>>>
pub fn storage_keys(
&self,
prefix: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageKey>>>
DEPRECATED: Please use state_getKeysPaged
with proper paging support.
Returns the keys with prefix, leave empty to get all the keys.
pub fn storage_pairs(
&self,
prefix: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<(StorageKey, StorageData)>>>
pub fn storage_pairs(
&self,
prefix: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<(StorageKey, StorageData)>>>
Returns the keys with prefix, leave empty to get all the keys
pub fn storage_keys_paged(
&self,
prefix: Option<StorageKey>,
count: u32,
start_key: Option<StorageKey>,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageKey>>>
pub fn storage_keys_paged(
&self,
prefix: Option<StorageKey>,
count: u32,
start_key: Option<StorageKey>,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageKey>>>
Returns the keys with prefix with pagination support.
Up to count
keys will be returned.
If start_key
is passed, return next keys in storage in lexicographic order.
pub fn storage(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<StorageData>>>
pub fn storage(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<StorageData>>>
Returns a storage entry at a specific block’s state.
pub fn storage_hash(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<Hash>>>
pub fn storage_hash(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<Hash>>>
Returns the hash of a storage entry at a block’s state.
pub fn storage_size(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<u64>>>
pub fn storage_size(
&self,
key: StorageKey,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Option<u64>>>
Returns the size of a storage entry at a block’s state.
Returns the runtime metadata as an opaque blob.
pub fn runtime_version(
&self,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<RuntimeVersion>>
pub fn runtime_version(
&self,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<RuntimeVersion>>
Get the runtime version.
pub fn query_storage(
&self,
keys: Vec<StorageKey>,
block: Hash,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageChangeSet<Hash>>>>
pub fn query_storage(
&self,
keys: Vec<StorageKey>,
block: Hash,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageChangeSet<Hash>>>>
Query historical storage entries (by key) starting from a block given as the second parameter.
NOTE This first returned result contains the initial state of storage for all keys. Subsequent values in the vector represent changes to the previous state (diffs).
pub fn query_storage_at(
&self,
keys: Vec<StorageKey>,
at: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageChangeSet<Hash>>>>
pub fn query_storage_at(
&self,
keys: Vec<StorageKey>,
at: Option<Hash>
) -> impl Future<Output = RpcResult<Vec<StorageChangeSet<Hash>>>>
Query storage entries (by key) starting at block hash given as the second parameter.
pub fn read_proof(
&self,
keys: Vec<StorageKey>,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<ReadProof<Hash>>>
pub fn read_proof(
&self,
keys: Vec<StorageKey>,
hash: Option<Hash>
) -> impl Future<Output = RpcResult<ReadProof<Hash>>>
Returns proof of storage entries at a specific block’s state.
The state_traceBlock
RPC provides a way to trace the re-execution of a single
block, collecting Spans and Events from both the client and the relevant WASM runtime.
The Spans and Events are conceptually equivalent to those from the Tracing crate.
The structure of the traces follows that of the block execution pipeline, so meaningful interpretation of the traces requires an understanding of the Substrate chain’s block execution.
Link to conceptual map of trace structure for Polkadot and Kusama block execution.
Node requirements
- Fully synced archive node (i.e. a node that is not actively doing a “major” sync).
- Tracing enabled WASM runtimes for all runtime versions for which tracing is desired.
Node recommendations
- Use fast SSD disk storage.
- Run node flags to increase DB read speed (i.e.
--state-cache-size
,--db-cache
).
Creating tracing enabled WASM runtimes
- Checkout commit of chain version to compile with WASM traces
- diener can help to peg commit of substrate to what the chain expects.
- Navigate to the
runtime
folder/package of the chain - Add feature
with-tracing = ["frame-executive/with-tracing", "sp-io/with-tracing"]
under[features]
to theruntime
packages’Cargo.toml
. - Compile the runtime with
cargo build --release --features with-tracing
- Tracing-enabled WASM runtime should be found in
./target/release/wbuild/{{chain}}-runtime
and be called something like{{your_chain}}_runtime.compact.wasm
. This can be renamed/modified however you like, as long as it retains the.wasm
extension. - Run the node with the wasm blob overrides by placing them in a folder with all your runtimes, and passing the path of this folder to your chain, e.g.:
./target/release/polkadot --wasm-runtime-overrides /home/user/my-custom-wasm-runtimes
You can also find some pre-built tracing enabled wasm runtimes in substrate-archive
RPC Usage
The RPC allows for two filtering mechanisms: tracing targets and storage key prefixes. The filtering of spans and events takes place after they are all collected; so while filters do not reduce time for actual block re-execution, they reduce the response payload size.
Note: storage events primarily come from primitives/state-machine/src/ext.rs. The default filters can be overridden, see the params section for details.
curl
example
- Get tracing spans and events
curl \
-H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_traceBlock", \
"params": ["0xb246acf1adea1f801ce15c77a5fa7d8f2eb8fed466978bcee172cc02cf64e264", "pallet,frame,state", "", ""]}' \
http://localhost:9933/
- Get tracing events with all
storage_keys
curl \
-H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_traceBlock", \
"params": ["0xb246acf1adea1f801ce15c77a5fa7d8f2eb8fed466978bcee172cc02cf64e264", "state", "", ""]}' \
http://localhost:9933/
- Get tracing events with
storage_keys
(‘f0c365c3cf59d671eb72da0e7a4113c4’)
curl \
-H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_traceBlock", \
"params": ["0xb246acf1adea1f801ce15c77a5fa7d8f2eb8fed466978bcee172cc02cf64e264", "state", "f0c365c3cf59d671eb72da0e7a4113c4", ""]}' \
http://localhost:9933/
- Get tracing events with
storage_keys
(‘f0c365c3cf59d671eb72da0e7a4113c4’) and method (‘Put’)
curl \
-H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_traceBlock", \
"params": ["0xb246acf1adea1f801ce15c77a5fa7d8f2eb8fed466978bcee172cc02cf64e264", "state", "f0c365c3cf59d671eb72da0e7a4113c4", "Put"]}' \
http://localhost:9933/
- Get tracing events with all
storage_keys
and method (‘Put’)
curl \
-H "Content-Type: application/json" \
-d '{"id":1, "jsonrpc":"2.0", "method": "state_traceBlock", \
"params": ["0xb246acf1adea1f801ce15c77a5fa7d8f2eb8fed466978bcee172cc02cf64e264", "state", "", "Put"]}' \
http://localhost:9933/
Params
block
(param index 0): Hash of the block to trace.targets
(param index 1): String of comma separated (no spaces) targets. Specified targets match with trace targets by prefix (i.e if a target is in the beginning of a trace target it is considered a match). If an empty string is specified no targets will be filtered out. The majority of targets correspond to Rust module names, and the ones that do not are typically “hardcoded” into span or event location somewhere in the Substrate source code. (“Non-hardcoded” targets typically come from frame support macros.)storage_keys
(param index 2): String of comma separated (no spaces) hex encoded (no0x
prefix) storage keys. If an empty string is specified no events will be filtered out. If anything other than an empty string is specified, events will be filtered by storage key (so non-storage events will not show up). You can specify any length of a storage key prefix (i.e. if a specified storage key is in the beginning of an events storage key it is considered a match). Example: for balance tracking on Polkadot & Kusama you would likely want to track changes to account balances with the frame_system::Account storage item, which is a map fromAccountId
toAccountInfo
. The key filter for this would be the storage prefix for the map:26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9
methods
(param index 3): String of comma separated (no spaces) tracing event method. If an empty string is specified no events will be filtered out. If anything other than an empty string is specified, events will be filtered by method (so non-method events will not show up).
Additionally you would want to track the extrinsic index, which is under the
:extrinsic_index
key. The key for this would be the aforementioned string as bytes
in hex: 3a65787472696e7369635f696e646578
.
The following are some resources to learn more about storage keys in substrate:
substrate storage, transparent keys in substrate,
querying substrate storage via rpc.
Maximum payload size
The maximum payload size allowed is 15mb. Payloads over this size will return a object with a simple error message. If you run into issues with payload size you can narrow down the traces using a smaller set of targets and/or storage keys.
If you are having issues with maximum payload size you can use the flag
-lstate_tracing=trace
to get some logging during tracing.
pub fn subscribe_storage(
&self,
keys: Option<Vec<StorageKey>>
) -> RpcResult<TypedSubscriptionStream<StorageChangeSet<Hash>>>
pub fn subscribe_storage(
&self,
keys: Option<Vec<StorageKey>>
) -> RpcResult<TypedSubscriptionStream<StorageChangeSet<Hash>>>
New storage subscription
New runtime version subscription
Trait Implementations
impl<Hash> From<RpcChannel> for Client<Hash> where
Hash: Send + Sync + 'static + DeserializeOwned + Serialize,
impl<Hash> From<RpcChannel> for Client<Hash> where
Hash: Send + Sync + 'static + DeserializeOwned + Serialize,
Performs the conversion.
Auto Trait Implementations
impl<Hash> !RefUnwindSafe for Client<Hash>
impl<Hash> !UnwindSafe for Client<Hash>
Blanket Implementations
Mutably borrows from an owned value. Read more
Convert Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read more
Convert &Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read more
Convert &mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read more
Causes self
to use its Binary
implementation when Debug
-formatted.
Causes self
to use its Display
implementation when
Debug
-formatted. Read more
Causes self
to use its LowerExp
implementation when
Debug
-formatted. Read more
Causes self
to use its LowerHex
implementation when
Debug
-formatted. Read more
Causes self
to use its Octal
implementation when Debug
-formatted.
Causes self
to use its Pointer
implementation when
Debug
-formatted. Read more
Causes self
to use its UpperExp
implementation when
Debug
-formatted. Read more
Causes self
to use its UpperHex
implementation when
Debug
-formatted. Read more
Pipes by value. This is generally the method you want to use. Read more
Borrows self
and passes that borrow into the pipe function. Read more
Mutably borrows self
and passes that borrow into the pipe function. Read more
Borrows self
, then passes self.borrow()
into the pipe function. Read more
Mutably borrows self
, then passes self.borrow_mut()
into the pipe
function. Read more
Borrows self
, then passes self.as_ref()
into the pipe function.
Mutably borrows self
, then passes self.as_mut()
into the pipe
function. Read more
Borrows self
, then passes self.deref()
into the pipe function.
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: AsRef<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
Self: Borrow<T>,
T: 'a,
R: 'a,
Pipes a trait borrow into a function that cannot normally be called in suffix position. Read more
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
Self: Deref,
R: 'a,
Pipes a dereference into a function that cannot normally be called in suffix position. Read more
Pipes a reference into a function that cannot ordinarily be called in suffix position. Read more
Immutable access to the Borrow<B>
of a value. Read more
Mutable access to the BorrowMut<B>
of a value. Read more
Immutable access to the AsRef<R>
view of a value. Read more
Mutable access to the AsMut<R>
view of a value. Read more
Immutable access to the Deref::Target
of a value. Read more
Mutable access to the Deref::Target
of a value. Read more
Calls .tap()
only in debug builds, and is erased in release builds.
Calls .tap_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_borrow()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_ref()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more
Calls .tap_deref()
only in debug builds, and is erased in release
builds. Read more
Provides immutable access to the reference for inspection.
Calls tap_ref
in debug builds, and does nothing in release builds.
Provides mutable access to the reference for modification.
Calls tap_ref_mut
in debug builds, and does nothing in release builds.
Provides immutable access to the borrow for inspection. Read more
Calls tap_borrow
in debug builds, and does nothing in release builds.
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Provides mutable access to the borrow for modification.
Immutably dereferences self
for inspection.
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Calls tap_deref
in debug builds, and does nothing in release builds.
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
fn tap_deref_mut<F, R>(self, func: F) -> Self where
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Mutably dereferences self
for modification.
The counterpart to unchecked_from
.
Consume self to return an equivalent value of T
.
Attaches the provided Subscriber
to this type, returning a
WithDispatch
wrapper. Read more
Attaches the current default Subscriber
to this type, returning a
WithDispatch
wrapper. Read more