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:
Alexandru Vasile
2023-07-25 18:43:04 +03:00
committed by GitHub
parent 59d8b86450
commit 00787a10e9
4 changed files with 217 additions and 67 deletions
@@ -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
],
)