diff --git a/examples/examples/get_storage.rs b/examples/examples/get_storage.rs index 030d220ce..35fffbb2c 100644 --- a/examples/examples/get_storage.rs +++ b/examples/examples/get_storage.rs @@ -56,4 +56,20 @@ async fn main() { let signer = AccountKeyring::Alice.pair(); api.set_signer(signer); println!("[+] Alice's Account Nonce is {}", api.get_nonce().unwrap()); + + // Get an vector of storage keys, numbering up to the given max keys and that start with the (optionally) given storage key prefix. + let storage_key_prefix = api.get_storage_map_key_prefix("System", "Account").unwrap(); + let max_keys = 3; + let storage_keys = api + .get_storage_keys_paged(Some(storage_key_prefix), max_keys, None, None) + .unwrap(); + assert_eq!(storage_keys.len() as u32, max_keys); + // Get the storage values that belong to the retrieved storage keys. + for storage_key in storage_keys.iter() { + println!("Retrieving value for key {:?}", storage_key); + // We're expecting account info as return value because we fetch added a prefix of "System" + "Account". + let storage_data: AccountInfo = + api.get_storage_by_key_hash(storage_key.clone(), None).unwrap().unwrap(); + println!("Retrieved data {:?}", storage_data); + } } diff --git a/src/api/rpc_api/state.rs b/src/api/rpc_api/state.rs index 6b3b37a52..619efec75 100644 --- a/src/api/rpc_api/state.rs +++ b/src/api/rpc_api/state.rs @@ -62,6 +62,17 @@ pub trait GetStorage { at_block: Option, ) -> Result>; + /// 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. + fn get_storage_keys_paged( + &self, + prefix: Option, + count: u32, + start_key: Option, + at_block: Option, + ) -> Result>; + fn get_opaque_storage_by_key_hash( &self, key: StorageKey, @@ -175,6 +186,19 @@ where } } + fn get_storage_keys_paged( + &self, + prefix: Option, + count: u32, + start_key: Option, + at_block: Option, + ) -> Result> { + let storage = self + .client() + .request("state_getKeysPaged", rpc_params![prefix, count, start_key, at_block])?; + Ok(storage) + } + fn get_opaque_storage_by_key_hash( &self, key: StorageKey, diff --git a/testing/examples/state_tests.rs b/testing/examples/state_tests.rs index b5e533e90..6ce5e63ef 100644 --- a/testing/examples/state_tests.rs +++ b/testing/examples/state_tests.rs @@ -90,4 +90,14 @@ async fn main() { api.get_storage_proof_by_keys(vec![storage_key.clone()], None).unwrap().unwrap(); let _keys = api.get_keys(storage_key, None).unwrap().unwrap(); let _constants: Balance = api.get_constant("Balances", "ExistentialDeposit").unwrap(); + + let max_keys = 3; + let storage_keys = api + .get_storage_keys_paged(Some(storage_key_prefix), max_keys, None, None) + .unwrap(); + assert_eq!(storage_keys.len() as u32, max_keys); + + let max_keys = 20; + let storage_keys = api.get_storage_keys_paged(None, max_keys, None, None).unwrap(); + assert_eq!(storage_keys.len() as u32, max_keys); }