mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-19 17:01:02 +00:00
Benchmark Im Online Pallet (#5318)
* Initial benchmarking setup * Add keystore * validate unsigned * Update frame/im-online/src/benchmarking.rs Co-Authored-By: Marcio Diaz <marcio.diaz@gmail.com> * Fix verify_unsigned benchmark * add variable for teting the external addresss length * Update frame/im-online/src/benchmarking.rs Co-Authored-By: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Update utils/frame/benchmarking-cli/src/lib.rs Co-Authored-By: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Marcio Diaz <marcio.diaz@gmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Benjamin Kampmann <ben@gnunicorn.org> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
Generated
+2
@@ -1449,6 +1449,7 @@ dependencies = [
|
|||||||
"sc-executor",
|
"sc-executor",
|
||||||
"sc-service",
|
"sc-service",
|
||||||
"sp-core",
|
"sp-core",
|
||||||
|
"sp-externalities",
|
||||||
"sp-runtime",
|
"sp-runtime",
|
||||||
"sp-state-machine",
|
"sp-state-machine",
|
||||||
"structopt",
|
"structopt",
|
||||||
@@ -4225,6 +4226,7 @@ dependencies = [
|
|||||||
name = "pallet-im-online"
|
name = "pallet-im-online"
|
||||||
version = "2.0.0-alpha.4"
|
version = "2.0.0-alpha.4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"frame-benchmarking",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"frame-system",
|
"frame-system",
|
||||||
"pallet-authorship",
|
"pallet-authorship",
|
||||||
|
|||||||
@@ -139,4 +139,7 @@ runtime-benchmarks = [
|
|||||||
"pallet-identity/runtime-benchmarks",
|
"pallet-identity/runtime-benchmarks",
|
||||||
"pallet-balances/runtime-benchmarks",
|
"pallet-balances/runtime-benchmarks",
|
||||||
"pallet-vesting/runtime-benchmarks",
|
"pallet-vesting/runtime-benchmarks",
|
||||||
|
"pallet-session-benchmarking",
|
||||||
|
"pallet-staking/runtime-benchmarks",
|
||||||
|
"pallet-im-online/runtime-benchmarks",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -864,6 +864,13 @@ impl_runtime_apis! {
|
|||||||
steps,
|
steps,
|
||||||
repeat,
|
repeat,
|
||||||
),
|
),
|
||||||
|
b"pallet-im-online" | b"im-online" => ImOnline::run_benchmark(
|
||||||
|
extrinsic,
|
||||||
|
lowest_range_values,
|
||||||
|
highest_range_values,
|
||||||
|
steps,
|
||||||
|
repeat,
|
||||||
|
),
|
||||||
b"pallet-identity" | b"identity" => Identity::run_benchmark(
|
b"pallet-identity" | b"identity" => Identity::run_benchmark(
|
||||||
extrinsic,
|
extrinsic,
|
||||||
lowest_range_values,
|
lowest_range_values,
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ sp-staking = { version = "2.0.0-alpha.4", default-features = false, path = "../.
|
|||||||
frame-support = { version = "2.0.0-alpha.4", default-features = false, path = "../support" }
|
frame-support = { version = "2.0.0-alpha.4", default-features = false, path = "../support" }
|
||||||
frame-system = { version = "2.0.0-alpha.4", default-features = false, path = "../system" }
|
frame-system = { version = "2.0.0-alpha.4", default-features = false, path = "../system" }
|
||||||
|
|
||||||
|
frame-benchmarking = { version = "2.0.0-alpha.4", default-features = false, path = "../benchmarking", optional = true }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["std", "pallet-session/historical"]
|
default = ["std", "pallet-session/historical"]
|
||||||
std = [
|
std = [
|
||||||
@@ -38,3 +40,4 @@ std = [
|
|||||||
"frame-support/std",
|
"frame-support/std",
|
||||||
"frame-system/std",
|
"frame-system/std",
|
||||||
]
|
]
|
||||||
|
runtime-benchmarks = ["frame-benchmarking"]
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
// Copyright 2020 Parity Technologies (UK) Ltd.
|
||||||
|
// This file is part of Substrate.
|
||||||
|
|
||||||
|
// Substrate is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
|
||||||
|
// Substrate is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Substrate. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//! I'm Online pallet benchmarking.
|
||||||
|
|
||||||
|
#![cfg(feature = "runtime-benchmarks")]
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
use frame_system::RawOrigin;
|
||||||
|
use frame_benchmarking::benchmarks;
|
||||||
|
use sp_core::offchain::{OpaquePeerId, OpaqueMultiaddr};
|
||||||
|
use sp_runtime::traits::{ValidateUnsigned, Zero};
|
||||||
|
|
||||||
|
use crate::Module as ImOnline;
|
||||||
|
|
||||||
|
const MAX_KEYS: u32 = 1000;
|
||||||
|
const MAX_EXTERNAL_ADDRESSES: u32 = 100;
|
||||||
|
|
||||||
|
pub fn create_heartbeat<T: Trait>(k: u32, e: u32) ->
|
||||||
|
Result<(crate::Heartbeat<T::BlockNumber>, <T::AuthorityId as RuntimeAppPublic>::Signature), &'static str>
|
||||||
|
{
|
||||||
|
let mut keys = Vec::new();
|
||||||
|
for _ in 0..k {
|
||||||
|
keys.push(T::AuthorityId::generate_pair(None));
|
||||||
|
}
|
||||||
|
Keys::<T>::put(keys.clone());
|
||||||
|
|
||||||
|
let network_state = OpaqueNetworkState {
|
||||||
|
peer_id: OpaquePeerId::default(),
|
||||||
|
external_addresses: vec![OpaqueMultiaddr::new(vec![0; 32]); e as usize],
|
||||||
|
};
|
||||||
|
let input_heartbeat = Heartbeat {
|
||||||
|
block_number: T::BlockNumber::zero(),
|
||||||
|
network_state,
|
||||||
|
session_index: 0,
|
||||||
|
authority_index: k-1,
|
||||||
|
};
|
||||||
|
|
||||||
|
let encoded_heartbeat = input_heartbeat.encode();
|
||||||
|
let authority_id = keys.get((k-1) as usize).ok_or("out of range")?;
|
||||||
|
let signature = authority_id.sign(&encoded_heartbeat).ok_or("couldn't make signature")?;
|
||||||
|
|
||||||
|
Ok((input_heartbeat, signature))
|
||||||
|
}
|
||||||
|
|
||||||
|
benchmarks! {
|
||||||
|
_{ }
|
||||||
|
|
||||||
|
heartbeat {
|
||||||
|
let k in 1 .. MAX_KEYS;
|
||||||
|
let e in 1 .. MAX_EXTERNAL_ADDRESSES;
|
||||||
|
let (input_heartbeat, signature) = create_heartbeat::<T>(k, e)?;
|
||||||
|
}: _(RawOrigin::None, input_heartbeat, signature)
|
||||||
|
|
||||||
|
validate_unsigned {
|
||||||
|
let k in 1 .. MAX_KEYS;
|
||||||
|
let e in 1 .. MAX_EXTERNAL_ADDRESSES;
|
||||||
|
let (input_heartbeat, signature) = create_heartbeat::<T>(k, e)?;
|
||||||
|
let call = Call::heartbeat(input_heartbeat, signature);
|
||||||
|
}: {
|
||||||
|
ImOnline::<T>::validate_unsigned(&call)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::*;
|
||||||
|
use super::SelectedBenchmark;
|
||||||
|
use crate::mock::*;
|
||||||
|
use frame_support::assert_ok;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_heartbeat_benchmark() {
|
||||||
|
new_test_ext().execute_with(|| {
|
||||||
|
let k = 10;
|
||||||
|
|
||||||
|
assert_eq!(ReceivedHeartbeats::iter_prefix(0).count(), 0);
|
||||||
|
|
||||||
|
let selected_benchmark = SelectedBenchmark::heartbeat;
|
||||||
|
let c = vec![(frame_benchmarking::BenchmarkParameter::k, k)];
|
||||||
|
let closure_to_benchmark =
|
||||||
|
<SelectedBenchmark as frame_benchmarking::BenchmarkingSetup<Runtime>>::instance(
|
||||||
|
&selected_benchmark,
|
||||||
|
&c
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
assert_ok!(closure_to_benchmark());
|
||||||
|
|
||||||
|
assert_eq!(ReceivedHeartbeats::iter_prefix(0).count(), 1);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_validate_unsigned_benchmark() {
|
||||||
|
new_test_ext().execute_with(|| {
|
||||||
|
let k = 10;
|
||||||
|
|
||||||
|
let selected_benchmark = SelectedBenchmark::validate_unsigned;
|
||||||
|
let c = vec![(frame_benchmarking::BenchmarkParameter::k, k)];
|
||||||
|
let closure_to_benchmark =
|
||||||
|
<SelectedBenchmark as frame_benchmarking::BenchmarkingSetup<Runtime>>::instance(
|
||||||
|
&selected_benchmark,
|
||||||
|
&c
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
assert_ok!(closure_to_benchmark());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -69,6 +69,7 @@
|
|||||||
|
|
||||||
mod mock;
|
mod mock;
|
||||||
mod tests;
|
mod tests;
|
||||||
|
mod benchmarking;
|
||||||
|
|
||||||
use sp_application_crypto::RuntimeAppPublic;
|
use sp_application_crypto::RuntimeAppPublic;
|
||||||
use codec::{Encode, Decode};
|
use codec::{Encode, Decode};
|
||||||
|
|||||||
@@ -1293,6 +1293,16 @@ impl Printable for &str {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Printable for bool {
|
||||||
|
fn print(&self) {
|
||||||
|
if *self {
|
||||||
|
"true".print()
|
||||||
|
} else {
|
||||||
|
"false".print()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[impl_for_tuples(1, 12)]
|
#[impl_for_tuples(1, 12)]
|
||||||
impl Printable for Tuple {
|
impl Printable for Tuple {
|
||||||
fn print(&self) {
|
fn print(&self) {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ sc-cli = { version = "0.8.0-alpha.4", path = "../../../client/cli" }
|
|||||||
sc-client = { version = "0.8.0-alpha.4", path = "../../../client" }
|
sc-client = { version = "0.8.0-alpha.4", path = "../../../client" }
|
||||||
sc-client-db = { version = "0.8.0-alpha.4", path = "../../../client/db" }
|
sc-client-db = { version = "0.8.0-alpha.4", path = "../../../client/db" }
|
||||||
sc-executor = { version = "0.8.0-alpha.4", path = "../../../client/executor" }
|
sc-executor = { version = "0.8.0-alpha.4", path = "../../../client/executor" }
|
||||||
|
sp-externalities = { version = "0.8.0-alpha.4", path = "../../../primitives/externalities" }
|
||||||
sp-runtime = { version = "2.0.0-alpha.4", path = "../../../primitives/runtime" }
|
sp-runtime = { version = "2.0.0-alpha.4", path = "../../../primitives/runtime" }
|
||||||
sp-state-machine = { version = "0.8.0-alpha.4", path = "../../../primitives/state-machine" }
|
sp-state-machine = { version = "0.8.0-alpha.4", path = "../../../primitives/state-machine" }
|
||||||
structopt = "0.3.8"
|
structopt = "0.3.8"
|
||||||
|
|||||||
@@ -23,7 +23,12 @@ use sc_service::{Configuration, ChainSpec};
|
|||||||
use sc_executor::{NativeExecutor, NativeExecutionDispatch};
|
use sc_executor::{NativeExecutor, NativeExecutionDispatch};
|
||||||
use codec::{Encode, Decode};
|
use codec::{Encode, Decode};
|
||||||
use frame_benchmarking::BenchmarkResults;
|
use frame_benchmarking::BenchmarkResults;
|
||||||
use sp_core::tasks;
|
use sp_core::{
|
||||||
|
tasks,
|
||||||
|
traits::KeystoreExt,
|
||||||
|
testing::KeyStore,
|
||||||
|
};
|
||||||
|
use sp_externalities::Extensions;
|
||||||
|
|
||||||
/// The `benchmark` command used to benchmark FRAME Pallets.
|
/// The `benchmark` command used to benchmark FRAME Pallets.
|
||||||
#[derive(Debug, structopt::StructOpt, Clone)]
|
#[derive(Debug, structopt::StructOpt, Clone)]
|
||||||
@@ -106,6 +111,9 @@ impl BenchmarkCmd {
|
|||||||
2, // The runtime instances cache size.
|
2, // The runtime instances cache size.
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let mut extensions = Extensions::default();
|
||||||
|
extensions.register(KeystoreExt(KeyStore::new()));
|
||||||
|
|
||||||
let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
|
let result = StateMachine::<_, _, NumberFor<BB>, _>::new(
|
||||||
&state,
|
&state,
|
||||||
None,
|
None,
|
||||||
@@ -120,7 +128,7 @@ impl BenchmarkCmd {
|
|||||||
self.steps.clone(),
|
self.steps.clone(),
|
||||||
self.repeat,
|
self.repeat,
|
||||||
).encode(),
|
).encode(),
|
||||||
Default::default(),
|
extensions,
|
||||||
&sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
|
&sp_state_machine::backend::BackendRuntimeCode::new(&state).runtime_code()?,
|
||||||
tasks::executor(),
|
tasks::executor(),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user