openvm_verify_stark_circuit/prover/
trace.rs

1use std::iter::once;
2
3use itertools::Itertools;
4use openvm_circuit::{
5    arch::POSEIDON2_WIDTH, system::memory::merkle::public_values::UserPublicValuesProof,
6};
7use openvm_continuations::{circuit::deferral::DeferralMerkleProofs, SC};
8use openvm_recursion_circuit::system::{
9    AggregationSubCircuit, CachedTraceCtx, VerifierExternalData, VerifierTraceGen,
10};
11use openvm_stark_backend::{
12    proof::Proof,
13    prover::{ProverBackend, ProvingContext},
14};
15use openvm_stark_sdk::config::baby_bear_poseidon2::{
16    default_duplex_sponge_recorder, Digest, DIGEST_SIZE, EF, F,
17};
18use p3_field::PrimeCharacteristicRing;
19use tracing::instrument;
20
21use crate::{prover::DeferredVerifyProver, DeferredVerifyTraceGen, PreVerifierData};
22
23impl<PB, S, T> DeferredVerifyProver<PB, S, T>
24where
25    PB: ProverBackend<Val = F, Challenge = EF, Commitment = Digest>,
26    S: AggregationSubCircuit,
27    PB::Matrix: Clone,
28{
29    #[instrument(name = "trace_gen", skip_all)]
30    pub fn generate_proving_ctx<DC>(
31        &self,
32        proof: Proof<SC>,
33        user_pvs_proof: &UserPublicValuesProof<DIGEST_SIZE, PB::Val>,
34        deferral_merkle_proofs: Option<&DeferralMerkleProofs<PB::Val>>,
35        device_ctx: &DC,
36    ) -> ProvingContext<PB>
37    where
38        S: AggregationSubCircuit + VerifierTraceGen<PB, SC, DC>,
39        T: DeferredVerifyTraceGen<PB, DC>,
40        DC: Clone + Send + Sync,
41    {
42        assert_eq!(
43            user_pvs_proof.public_values.len(),
44            self.circuit.num_user_pvs
45        );
46
47        let PreVerifierData {
48            pre_verifier_ctxs,
49            post_verifier_ctxs,
50            poseidon2_compress_inputs,
51            poseidon2_permute_inputs,
52            range_inputs,
53            verifier_pvs_record,
54            output_commit,
55        } = self.agg_node_tracegen.pre_verifier_subcircuit_tracegen(
56            &proof,
57            user_pvs_proof,
58            self.circuit.memory_dimensions,
59            self.circuit.def_idx,
60            deferral_merkle_proofs,
61            device_ctx,
62        );
63
64        let power_check_inputs = vec![];
65        let mut final_transcript_state = [F::ZERO; POSEIDON2_WIDTH];
66        let mut external_data = VerifierExternalData {
67            poseidon2_compress_inputs: &poseidon2_compress_inputs,
68            poseidon2_permute_inputs: &poseidon2_permute_inputs,
69            range_check_inputs: &range_inputs,
70            power_check_inputs: &power_check_inputs,
71            required_heights: None,
72            final_transcript_state: Some(&mut final_transcript_state),
73        };
74
75        let proof_slice = &[proof];
76        let subcircuit_ctxs = self
77            .circuit
78            .verifier_circuit
79            .generate_proving_ctxs(
80                &self.child_vk,
81                CachedTraceCtx::PcsData(self.child_vk_pcs_data.clone()),
82                proof_slice,
83                &mut external_data,
84                device_ctx,
85                default_duplex_sponge_recorder(),
86            )
87            .unwrap();
88
89        let verifier_pvs_ctx = self.agg_node_tracegen.generate_verifier_pvs_ctx(
90            &proof_slice[0],
91            verifier_pvs_record,
92            final_transcript_state,
93            output_commit,
94            self.circuit.def_idx,
95            device_ctx,
96        );
97
98        ProvingContext {
99            per_trace: once(verifier_pvs_ctx)
100                .chain(pre_verifier_ctxs)
101                .chain(subcircuit_ctxs)
102                .chain(post_verifier_ctxs)
103                .enumerate()
104                .collect_vec(),
105        }
106    }
107}