mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-15 11:31:05 +00:00
chainHead_storage: Iterate over keys (#14628)
* chainHead: Iterate over key,values and key,hashes Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * chainHead/tests: Multi query with iteration over keys Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * chainHead/events: Fix typo in StorageQuery Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * chainHead: Take 10 from key iterator Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: parity-processbot <>
This commit is contained in:
@@ -527,7 +527,7 @@ async fn get_storage_hash() {
|
||||
rpc_params![
|
||||
"invalid_sub_id",
|
||||
&invalid_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Hash }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -542,7 +542,7 @@ async fn get_storage_hash() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&invalid_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Hash }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -558,7 +558,7 @@ async fn get_storage_hash() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Hash }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -592,7 +592,7 @@ async fn get_storage_hash() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Hash }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -606,14 +606,13 @@ async fn get_storage_hash() {
|
||||
let child_info = hex_string(&CHILD_STORAGE_KEY);
|
||||
let genesis_hash = format!("{:?}", client.genesis_hash());
|
||||
let expected_hash = format!("{:?}", Blake2Hasher::hash(&CHILD_VALUE));
|
||||
println!("Expe: {:?}", expected_hash);
|
||||
let mut sub = api
|
||||
.subscribe(
|
||||
"chainHead_unstable_storage",
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&genesis_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Hash }],
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Hash }],
|
||||
&child_info
|
||||
],
|
||||
)
|
||||
@@ -625,6 +624,96 @@ async fn get_storage_hash() {
|
||||
assert_matches!(event, ChainHeadStorageEvent::Done);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_storage_multi_query_iter() {
|
||||
let (mut client, api, mut block_sub, sub_id, _) = setup_api().await;
|
||||
let key = hex_string(&KEY);
|
||||
|
||||
// Import a new block with storage changes.
|
||||
let mut builder = client.new_block(Default::default()).unwrap();
|
||||
builder.push_storage_change(KEY.to_vec(), Some(VALUE.to_vec())).unwrap();
|
||||
let block = builder.build().unwrap().block;
|
||||
let block_hash = format!("{:?}", block.header.hash());
|
||||
client.import(BlockOrigin::Own, block.clone()).await.unwrap();
|
||||
|
||||
// Ensure the imported block is propagated and pinned for this subscription.
|
||||
assert_matches!(
|
||||
get_next_event::<FollowEvent<String>>(&mut block_sub).await,
|
||||
FollowEvent::NewBlock(_)
|
||||
);
|
||||
assert_matches!(
|
||||
get_next_event::<FollowEvent<String>>(&mut block_sub).await,
|
||||
FollowEvent::BestBlockChanged(_)
|
||||
);
|
||||
|
||||
// Valid call with storage at the key.
|
||||
let expected_hash = format!("{:?}", Blake2Hasher::hash(&VALUE));
|
||||
let expected_value = hex_string(&VALUE);
|
||||
let mut sub = api
|
||||
.subscribe(
|
||||
"chainHead_unstable_storage",
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![
|
||||
StorageQuery {
|
||||
key: key.clone(),
|
||||
query_type: StorageQueryType::DescendantsHashes
|
||||
},
|
||||
StorageQuery {
|
||||
key: key.clone(),
|
||||
query_type: StorageQueryType::DescendantsValues
|
||||
}
|
||||
]
|
||||
],
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
let event: ChainHeadStorageEvent<String> = get_next_event(&mut sub).await;
|
||||
assert_matches!(event, ChainHeadStorageEvent::<String>::Items(res) if res.items.len() == 2 &&
|
||||
res.items[0].key == key &&
|
||||
res.items[1].key == key &&
|
||||
res.items[0].result == StorageResultType::Hash(expected_hash) &&
|
||||
res.items[1].result == StorageResultType::Value(expected_value));
|
||||
let event: ChainHeadStorageEvent<String> = get_next_event(&mut sub).await;
|
||||
assert_matches!(event, ChainHeadStorageEvent::Done);
|
||||
|
||||
// Child value set in `setup_api`.
|
||||
let child_info = hex_string(&CHILD_STORAGE_KEY);
|
||||
let genesis_hash = format!("{:?}", client.genesis_hash());
|
||||
let expected_hash = format!("{:?}", Blake2Hasher::hash(&CHILD_VALUE));
|
||||
let expected_value = hex_string(&CHILD_VALUE);
|
||||
let mut sub = api
|
||||
.subscribe(
|
||||
"chainHead_unstable_storage",
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&genesis_hash,
|
||||
vec![
|
||||
StorageQuery {
|
||||
key: key.clone(),
|
||||
query_type: StorageQueryType::DescendantsHashes
|
||||
},
|
||||
StorageQuery {
|
||||
key: key.clone(),
|
||||
query_type: StorageQueryType::DescendantsValues
|
||||
}
|
||||
],
|
||||
&child_info
|
||||
],
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
let event: ChainHeadStorageEvent<String> = get_next_event(&mut sub).await;
|
||||
assert_matches!(event, ChainHeadStorageEvent::<String>::Items(res) if res.items.len() == 2 &&
|
||||
res.items[0].key == key &&
|
||||
res.items[1].key == key &&
|
||||
res.items[0].result == StorageResultType::Hash(expected_hash) &&
|
||||
res.items[1].result == StorageResultType::Value(expected_value));
|
||||
let event: ChainHeadStorageEvent<String> = get_next_event(&mut sub).await;
|
||||
assert_matches!(event, ChainHeadStorageEvent::Done);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn get_storage_value() {
|
||||
let (mut client, api, mut block_sub, sub_id, block) = setup_api().await;
|
||||
@@ -639,7 +728,7 @@ async fn get_storage_value() {
|
||||
rpc_params![
|
||||
"invalid_sub_id",
|
||||
&invalid_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -654,7 +743,7 @@ async fn get_storage_value() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&invalid_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -670,7 +759,7 @@ async fn get_storage_value() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -704,7 +793,7 @@ async fn get_storage_value() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -724,7 +813,7 @@ async fn get_storage_value() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&genesis_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }],
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }],
|
||||
&child_info
|
||||
],
|
||||
)
|
||||
@@ -752,7 +841,7 @@ async fn get_storage_wrong_key() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: prefixed_key, queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: prefixed_key, query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -770,7 +859,7 @@ async fn get_storage_wrong_key() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: prefixed_key, queue_type: StorageQueryType::Value }]
|
||||
vec![StorageQuery { key: prefixed_key, query_type: StorageQueryType::Value }]
|
||||
],
|
||||
)
|
||||
.await
|
||||
@@ -788,7 +877,7 @@ async fn get_storage_wrong_key() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key: key.clone(), queue_type: StorageQueryType::Value }],
|
||||
vec![StorageQuery { key: key.clone(), query_type: StorageQueryType::Value }],
|
||||
&prefixed_key
|
||||
],
|
||||
)
|
||||
@@ -807,7 +896,7 @@ async fn get_storage_wrong_key() {
|
||||
rpc_params![
|
||||
&sub_id,
|
||||
&block_hash,
|
||||
vec![StorageQuery { key, queue_type: StorageQueryType::Value }],
|
||||
vec![StorageQuery { key, query_type: StorageQueryType::Value }],
|
||||
&prefixed_key
|
||||
],
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user