swiftness_stark/
verify.rs

1use alloc::borrow::ToOwned;
2use starknet_crypto::Felt;
3use swiftness_air::{domains::StarkDomains, layout::LayoutTrait, public_memory::PublicInput};
4use swiftness_commitment::table::decommit::table_decommit;
5use swiftness_fri::{
6    fri::{self, fri_verify},
7    types,
8};
9
10use crate::{
11    oods::{eval_oods_boundary_poly_at_points, OodsEvaluationInfo},
12    queries::queries_to_points,
13    types::{StarkCommitment, StarkWitness},
14};
15
16// STARK verify phase.
17pub fn stark_verify<Layout: LayoutTrait>(
18    n_original_columns: u32,
19    n_interaction_columns: u32,
20    public_input: &PublicInput,
21    queries: &[Felt],
22    commitment: StarkCommitment<Layout::InteractionElements>,
23    witness: &StarkWitness,
24    stark_domains: &StarkDomains,
25) -> Result<(), Error> {
26    // First layer decommit.
27    Layout::traces_decommit(
28        queries,
29        commitment.traces,
30        witness.traces_decommitment.to_owned(),
31        witness.traces_witness.to_owned(),
32    )?;
33
34    table_decommit(
35        commitment.composition,
36        queries,
37        witness.composition_decommitment.to_owned(),
38        witness.composition_witness.to_owned(),
39    )?;
40
41    // Compute query points.
42    let points = queries_to_points(queries, stark_domains);
43
44    // Evaluate the FRI input layer at query points.
45    let eval_info = OodsEvaluationInfo {
46        oods_values: commitment.oods_values,
47        oods_point: commitment.interaction_after_composition,
48        trace_generator: stark_domains.trace_generator,
49        constraint_coefficients: commitment.interaction_after_oods,
50    };
51    let oods_poly_evals = eval_oods_boundary_poly_at_points::<Layout>(
52        n_original_columns,
53        n_interaction_columns,
54        public_input,
55        &eval_info,
56        &points,
57        &witness.traces_decommitment,
58        &witness.composition_decommitment,
59    );
60
61    // Decommit FRI.
62    let fri_decommitment = types::Decommitment { values: oods_poly_evals, points };
63    Ok(fri_verify(queries, commitment.fri, fri_decommitment, witness.fri_witness.to_owned())?)
64}
65
66#[cfg(feature = "std")]
67use thiserror::Error;
68
69#[cfg(feature = "std")]
70#[derive(Error, Debug)]
71pub enum Error {
72    #[error("Fri Error")]
73    FriError(#[from] fri::Error),
74
75    #[error("TraceDecommit Error")]
76    TraceDecommitError(#[from] swiftness_air::trace::decommit::Error),
77
78    #[error("TableDecommit Error")]
79    TableDecommitError(#[from] swiftness_commitment::table::decommit::Error),
80}
81
82#[cfg(not(feature = "std"))]
83use thiserror_no_std::Error;
84
85#[cfg(not(feature = "std"))]
86#[derive(Error, Debug)]
87pub enum Error {
88    #[error("Fri Error")]
89    FriError(#[from] fri::Error),
90
91    #[error("TraceDecommit Error")]
92    TraceDecommitError(#[from] swiftness_air::trace::decommit::Error),
93
94    #[error("TableDecommit Error")]
95    TableDecommitError(#[from] swiftness_commitment::table::decommit::Error),
96}