Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Add baseline benchmark for sr25519 verification #10414

Merged
merged 6 commits into from
Dec 6, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions frame/benchmarking/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@ 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" }
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"]
Expand Down
36 changes: 35 additions & 1 deletion frame/benchmarking/src/baseline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<T: Config>(System<T>);
pub trait Config: frame_system::Config {}

Expand Down Expand Up @@ -75,6 +89,26 @@ 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_eq!(
sig.verify(&msg[..], &public),
true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would be good to verify that this is exactly what we want to measure versus a batch signature verification?

Copy link
Contributor Author

@emostov emostov Dec 2, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sounds good then

);
emostov marked this conversation as resolved.
Show resolved Hide resolved
});
}

#[skip_meta]
storage_read {
let i in 0 .. 1_000;
Expand Down
9 changes: 8 additions & 1 deletion frame/benchmarking/src/tests_instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,14 @@ impl pallet_test::OtherConfig for Test {
}

fn new_test_ext() -> sp_io::TestExternalities {
GenesisConfig::default().build_storage().unwrap().into()
use sp_keystore::{testing::KeyStore, KeystoreExt, SyncCryptoStorePtr};
use sp_std::sync::Arc;

let mut ext: sp_io::TestExternalities =
GenesisConfig::default().build_storage().unwrap().into();
ext.register_extension(KeystoreExt(Arc::new(KeyStore::new()) as SyncCryptoStorePtr));

ext
}

mod benchmarks {
Expand Down
54 changes: 34 additions & 20 deletions frame/benchmarking/src/weights.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)]
Expand All @@ -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;
}
Expand All @@ -58,65 +58,79 @@ pub trait WeightInfo {
pub struct SubstrateWeight<T>(PhantomData<T>);
impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
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)))
}
}

// 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)))
}
}