mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 20:21:06 +00:00
Fix benchmarks (#1919)
* fixed benchmarks broken by rejecting storage proofs with excessive trie nodes and justifications with extra prevotes * update weights * fmt * accidental paste * revert changes to millau runtime (separate PR) * revert comment change
This commit is contained in:
committed by
Bastian Köcher
parent
7be2cb1cdd
commit
aa466a485d
@@ -25,7 +25,7 @@ use crate::{
|
||||
AccountIdOf, BridgedChain, HashOf, HasherOf, MessageBridge, ThisChain,
|
||||
},
|
||||
messages_generation::{
|
||||
encode_all_messages, encode_lane_data, grow_trie, prepare_messages_storage_proof,
|
||||
encode_all_messages, encode_lane_data, grow_trie_leaf_value, prepare_messages_storage_proof,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -204,11 +204,12 @@ where
|
||||
{
|
||||
let mut trie =
|
||||
TrieDBMutBuilderV1::<HasherOf<BridgedChain<B>>>::new(&mut mdb, &mut root).build();
|
||||
trie.insert(&storage_key, ¶ms.inbound_lane_data.encode())
|
||||
let inbound_lane_data =
|
||||
grow_trie_leaf_value(params.inbound_lane_data.encode(), params.size);
|
||||
trie.insert(&storage_key, &inbound_lane_data)
|
||||
.map_err(|_| "TrieMut::insert has failed")
|
||||
.expect("TrieMut::insert should not fail in benchmarks");
|
||||
}
|
||||
root = grow_trie(root, &mut mdb, params.size);
|
||||
|
||||
// generate storage proof to be delivered to This chain
|
||||
let storage_proof = record_all_trie_keys::<LayoutV1<HasherOf<BridgedChain<B>>>, _>(&mdb, &root)
|
||||
|
||||
@@ -25,7 +25,6 @@ use bp_messages::{
|
||||
};
|
||||
use bp_runtime::{record_all_trie_keys, RawStorageProof, StorageProofSize};
|
||||
use codec::Encode;
|
||||
use sp_core::Hasher;
|
||||
use sp_std::{ops::RangeInclusive, prelude::*};
|
||||
use sp_trie::{trie_types::TrieDBMutBuilderV1, LayoutV1, MemoryDB, TrieMut};
|
||||
|
||||
@@ -65,10 +64,15 @@ where
|
||||
TrieDBMutBuilderV1::<HasherOf<BridgedChain<B>>>::new(&mut mdb, &mut root).build();
|
||||
|
||||
// insert messages
|
||||
for nonce in message_nonces {
|
||||
for (i, nonce) in message_nonces.into_iter().enumerate() {
|
||||
let message_key = MessageKey { lane_id: lane, nonce };
|
||||
let message_payload = match encode_message(nonce, &message_payload) {
|
||||
Some(message_payload) => message_payload,
|
||||
Some(message_payload) =>
|
||||
if i == 0 {
|
||||
grow_trie_leaf_value(message_payload, size)
|
||||
} else {
|
||||
message_payload
|
||||
},
|
||||
None => continue,
|
||||
};
|
||||
let storage_key = storage_keys::message_key(
|
||||
@@ -94,46 +98,22 @@ where
|
||||
storage_keys.push(storage_key);
|
||||
}
|
||||
}
|
||||
root = grow_trie(root, &mut mdb, size);
|
||||
|
||||
// generate storage proof to be delivered to This chain
|
||||
let storage_proof = record_all_trie_keys::<LayoutV1<HasherOf<BridgedChain<B>>>, _>(&mdb, &root)
|
||||
.map_err(|_| "record_all_trie_keys has failed")
|
||||
.expect("record_all_trie_keys should not fail in benchmarks");
|
||||
|
||||
(root, storage_proof)
|
||||
}
|
||||
|
||||
/// Populate trie with dummy keys+values until trie has at least given size.
|
||||
pub fn grow_trie<H: Hasher>(
|
||||
mut root: H::Out,
|
||||
mdb: &mut MemoryDB<H>,
|
||||
trie_size: StorageProofSize,
|
||||
) -> H::Out {
|
||||
let (iterations, leaf_size, minimal_trie_size) = match trie_size {
|
||||
StorageProofSize::Minimal(_) => return root,
|
||||
StorageProofSize::HasLargeLeaf(size) => (1, size, size),
|
||||
StorageProofSize::HasExtraNodes(size) => (8, 1, size),
|
||||
};
|
||||
|
||||
let mut key_index = 0;
|
||||
loop {
|
||||
// generate storage proof to be delivered to This chain
|
||||
let storage_proof = record_all_trie_keys::<LayoutV1<H>, _>(mdb, &root)
|
||||
.map_err(|_| "record_all_trie_keys has failed")
|
||||
.expect("record_all_trie_keys should not fail in benchmarks");
|
||||
let size: usize = storage_proof.iter().map(|n| n.len()).sum();
|
||||
if size > minimal_trie_size as _ {
|
||||
return root
|
||||
}
|
||||
|
||||
let mut trie = TrieDBMutBuilderV1::<H>::from_existing(mdb, &mut root).build();
|
||||
for _ in 0..iterations {
|
||||
trie.insert(&key_index.encode(), &vec![42u8; leaf_size as _])
|
||||
.map_err(|_| "TrieMut::insert has failed")
|
||||
.expect("TrieMut::insert should not fail in benchmarks");
|
||||
key_index += 1;
|
||||
}
|
||||
trie.commit();
|
||||
/// Add extra data to the trie leaf value so that it'll be of given size.
|
||||
pub fn grow_trie_leaf_value(mut value: Vec<u8>, size: StorageProofSize) -> Vec<u8> {
|
||||
match size {
|
||||
StorageProofSize::Minimal(_) => (),
|
||||
StorageProofSize::HasLargeLeaf(size) if size as usize > value.len() => {
|
||||
value.extend(sp_std::iter::repeat(42u8).take(size as usize - value.len()));
|
||||
},
|
||||
StorageProofSize::HasLargeLeaf(_) => (),
|
||||
}
|
||||
value
|
||||
}
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
#![cfg(feature = "runtime-benchmarks")]
|
||||
|
||||
use crate::{
|
||||
messages_benchmarking::insert_header_to_grandpa_pallet, messages_generation::grow_trie,
|
||||
messages_benchmarking::insert_header_to_grandpa_pallet,
|
||||
messages_generation::grow_trie_leaf_value,
|
||||
};
|
||||
|
||||
use bp_parachains::parachain_head_storage_key_at_source;
|
||||
@@ -59,17 +60,21 @@ where
|
||||
TrieDBMutBuilderV1::<RelayBlockHasher>::new(&mut mdb, &mut state_root).build();
|
||||
|
||||
// insert parachain heads
|
||||
for parachain in parachains {
|
||||
for (i, parachain) in parachains.into_iter().enumerate() {
|
||||
let storage_key =
|
||||
parachain_head_storage_key_at_source(R::ParasPalletName::get(), *parachain);
|
||||
trie.insert(&storage_key.0, ¶chain_head.encode())
|
||||
let leaf_data = if i == 0 {
|
||||
grow_trie_leaf_value(parachain_head.encode(), size)
|
||||
} else {
|
||||
parachain_head.encode()
|
||||
};
|
||||
trie.insert(&storage_key.0, &leaf_data)
|
||||
.map_err(|_| "TrieMut::insert has failed")
|
||||
.expect("TrieMut::insert should not fail in benchmarks");
|
||||
storage_keys.push(storage_key);
|
||||
parachain_heads.push((*parachain, parachain_head.hash()))
|
||||
}
|
||||
}
|
||||
state_root = grow_trie(state_root, &mut mdb, size);
|
||||
|
||||
// generate heads storage proof
|
||||
let proof = record_all_trie_keys::<LayoutV1<RelayBlockHasher>, _>(&mdb, &state_root)
|
||||
|
||||
Reference in New Issue
Block a user