Skip to content

Commit e4506f0

Browse files
committed
organization -- move all benchmarks into their own module
1 parent d8291d7 commit e4506f0

File tree

4 files changed

+135
-143
lines changed

4 files changed

+135
-143
lines changed

crates/precompile/benches/bench.rs

Lines changed: 12 additions & 143 deletions
Original file line numberDiff line numberDiff line change
@@ -1,129 +1,15 @@
1+
pub mod ecrecover;
2+
pub mod eip1962;
13
pub mod eip2537;
4+
pub mod eip4844;
25

36
use criterion::{criterion_group, criterion_main, Criterion};
4-
use primitives::{eip4844::VERSIONED_HASH_VERSION_KZG, hex, keccak256, Bytes, U256};
5-
use revm_precompile::{
6-
bn128::{
7-
add::ISTANBUL_ADD_GAS_COST,
8-
mul::ISTANBUL_MUL_GAS_COST,
9-
pair::{ISTANBUL_PAIR_BASE, ISTANBUL_PAIR_PER_POINT},
10-
run_add, run_mul, run_pair,
11-
},
12-
kzg_point_evaluation::run,
13-
secp256k1::ec_recover_run,
14-
};
15-
use secp256k1::{Message, SecretKey, SECP256K1};
16-
use sha2::{Digest, Sha256};
177

188
/// Benchmarks different cryptography-related precompiles.
199
pub fn benchmark_crypto_precompiles(c: &mut Criterion) {
2010
let mut group = c.benchmark_group("Crypto Precompile benchmarks");
21-
let group_name = |description: &str| format!("precompile bench | {description}");
22-
23-
// === ECPAIRING ===
24-
25-
// Set up ecpairing input
26-
let input = hex::decode(
27-
"\
28-
1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f59\
29-
3034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41\
30-
209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf7\
31-
04bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a41678\
32-
2bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d\
33-
120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550\
34-
111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c\
35-
2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411\
36-
198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2\
37-
1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed\
38-
090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b\
39-
12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa",
40-
)
41-
.unwrap();
42-
43-
let res = run_pair(
44-
&input,
45-
ISTANBUL_PAIR_PER_POINT,
46-
ISTANBUL_PAIR_BASE,
47-
u64::MAX,
48-
)
49-
.unwrap()
50-
.gas_used;
51-
52-
println!("gas used by regular pairing call: {:?}", res);
53-
54-
// === BN128 ADD ===
55-
56-
let ecadd_input = hex::decode(
57-
"\
58-
18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9\
59-
063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266\
60-
07c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a014eed\
61-
06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7",
62-
)
63-
.unwrap();
64-
65-
let res = run_add(&ecadd_input, ISTANBUL_ADD_GAS_COST, 150)
66-
.unwrap()
67-
.gas_used;
68-
println!("gas used by bn128 add precompile: {:?}", res);
69-
70-
// === BN128 MUL ===
71-
72-
let ecmul_input = hex::decode(
73-
"\
74-
18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9\
75-
063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266\
76-
06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7",
77-
)
78-
.unwrap();
79-
80-
let res = run_mul(&ecmul_input, ISTANBUL_MUL_GAS_COST, 6000)
81-
.unwrap()
82-
.gas_used;
83-
println!("gas used by bn128 mul precompile: {:?}", res);
84-
85-
// === ECRECOVER ===
86-
87-
// Generate secp256k1 signature
88-
let data = hex::decode("1337133713371337").unwrap();
89-
let hash = keccak256(data);
90-
let secret_key = SecretKey::new(&mut rand::thread_rng());
91-
92-
let message = Message::from_digest_slice(&hash[..]).unwrap();
93-
let s = SECP256K1.sign_ecdsa_recoverable(&message, &secret_key);
94-
let (rec_id, data) = s.serialize_compact();
95-
let rec_id = i32::from(rec_id) as u8 + 27;
96-
97-
let mut message_and_signature = [0u8; 128];
98-
message_and_signature[0..32].copy_from_slice(&hash[..]);
99-
100-
// Fit signature into format the precompile expects
101-
let rec_id = U256::from(rec_id as u64);
102-
message_and_signature[32..64].copy_from_slice(&rec_id.to_be_bytes::<32>());
103-
message_and_signature[64..128].copy_from_slice(&data);
104-
105-
let message_and_signature = Bytes::from(message_and_signature);
106-
let gas = ec_recover_run(&message_and_signature, u64::MAX)
107-
.unwrap()
108-
.gas_used;
109-
println!("gas used by ecrecover precompile: {:?}", gas);
110-
111-
// === POINT_EVALUATION ===
112-
113-
// Now check kzg precompile gas
114-
let commitment = hex!("8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7").to_vec();
115-
let mut versioned_hash = Sha256::digest(&commitment).to_vec();
116-
versioned_hash[0] = VERSIONED_HASH_VERSION_KZG;
117-
let z = hex!("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000").to_vec();
118-
let y = hex!("1522a4a7f34e1ea350ae07c29c96c7e79655aa926122e95fe69fcbd932ca49e9").to_vec();
119-
let proof = hex!("a62ad71d14c5719385c0686f1871430475bf3a00f0aa3f7b8dd99a9abc2160744faf0070725e00b60ad9a026a15b1a8c").to_vec();
120-
121-
let kzg_input = [versioned_hash, z, y, commitment, proof].concat().into();
122-
123-
let gas = 50000;
124-
let output = run(&kzg_input, gas).unwrap();
125-
println!("gas used by kzg precompile: {:?}", output.gas_used);
12611

12+
// Run BLS12-381 benchmarks (EIP-2537)
12713
eip2537::add_g1_add_benches(&mut group);
12814
eip2537::add_g2_add_benches(&mut group);
12915
eip2537::add_g1_msm_benches(&mut group);
@@ -132,33 +18,16 @@ pub fn benchmark_crypto_precompiles(c: &mut Criterion) {
13218
eip2537::add_map_fp_to_g1_benches(&mut group);
13319
eip2537::add_map_fp2_to_g2_benches(&mut group);
13420

135-
group.bench_function(group_name("ecrecover precompile"), |b| {
136-
b.iter(|| ec_recover_run(&message_and_signature, u64::MAX).unwrap())
137-
});
138-
139-
group.bench_function(group_name("bn128 add precompile"), |b| {
140-
b.iter(|| run_add(&ecadd_input, ISTANBUL_ADD_GAS_COST, 150).unwrap())
141-
});
142-
143-
group.bench_function(group_name("bn128 mul precompile"), |b| {
144-
b.iter(|| run_mul(&ecmul_input, ISTANBUL_MUL_GAS_COST, 6000).unwrap())
145-
});
21+
// Run BN128 benchmarks
22+
eip1962::add_bn128_add_benches(&mut group);
23+
eip1962::add_bn128_mul_benches(&mut group);
24+
eip1962::add_bn128_pair_benches(&mut group);
14625

147-
group.bench_function(group_name("ecpairing precompile"), |b| {
148-
b.iter(|| {
149-
run_pair(
150-
&input,
151-
ISTANBUL_PAIR_PER_POINT,
152-
ISTANBUL_PAIR_BASE,
153-
u64::MAX,
154-
)
155-
.unwrap()
156-
})
157-
});
26+
// Run secp256k1 benchmarks
27+
ecrecover::add_benches(&mut group);
15828

159-
group.bench_function(group_name("kzg precompile"), |b| {
160-
b.iter(|| run(&kzg_input, gas).unwrap())
161-
});
29+
// Run KZG point evaluation benchmarks
30+
eip4844::add_benches(&mut group);
16231
}
16332

16433
criterion_group! {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use criterion::{measurement::Measurement, BenchmarkGroup};
2+
use primitives::{hex, keccak256, Bytes, U256};
3+
use revm_precompile::secp256k1::ec_recover_run;
4+
use secp256k1::{Message, SecretKey, SECP256K1};
5+
6+
pub fn add_benches<M: Measurement>(group: &mut BenchmarkGroup<'_, M>) {
7+
// Generate secp256k1 signature
8+
let data = hex::decode("1337133713371337").unwrap();
9+
let hash = keccak256(data);
10+
let secret_key = SecretKey::new(&mut rand::thread_rng());
11+
12+
let message = Message::from_digest_slice(&hash[..]).unwrap();
13+
let s = SECP256K1.sign_ecdsa_recoverable(&message, &secret_key);
14+
let (rec_id, data) = s.serialize_compact();
15+
let rec_id = i32::from(rec_id) as u8 + 27;
16+
17+
let mut message_and_signature = [0u8; 128];
18+
message_and_signature[0..32].copy_from_slice(&hash[..]);
19+
20+
// Fit signature into format the precompile expects
21+
let rec_id = U256::from(rec_id as u64);
22+
message_and_signature[32..64].copy_from_slice(&rec_id.to_be_bytes::<32>());
23+
message_and_signature[64..128].copy_from_slice(&data);
24+
25+
let message_and_signature = Bytes::from(message_and_signature);
26+
27+
group.bench_function("ecrecover precompile", |b| {
28+
b.iter(|| ec_recover_run(&message_and_signature, u64::MAX).unwrap())
29+
});
30+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
use criterion::{measurement::Measurement, BenchmarkGroup};
2+
use primitives::hex;
3+
use primitives::Bytes;
4+
use revm_precompile::bn128::{
5+
add::ISTANBUL_ADD_GAS_COST,
6+
mul::ISTANBUL_MUL_GAS_COST,
7+
pair::{ISTANBUL_PAIR_BASE, ISTANBUL_PAIR_PER_POINT},
8+
run_add, run_mul, run_pair,
9+
};
10+
11+
pub fn add_bn128_add_benches<M: Measurement>(group: &mut BenchmarkGroup<'_, M>) {
12+
let ecadd_input = hex::decode(
13+
"\
14+
18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9\
15+
063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266\
16+
07c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a014eed\
17+
06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7",
18+
)
19+
.unwrap();
20+
let input = Bytes::from(ecadd_input);
21+
22+
group.bench_function("bn128 add precompile", |b| {
23+
b.iter(|| run_add(&input, ISTANBUL_ADD_GAS_COST, 150).unwrap())
24+
});
25+
}
26+
27+
pub fn add_bn128_mul_benches<M: Measurement>(group: &mut BenchmarkGroup<'_, M>) {
28+
let ecmul_input = hex::decode(
29+
"\
30+
18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9\
31+
063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266\
32+
06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7",
33+
)
34+
.unwrap();
35+
let input = Bytes::from(ecmul_input);
36+
37+
group.bench_function("bn128 mul precompile", |b| {
38+
b.iter(|| run_mul(&input, ISTANBUL_MUL_GAS_COST, 6000).unwrap())
39+
});
40+
}
41+
42+
pub fn add_bn128_pair_benches<M: Measurement>(group: &mut BenchmarkGroup<'_, M>) {
43+
let ecpair_input = hex::decode(
44+
"\
45+
1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f59\
46+
3034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41\
47+
209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf7\
48+
04bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a41678\
49+
2bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d\
50+
120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550\
51+
111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c\
52+
2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411\
53+
198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2\
54+
1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed\
55+
090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b\
56+
12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa",
57+
)
58+
.unwrap();
59+
let input = Bytes::from(ecpair_input);
60+
61+
group.bench_function("ecpairing precompile", |b| {
62+
b.iter(|| {
63+
run_pair(
64+
&input,
65+
ISTANBUL_PAIR_PER_POINT,
66+
ISTANBUL_PAIR_BASE,
67+
u64::MAX,
68+
)
69+
.unwrap()
70+
})
71+
});
72+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use criterion::{measurement::Measurement, BenchmarkGroup};
2+
use primitives::{eip4844::VERSIONED_HASH_VERSION_KZG, hex};
3+
use revm_precompile::kzg_point_evaluation::run;
4+
use sha2::{Digest, Sha256};
5+
6+
pub fn add_benches<M: Measurement>(group: &mut BenchmarkGroup<'_, M>) {
7+
// KZG Point Evaluation Precompile
8+
let commitment = hex!("8f59a8d2a1a625a17f3fea0fe5eb8c896db3764f3185481bc22f91b4aaffcca25f26936857bc3a7c2539ea8ec3a952b7").to_vec();
9+
let mut versioned_hash = Sha256::digest(&commitment).to_vec();
10+
versioned_hash[0] = VERSIONED_HASH_VERSION_KZG;
11+
let z = hex!("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000").to_vec();
12+
let y = hex!("1522a4a7f34e1ea350ae07c29c96c7e79655aa926122e95fe69fcbd932ca49e9").to_vec();
13+
let proof = hex!("a62ad71d14c5719385c0686f1871430475bf3a00f0aa3f7b8dd99a9abc2160744faf0070725e00b60ad9a026a15b1a8c").to_vec();
14+
15+
let kzg_input = [versioned_hash, z, y, commitment, proof].concat().into();
16+
let gas = 50000;
17+
18+
group.bench_function("kzg precompile", |b| {
19+
b.iter(|| run(&kzg_input, gas).unwrap())
20+
});
21+
}

0 commit comments

Comments
 (0)