@@ -16,9 +16,7 @@ use openvm_bigint_circuit::{Int256, Int256CpuProverExt, Int256Executor};
16
16
use openvm_bigint_transpiler:: Int256TranspilerExtension ;
17
17
use openvm_circuit:: {
18
18
arch:: {
19
- execution_mode:: { MeteredCostCtx , MeteredCtx } ,
20
- instructions:: exe:: VmExe ,
21
- interpreter:: InterpretedInstance ,
19
+ execution_mode:: MeteredCostCtx , instructions:: exe:: VmExe , interpreter:: InterpretedInstance ,
22
20
ContinuationVmProof , * ,
23
21
} ,
24
22
derive:: VmConfig ,
@@ -57,6 +55,7 @@ use openvm_stark_sdk::{
57
55
openvm_stark_backend:: {
58
56
self ,
59
57
config:: { StarkGenericConfig , Val } ,
58
+ keygen:: types:: MultiStarkProvingKey ,
60
59
p3_field:: PrimeField32 ,
61
60
proof:: Proof ,
62
61
prover:: {
@@ -86,7 +85,7 @@ const APP_PROGRAMS: &[&str] = &[
86
85
const LEAF_VERIFIER_PROGRAMS : & [ & str ] = & [ "kitchen-sink" ] ;
87
86
const INTERNAL_VERIFIER_PROGRAMS : & [ & str ] = & [ "fibonacci" ] ;
88
87
89
- static METERED_CTX : OnceLock < ( MeteredCtx , Vec < usize > ) > = OnceLock :: new ( ) ;
88
+ static VM_PROVING_KEY : OnceLock < MultiStarkProvingKey < SC > > = OnceLock :: new ( ) ;
90
89
static METERED_COST_CTX : OnceLock < ( MeteredCostCtx , Vec < usize > ) > = OnceLock :: new ( ) ;
91
90
static EXECUTOR : OnceLock < VmExecutor < BabyBear , ExecuteConfig > > = OnceLock :: new ( ) ;
92
91
@@ -231,22 +230,22 @@ fn load_program_executable(program: &str) -> Result<VmExe<BabyBear>> {
231
230
Ok ( VmExe :: from_elf ( elf, transpiler) ?)
232
231
}
233
232
234
- fn metering_setup ( ) -> & ' static ( MeteredCtx , Vec < usize > ) {
235
- METERED_CTX . get_or_init ( || {
233
+ fn vm_proving_key ( ) -> & ' static MultiStarkProvingKey < SC > {
234
+ VM_PROVING_KEY . get_or_init ( || {
236
235
let config = ExecuteConfig :: default ( ) ;
237
236
let engine = BabyBearPoseidon2Engine :: new ( FriParameters :: standard_fast ( ) ) ;
238
- let ( vm, _) = VirtualMachine :: new_with_keygen ( engine, ExecuteBuilder , config) . unwrap ( ) ;
239
- let ctx = vm. build_metered_ctx ( ) ;
240
- let executor_idx_to_air_idx = vm. executor_idx_to_air_idx ( ) ;
241
- ( ctx, executor_idx_to_air_idx)
237
+ let circuit = config. create_airs ( ) . expect ( "Failed to create AIRs" ) ;
238
+ circuit. keygen ( & engine)
242
239
} )
243
240
}
244
241
245
242
fn metered_cost_setup ( ) -> & ' static ( MeteredCostCtx , Vec < usize > ) {
246
243
METERED_COST_CTX . get_or_init ( || {
247
244
let config = ExecuteConfig :: default ( ) ;
248
245
let engine = BabyBearPoseidon2Engine :: new ( FriParameters :: standard_fast ( ) ) ;
249
- let ( vm, _) = VirtualMachine :: new_with_keygen ( engine, ExecuteBuilder , config) . unwrap ( ) ;
246
+ let pk = vm_proving_key ( ) ;
247
+ let d_pk = engine. device ( ) . transport_pk_to_device ( pk) ;
248
+ let vm = VirtualMachine :: new ( engine, ExecuteBuilder , config, d_pk) . unwrap ( ) ;
250
249
let ctx = vm. build_metered_cost_ctx ( ) ;
251
250
let executor_idx_to_air_idx = vm. executor_idx_to_air_idx ( ) ;
252
251
( ctx, executor_idx_to_air_idx)
@@ -280,9 +279,16 @@ fn benchmark_execute_metered(bencher: Bencher, program: &str) {
280
279
bencher
281
280
. with_inputs ( || {
282
281
let exe = load_program_executable ( program) . expect ( "Failed to load program executable" ) ;
283
- let ( ctx, executor_idx_to_air_idx) = metering_setup ( ) ;
282
+ let config = ExecuteConfig :: default ( ) ;
283
+ let engine = BabyBearPoseidon2Engine :: new ( FriParameters :: standard_fast ( ) ) ;
284
+ let pk = vm_proving_key ( ) ;
285
+ let d_pk = engine. device ( ) . transport_pk_to_device ( pk) ;
286
+ let vm = VirtualMachine :: new ( engine, ExecuteBuilder , config, d_pk) . unwrap ( ) ;
287
+ let executor_idx_to_air_idx = vm. executor_idx_to_air_idx ( ) ;
288
+
289
+ let ctx = vm. build_metered_ctx ( & exe) ;
284
290
let interpreter = executor ( )
285
- . metered_instance ( & exe, executor_idx_to_air_idx)
291
+ . metered_instance ( & exe, & executor_idx_to_air_idx)
286
292
. unwrap ( ) ;
287
293
( interpreter, vec ! [ ] , ctx. clone ( ) )
288
294
} )
@@ -403,7 +409,7 @@ fn benchmark_leaf_verifier_execute_metered(bencher: Bencher, program: &str) {
403
409
bencher
404
410
. with_inputs ( || {
405
411
let ( vm, leaf_exe, input_stream) = setup_leaf_verifier ( program) ;
406
- let ctx = vm. build_metered_ctx ( ) ;
412
+ let ctx = vm. build_metered_ctx ( & leaf_exe ) ;
407
413
let executor_idx_to_air_idx = vm. executor_idx_to_air_idx ( ) ;
408
414
let interpreter = vm
409
415
. executor ( )
@@ -459,7 +465,7 @@ fn benchmark_internal_verifier_execute_metered(bencher: Bencher, program: &str)
459
465
bencher
460
466
. with_inputs ( || {
461
467
let ( vm, internal_exe, input_stream) = setup_internal_verifier ( program) ;
462
- let ctx = vm. build_metered_ctx ( ) ;
468
+ let ctx = vm. build_metered_ctx ( & internal_exe ) ;
463
469
let executor_idx_to_air_idx = vm. executor_idx_to_air_idx ( ) ;
464
470
let interpreter = vm
465
471
. executor ( )
0 commit comments