openvm_continuations/prover/deferral/hook/
trace.rs1use std::iter::once;
2
3use itertools::Itertools;
4use openvm_recursion_circuit::system::{
5 AggregationSubCircuit, CachedTraceCtx, VerifierExternalData, VerifierTraceGen,
6};
7use openvm_stark_backend::{
8 proof::Proof,
9 prover::{ProverBackend, ProvingContext},
10};
11use openvm_stark_sdk::config::baby_bear_poseidon2::{
12 default_duplex_sponge_recorder, Digest, EF, F,
13};
14use tracing::instrument;
15
16use super::DeferralHookProver;
17use crate::{
18 circuit::deferral::hook::{DeferralHookPreCtx, DeferralHookTraceGen, DeferralIoCommit},
19 SC,
20};
21
22impl<PB, S, T> DeferralHookProver<PB, S, T>
23where
24 PB: ProverBackend<Val = F, Challenge = EF, Commitment = Digest>,
25 S: AggregationSubCircuit,
26 PB::Matrix: Clone,
27{
28 #[instrument(name = "trace_gen", skip_all)]
29 pub fn generate_proving_ctx<DC>(
30 &self,
31 proof: Proof<SC>,
32 leaf_children: Vec<DeferralIoCommit<F>>,
33 device_ctx: &DC,
34 ) -> ProvingContext<PB>
35 where
36 S: VerifierTraceGen<PB, SC, DC>,
37 T: DeferralHookTraceGen<PB, DC>,
38 DC: Clone + Send + Sync,
39 {
40 let DeferralHookPreCtx {
41 verifier_pvs_ctx,
42 decommit_ctx,
43 onion_ctx,
44 poseidon2_compress_inputs,
45 poseidon2_permute_inputs,
46 range_check_inputs,
47 power_check_inputs,
48 } = self.agg_node_tracegen.pre_verifier_subcircuit_tracegen(
49 &proof,
50 leaf_children,
51 device_ctx,
52 );
53
54 let mut external_data = VerifierExternalData {
55 poseidon2_compress_inputs: &poseidon2_compress_inputs,
56 poseidon2_permute_inputs: &poseidon2_permute_inputs,
57 range_check_inputs: &range_check_inputs,
58 power_check_inputs: &power_check_inputs,
59 required_heights: None,
60 final_transcript_state: None,
61 };
62
63 let proof_slice = &[proof];
64 let subcircuit_ctxs = self
65 .circuit
66 .verifier_circuit
67 .generate_proving_ctxs(
68 &self.child_vk,
69 CachedTraceCtx::PcsData(self.child_vk_pcs_data.clone()),
70 proof_slice,
71 &mut external_data,
72 device_ctx,
73 default_duplex_sponge_recorder(),
74 )
75 .unwrap();
76
77 ProvingContext {
78 per_trace: once(verifier_pvs_ctx)
79 .chain(once(decommit_ctx))
80 .chain(once(onion_ctx))
81 .chain(subcircuit_ctxs)
82 .enumerate()
83 .collect_vec(),
84 }
85 }
86}