1
+ pub mod ecrecover;
2
+ pub mod eip1962;
1
3
pub mod eip2537;
4
+ pub mod eip4844;
2
5
3
6
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 } ;
17
7
18
8
/// Benchmarks different cryptography-related precompiles.
19
9
pub fn benchmark_crypto_precompiles ( c : & mut Criterion ) {
20
10
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) ;
126
11
12
+ // Run BLS12-381 benchmarks (EIP-2537)
127
13
eip2537:: add_g1_add_benches ( & mut group) ;
128
14
eip2537:: add_g2_add_benches ( & mut group) ;
129
15
eip2537:: add_g1_msm_benches ( & mut group) ;
@@ -132,33 +18,16 @@ pub fn benchmark_crypto_precompiles(c: &mut Criterion) {
132
18
eip2537:: add_map_fp_to_g1_benches ( & mut group) ;
133
19
eip2537:: add_map_fp2_to_g2_benches ( & mut group) ;
134
20
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) ;
146
25
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) ;
158
28
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) ;
162
31
}
163
32
164
33
criterion_group ! {
0 commit comments