openvm_continuations/prover/deferral/hook/
trace.rs

1use 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}