From e305cf0bd323005899a189e46307f480bd739b4e Mon Sep 17 00:00:00 2001 From: Zeke Mostov Date: Mon, 6 Dec 2021 13:31:16 -0800 Subject: [PATCH] Add baseline benchmark for sr25519 verification (#10414) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add baseline benchmark for sr25519 verification * cargo run --quiet --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=frame_benchmarking --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/benchmarking/src/weights.rs --template=./.maintain/frame-weight-template.hbs * Register keystore for correct test externalities * Update frame/benchmarking/src/baseline.rs Co-authored-by: Bastian Köcher * fix build Co-authored-by: Parity Bot Co-authored-by: Bastian Köcher --- Cargo.lock | 2 ++ frame/benchmarking/Cargo.toml | 2 ++ frame/benchmarking/src/baseline.rs | 41 +++++++++++++++++++++-- frame/benchmarking/src/weights.rs | 54 +++++++++++++++++++----------- 4 files changed, 77 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d277db3f519b9..d67ebd7f24ddf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1958,7 +1958,9 @@ dependencies = [ "paste 1.0.6", "scale-info", "sp-api", + "sp-application-crypto", "sp-io", + "sp-keystore", "sp-runtime", "sp-runtime-interface", "sp-std", diff --git a/frame/benchmarking/Cargo.toml b/frame/benchmarking/Cargo.toml index 2bf4a53b0f424..4160f040c3bcb 100644 --- a/frame/benchmarking/Cargo.toml +++ b/frame/benchmarking/Cargo.toml @@ -22,6 +22,7 @@ sp-runtime-interface = { version = "4.0.0-dev", path = "../../primitives/runtime sp-runtime = { version = "4.0.0-dev", path = "../../primitives/runtime", default-features = false } sp-std = { version = "4.0.0-dev", path = "../../primitives/std", default-features = false } sp-io = { version = "4.0.0-dev", path = "../../primitives/io", default-features = false } +sp-application-crypto = { version = "4.0.0-dev", path = "../../primitives/application-crypto", default-features = false } sp-storage = { version = "4.0.0-dev", path = "../../primitives/storage", default-features = false } frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" } frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" } @@ -29,6 +30,7 @@ log = { version = "0.4.14", default-features = false } [dev-dependencies] hex-literal = "0.3.4" +sp-keystore = { version = "0.10.0-dev", path = "../../primitives/keystore" } [features] default = ["std"] diff --git a/frame/benchmarking/src/baseline.rs b/frame/benchmarking/src/baseline.rs index 2b924a692129a..87cdf80409b89 100644 --- a/frame/benchmarking/src/baseline.rs +++ b/frame/benchmarking/src/baseline.rs @@ -23,9 +23,23 @@ use crate::benchmarks; use codec::Encode; use frame_system::Pallet as System; -use sp_runtime::traits::Hash; +use sp_application_crypto::KeyTypeId; +use sp_runtime::{ + traits::{AppVerify, Hash}, + RuntimeAppPublic, +}; use sp_std::prelude::*; +pub const TEST_KEY_TYPE_ID: KeyTypeId = KeyTypeId(*b"test"); + +mod app_sr25519 { + use super::TEST_KEY_TYPE_ID; + use sp_application_crypto::{app_crypto, sr25519}; + app_crypto!(sr25519, TEST_KEY_TYPE_ID); +} + +type SignerId = app_sr25519::Public; + pub struct Pallet(System); pub trait Config: frame_system::Config {} @@ -75,6 +89,23 @@ benchmarks! { assert!(hash != T::Hash::default()); } + sr25519_verification { + let i in 1 .. 100; + + let public = SignerId::generate_pair(None); + + let sigs_count: u8 = i.try_into().unwrap(); + let msg_and_sigs: Vec<_> = (0..sigs_count).map(|j| { + let msg = vec![j, j]; + (msg.clone(), public.sign(&msg).unwrap()) + }) + .collect(); + }: { + msg_and_sigs.iter().for_each(|(msg, sig)| { + assert!(sig.verify(&msg[..], &public)); + }); + } + #[skip_meta] storage_read { let i in 0 .. 1_000; @@ -169,7 +200,13 @@ pub mod mock { impl super::Config for Test {} pub fn new_test_ext() -> sp_io::TestExternalities { + use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStorePtr}; + use sp_std::sync::Arc; + let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); - sp_io::TestExternalities::new(t) + let mut ext = sp_io::TestExternalities::new(t); + ext.register_extension(KeystoreExt(Arc::new(KeyStore::new()) as SyncCryptoStorePtr)); + + ext } } diff --git a/frame/benchmarking/src/weights.rs b/frame/benchmarking/src/weights.rs index 807ff697fdcaa..af0a782e6b2c5 100644 --- a/frame/benchmarking/src/weights.rs +++ b/frame/benchmarking/src/weights.rs @@ -18,7 +18,7 @@ //! Autogenerated weights for frame_benchmarking //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2021-10-30, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2021-12-02, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 128 // Executed Command: @@ -35,7 +35,6 @@ // --output=./frame/benchmarking/src/weights.rs // --template=./.maintain/frame-weight-template.hbs - #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] @@ -50,6 +49,7 @@ pub trait WeightInfo { fn multiplication(i: u32, ) -> Weight; fn division(i: u32, ) -> Weight; fn hashing(i: u32, ) -> Weight; + fn sr25519_verification(i: u32, ) -> Weight; fn storage_read(i: u32, ) -> Weight; fn storage_write(i: u32, ) -> Weight; } @@ -58,32 +58,39 @@ pub trait WeightInfo { pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { fn addition(_i: u32, ) -> Weight { - (337_000 as Weight) + (284_000 as Weight) } fn subtraction(_i: u32, ) -> Weight { - (343_000 as Weight) + (279_000 as Weight) } fn multiplication(_i: u32, ) -> Weight { - (340_000 as Weight) + (278_000 as Weight) } fn division(_i: u32, ) -> Weight { - (346_000 as Weight) + (274_000 as Weight) + } + fn hashing(i: u32, ) -> Weight { + (33_441_957_000 as Weight) + // Standard Error: 535_000 + .saturating_add((363_000 as Weight).saturating_mul(i as Weight)) } - fn hashing(_i: u32, ) -> Weight { - (35_449_143_000 as Weight) + fn sr25519_verification(i: u32, ) -> Weight { + (26_000 as Weight) + // Standard Error: 14_000 + .saturating_add((48_151_000 as Weight).saturating_mul(i as Weight)) } // Storage: Skipped Metadata (r:0 w:0) fn storage_read(i: u32, ) -> Weight { (0 as Weight) - // Standard Error: 3_000 - .saturating_add((2_851_000 as Weight).saturating_mul(i as Weight)) + // Standard Error: 4_000 + .saturating_add((2_694_000 as Weight).saturating_mul(i as Weight)) .saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) } // Storage: Skipped Metadata (r:0 w:0) fn storage_write(i: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((662_000 as Weight).saturating_mul(i as Weight)) + .saturating_add((606_000 as Weight).saturating_mul(i as Weight)) .saturating_add(T::DbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } } @@ -91,32 +98,39 @@ impl WeightInfo for SubstrateWeight { // For backwards compatibility and tests impl WeightInfo for () { fn addition(_i: u32, ) -> Weight { - (337_000 as Weight) + (284_000 as Weight) } fn subtraction(_i: u32, ) -> Weight { - (343_000 as Weight) + (279_000 as Weight) } fn multiplication(_i: u32, ) -> Weight { - (340_000 as Weight) + (278_000 as Weight) } fn division(_i: u32, ) -> Weight { - (346_000 as Weight) + (274_000 as Weight) + } + fn hashing(i: u32, ) -> Weight { + (33_441_957_000 as Weight) + // Standard Error: 535_000 + .saturating_add((363_000 as Weight).saturating_mul(i as Weight)) } - fn hashing(_i: u32, ) -> Weight { - (35_449_143_000 as Weight) + fn sr25519_verification(i: u32, ) -> Weight { + (26_000 as Weight) + // Standard Error: 14_000 + .saturating_add((48_151_000 as Weight).saturating_mul(i as Weight)) } // Storage: Skipped Metadata (r:0 w:0) fn storage_read(i: u32, ) -> Weight { (0 as Weight) - // Standard Error: 3_000 - .saturating_add((2_851_000 as Weight).saturating_mul(i as Weight)) + // Standard Error: 4_000 + .saturating_add((2_694_000 as Weight).saturating_mul(i as Weight)) .saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(i as Weight))) } // Storage: Skipped Metadata (r:0 w:0) fn storage_write(i: u32, ) -> Weight { (0 as Weight) // Standard Error: 0 - .saturating_add((662_000 as Weight).saturating_mul(i as Weight)) + .saturating_add((606_000 as Weight).saturating_mul(i as Weight)) .saturating_add(RocksDbWeight::get().writes((1 as Weight).saturating_mul(i as Weight))) } }