openvm_native_recursion/fri/
types.rs

1use openvm_native_compiler::prelude::*;
2
3use crate::{digest::DigestVariable, fri::TwoAdicMultiplicativeCosetVariable, vars::HintSlice};
4
5#[derive(Clone)]
6pub struct FriConfigVariable<C: Config> {
7    pub log_blowup: usize,
8    pub blowup: usize,
9    pub log_final_poly_len: usize,
10    pub num_queries: usize,
11    pub proof_of_work_bits: usize,
12    pub generators: Array<C, Felt<C::F>>,
13    pub subgroups: Array<C, TwoAdicMultiplicativeCosetVariable<C>>,
14}
15
16impl<C: Config> FriConfigVariable<C> {
17    pub fn get_subgroup(
18        &self,
19        builder: &mut Builder<C>,
20        log_degree: impl Into<RVar<C::N>>,
21    ) -> TwoAdicMultiplicativeCosetVariable<C> {
22        builder.get(&self.subgroups, log_degree)
23    }
24
25    pub fn get_two_adic_generator(
26        &self,
27        builder: &mut Builder<C>,
28        bits: impl Into<RVar<C::N>>,
29    ) -> Felt<C::F> {
30        builder.get(&self.generators, bits)
31    }
32}
33
34#[derive(DslVariable, Clone)]
35pub struct FriProofVariable<C: Config> {
36    pub commit_phase_commits: Array<C, DigestVariable<C>>,
37    pub query_proofs: Array<C, FriQueryProofVariable<C>>,
38    pub final_poly: Array<C, Ext<C::F, C::EF>>,
39    pub pow_witness: Felt<C::F>,
40}
41
42#[derive(DslVariable, Clone)]
43pub struct FriQueryProofVariable<C: Config> {
44    pub input_proof: Array<C, BatchOpeningVariable<C>>,
45    pub commit_phase_openings: Array<C, FriCommitPhaseProofStepVariable<C>>,
46}
47
48#[derive(DslVariable, Clone)]
49pub struct FriCommitPhaseProofStepVariable<C: Config> {
50    pub sibling_value: Ext<C::F, C::EF>,
51    pub opening_proof: HintSlice<C>,
52}
53
54#[derive(DslVariable, Clone)]
55pub struct FriChallengesVariable<C: Config> {
56    pub query_indices: Array<C, Array<C, Var<C::N>>>,
57    pub betas: Array<C, Ext<C::F, C::EF>>,
58}
59
60#[derive(DslVariable, Clone)]
61pub struct DimensionsVariable<C: Config> {
62    pub log_height: Usize<C::N>,
63}
64
65#[derive(DslVariable, Clone)]
66pub struct BatchOpeningVariable<C: Config> {
67    pub opened_values: HintSlice<C>,
68    pub opening_proof: HintSlice<C>,
69}
70
71#[derive(DslVariable, Clone)]
72pub struct TwoAdicPcsRoundVariable<C: Config> {
73    pub batch_commit: DigestVariable<C>,
74    pub mats: Array<C, TwoAdicPcsMatsVariable<C>>,
75    /// Optional. `permutation` could be empty if `mats` is already sorted. Otherwise, it's a
76    /// permutation of indexes of mats which domains are sorted by degree in descending order.
77    pub permutation: Array<C, Usize<C::N>>,
78}
79
80#[derive(DslVariable, Clone)]
81pub struct TwoAdicPcsMatsVariable<C: Config> {
82    pub domain: TwoAdicMultiplicativeCosetVariable<C>,
83    pub points: Array<C, Ext<C::F, C::EF>>,
84    #[allow(clippy::type_complexity)]
85    pub values: Array<C, Array<C, Ext<C::F, C::EF>>>,
86}