mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-23 21:21:06 +00:00
Extends ChildStateBackend and ChildStateAPI with ReadProofs (#8812)
* Extends ChildStateBackend and ChildStateAPI with ReadProofs The following changes integrate the existing `read_child_proof` from the `ProofProvider` into the ChildStateBackend, so that a read proof can be generated from a full client via an rpc call. * Cleanup formatting
This commit is contained in:
@@ -23,6 +23,7 @@ use sp_core::storage::{StorageKey, PrefixedStorageKey, StorageData};
|
|||||||
use crate::state::error::FutureResult;
|
use crate::state::error::FutureResult;
|
||||||
|
|
||||||
pub use self::gen_client::Client as ChildStateClient;
|
pub use self::gen_client::Client as ChildStateClient;
|
||||||
|
use crate::state::ReadProof;
|
||||||
|
|
||||||
/// Substrate child state API
|
/// Substrate child state API
|
||||||
///
|
///
|
||||||
@@ -68,4 +69,13 @@ pub trait ChildStateApi<Hash> {
|
|||||||
key: StorageKey,
|
key: StorageKey,
|
||||||
hash: Option<Hash>
|
hash: Option<Hash>
|
||||||
) -> FutureResult<Option<u64>>;
|
) -> FutureResult<Option<u64>>;
|
||||||
|
|
||||||
|
/// Returns proof of storage for child key entries at a specific block's state.
|
||||||
|
#[rpc(name = "state_getChildReadProof")]
|
||||||
|
fn read_child_proof(
|
||||||
|
&self,
|
||||||
|
child_storage_key: PrefixedStorageKey,
|
||||||
|
keys: Vec<StorageKey>,
|
||||||
|
hash: Option<Hash>,
|
||||||
|
) -> FutureResult<ReadProof<Hash>>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -382,6 +382,14 @@ pub trait ChildStateBackend<Block: BlockT, Client>: Send + Sync + 'static
|
|||||||
Block: BlockT + 'static,
|
Block: BlockT + 'static,
|
||||||
Client: Send + Sync + 'static,
|
Client: Send + Sync + 'static,
|
||||||
{
|
{
|
||||||
|
/// Returns proof of storage for a child key entries at a specific block's state.
|
||||||
|
fn read_child_proof(
|
||||||
|
&self,
|
||||||
|
block: Option<Block::Hash>,
|
||||||
|
storage_key: PrefixedStorageKey,
|
||||||
|
keys: Vec<StorageKey>,
|
||||||
|
) -> FutureResult<ReadProof<Block::Hash>>;
|
||||||
|
|
||||||
/// Returns the keys with prefix from a child storage,
|
/// Returns the keys with prefix from a child storage,
|
||||||
/// leave prefix empty to get all the keys.
|
/// leave prefix empty to get all the keys.
|
||||||
fn storage_keys(
|
fn storage_keys(
|
||||||
@@ -431,6 +439,15 @@ impl<Block, Client> ChildStateApi<Block::Hash> for ChildState<Block, Client>
|
|||||||
{
|
{
|
||||||
type Metadata = crate::Metadata;
|
type Metadata = crate::Metadata;
|
||||||
|
|
||||||
|
fn read_child_proof(
|
||||||
|
&self,
|
||||||
|
child_storage_key: PrefixedStorageKey,
|
||||||
|
keys: Vec<StorageKey>,
|
||||||
|
block: Option<Block::Hash>,
|
||||||
|
) -> FutureResult<ReadProof<Block::Hash>> {
|
||||||
|
self.backend.read_child_proof(block, child_storage_key, keys)
|
||||||
|
}
|
||||||
|
|
||||||
fn storage(
|
fn storage(
|
||||||
&self,
|
&self,
|
||||||
storage_key: PrefixedStorageKey,
|
storage_key: PrefixedStorageKey,
|
||||||
@@ -466,6 +483,7 @@ impl<Block, Client> ChildStateApi<Block::Hash> for ChildState<Block, Client>
|
|||||||
) -> FutureResult<Option<u64>> {
|
) -> FutureResult<Option<u64>> {
|
||||||
self.backend.storage_size(block, storage_key, key)
|
self.backend.storage_size(block, storage_key, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn client_err(err: sp_blockchain::Error) -> Error {
|
fn client_err(err: sp_blockchain::Error) -> Error {
|
||||||
|
|||||||
@@ -552,12 +552,39 @@ impl<BE, Block, Client> ChildStateBackend<Block, Client> for FullState<BE, Block
|
|||||||
Block: BlockT + 'static,
|
Block: BlockT + 'static,
|
||||||
BE: Backend<Block> + 'static,
|
BE: Backend<Block> + 'static,
|
||||||
Client: ExecutorProvider<Block> + StorageProvider<Block, BE>
|
Client: ExecutorProvider<Block> + StorageProvider<Block, BE>
|
||||||
|
+ ProofProvider<Block>
|
||||||
+ HeaderBackend<Block> + BlockBackend<Block>
|
+ HeaderBackend<Block> + BlockBackend<Block>
|
||||||
+ HeaderMetadata<Block, Error = sp_blockchain::Error> + BlockchainEvents<Block>
|
+ HeaderMetadata<Block, Error = sp_blockchain::Error> + BlockchainEvents<Block>
|
||||||
+ CallApiAt<Block> + ProvideRuntimeApi<Block>
|
+ CallApiAt<Block> + ProvideRuntimeApi<Block>
|
||||||
+ Send + Sync + 'static,
|
+ Send + Sync + 'static,
|
||||||
Client::Api: Metadata<Block>,
|
Client::Api: Metadata<Block>,
|
||||||
{
|
{
|
||||||
|
fn read_child_proof(
|
||||||
|
&self,
|
||||||
|
block: Option<Block::Hash>,
|
||||||
|
storage_key: PrefixedStorageKey,
|
||||||
|
keys: Vec<StorageKey>,
|
||||||
|
) -> FutureResult<ReadProof<Block::Hash>> {
|
||||||
|
Box::new(result(
|
||||||
|
self.block_or_best(block)
|
||||||
|
.and_then(|block| {
|
||||||
|
let child_info = match ChildType::from_prefixed_key(&storage_key) {
|
||||||
|
Some((ChildType::ParentKeyId, storage_key)) => ChildInfo::new_default(storage_key),
|
||||||
|
None => return Err(sp_blockchain::Error::InvalidChildStorageKey),
|
||||||
|
};
|
||||||
|
self.client
|
||||||
|
.read_child_proof(
|
||||||
|
&BlockId::Hash(block),
|
||||||
|
&child_info,
|
||||||
|
&mut keys.iter().map(|key| key.0.as_ref()),
|
||||||
|
)
|
||||||
|
.map(|proof| proof.iter_nodes().map(|node| node.into()).collect())
|
||||||
|
.map(|proof| ReadProof { at: block, proof })
|
||||||
|
})
|
||||||
|
.map_err(client_err),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
fn storage_keys(
|
fn storage_keys(
|
||||||
&self,
|
&self,
|
||||||
block: Option<Block::Hash>,
|
block: Option<Block::Hash>,
|
||||||
|
|||||||
@@ -491,6 +491,15 @@ impl<Block, F, Client> ChildStateBackend<Block, Client> for LightState<Block, F,
|
|||||||
Client: BlockchainEvents<Block> + HeaderBackend<Block> + Send + Sync + 'static,
|
Client: BlockchainEvents<Block> + HeaderBackend<Block> + Send + Sync + 'static,
|
||||||
F: Fetcher<Block> + 'static
|
F: Fetcher<Block> + 'static
|
||||||
{
|
{
|
||||||
|
fn read_child_proof(
|
||||||
|
&self,
|
||||||
|
_block: Option<Block::Hash>,
|
||||||
|
_storage_key: PrefixedStorageKey,
|
||||||
|
_keys: Vec<StorageKey>,
|
||||||
|
) -> FutureResult<ReadProof<Block::Hash>> {
|
||||||
|
Box::new(result(Err(client_err(ClientError::NotAvailableOnLightClient))))
|
||||||
|
}
|
||||||
|
|
||||||
fn storage_keys(
|
fn storage_keys(
|
||||||
&self,
|
&self,
|
||||||
_block: Option<Block::Hash>,
|
_block: Option<Block::Hash>,
|
||||||
|
|||||||
Reference in New Issue
Block a user