Skip to main content

openvm_stark_backend/prover/
error.rs

1use thiserror::Error;
2
3/// Top-level error type for the reference prover, used as `ProverDevice::Error`.
4#[derive(Error, Debug)]
5pub enum RefProverError {
6    #[error("Stacked PCS: {0}")]
7    StackedPcs(#[from] StackedPcsError),
8    #[error("Sumcheck: {0}")]
9    Sumcheck(#[from] SumcheckError),
10    #[error("LogupZerocheck: {0}")]
11    LogupZerocheck(#[from] LogupZerocheckError),
12    #[error("Stacked reduction: {0}")]
13    StackedReduction(#[from] StackedReductionError),
14    #[error("WHIR: {0}")]
15    Whir(#[from] WhirProverError),
16}
17
18/// Errors from `stacked_pcs.rs` — Merkle tree, stacked layout, RS code.
19#[derive(Error, Debug)]
20pub enum StackedPcsError {
21    #[error("StackedLayout::new: column height {log_height} exceeds stacked height {log_stacked_height}")]
22    LayoutHeightExceeded {
23        log_height: usize,
24        log_stacked_height: usize,
25    },
26    #[error("StackedLayout::new: row overflow at col_idx={col_idx}, expected row_idx to equal stacked height {stacked_height}")]
27    LayoutRowOverflow {
28        col_idx: usize,
29        stacked_height: usize,
30    },
31    #[error("StackedLayout::from_raw_parts: mat_idx {mat_idx} does not equal mat_starts.len() {mat_starts_len}")]
32    LayoutRawPartsMatIdx {
33        mat_idx: usize,
34        mat_starts_len: usize,
35    },
36    #[error("MerkleTree::new: matrix height must be > 0")]
37    MerkleTreeEmptyMatrix,
38    #[error("MerkleTree::new: rows_per_query ({rows_per_query}) is not a power of two")]
39    MerkleTreeRowsPerQueryNotPow2 { rows_per_query: usize },
40    #[error("MerkleTree::new: rows_per_query ({rows_per_query}) exceeds number of Merkle leaves ({num_leaves})")]
41    MerkleTreeRowsPerQueryExceeded {
42        rows_per_query: usize,
43        num_leaves: usize,
44    },
45    #[error("MerkleTree: empty digest layers (no root)")]
46    MerkleTreeNoRoot,
47    #[error("MerkleTree::query_merkle_proof: query_idx {query_idx} out of bounds for query_stride {query_stride}")]
48    MerkleTreeQueryOutOfBounds {
49        query_idx: usize,
50        query_stride: usize,
51    },
52    #[error(
53        "MerkleTree::get_opened_rows: index {index} out of bounds for query_stride {query_stride}"
54    )]
55    MerkleTreeOpenedRowsOutOfBounds { index: usize, query_stride: usize },
56    #[error("stacked_matrix: width * height overflow")]
57    StackedMatrixOverflow,
58    #[error("rs_code_matrix: checked_shl overflow for height={height}, log_blowup={log_blowup}")]
59    RsCodeShiftOverflow { height: usize, log_blowup: usize },
60}
61
62/// Errors from `sumcheck.rs`.
63#[derive(Error, Debug)]
64pub enum SumcheckError {
65    #[error("sumcheck_multilinear: round polynomial length {len} != 1")]
66    MultilinearRoundPolyLen { len: usize },
67    #[error("sumcheck_multilinear: final evaluation count {len} != 1")]
68    MultilinearFinalEvalLen { len: usize },
69    #[error("sumcheck_prismalinear: prism_dim {prism_dim} < l_skip {l_skip}")]
70    PrismalinearDimTooSmall { prism_dim: usize, l_skip: usize },
71    #[error("sumcheck_prismalinear: round polynomial length {len} != 1")]
72    PrismalinearRoundPolyLen { len: usize },
73    #[error("sumcheck_prismalinear: r.len() {r_len} != n + 1 = {expected}")]
74    PrismalinearRLen { r_len: usize, expected: usize },
75    #[error("sumcheck_prismalinear: final evaluation count {len} != 1")]
76    PrismalinearFinalEvalLen { len: usize },
77}
78
79/// Errors from `logup_zerocheck/` module.
80#[derive(Error, Debug)]
81pub enum LogupZerocheckError {
82    #[error("Stacked PCS: {0}")]
83    StackedPcs(#[from] StackedPcsError),
84    #[error("fractional_sumcheck: non-zero root sum in assert_zero mode")]
85    NonZeroRootSum,
86    #[error(
87        "LogupZerocheckCpu::new: preprocessed trace index {index} out of bounds for width {width}"
88    )]
89    PreprocessedIndexOutOfBounds { index: usize, width: usize },
90    #[error("LogupZerocheckCpu::new: main partition {part_index} col_index {col_index} >= width {width}")]
91    MainPartitionIndexOutOfBounds {
92        part_index: usize,
93        col_index: usize,
94        width: usize,
95    },
96    #[error("LogupZerocheckCpu::new: public value index {index} out of bounds for len {len}")]
97    PublicValueIndexOutOfBounds { index: usize, len: usize },
98    #[error("LogupZerocheckCpu::new: challenge not supported")]
99    ChallengeNotSupported,
100    #[error("interactions_layout.get returned None for (trace_idx={trace_idx}, interaction_idx={interaction_idx})")]
101    InteractionsLayoutMissing {
102        trace_idx: usize,
103        interaction_idx: usize,
104    },
105    #[error("sumcheck_polys_eval: eq_ns is empty at round {round}")]
106    EqNsEmpty { round: usize },
107    #[error("sumcheck_polys_eval: eq_sharp_ns is empty at round {round}")]
108    EqSharpNsEmpty { round: usize },
109    #[error("into_column_openings: mat_evals.pop() returned None")]
110    MatEvalsPopNone,
111    #[error("into_column_openings: claim.len() {len} != 1")]
112    ClaimLenNotOne { len: usize },
113    #[error("prove_zerocheck_and_logup: r.len() {r_len} != n_max + 1 = {expected}")]
114    RLenMismatch { r_len: usize, expected: usize },
115}
116
117/// Errors from `whir.rs`.
118#[derive(Error, Debug)]
119pub enum WhirProverError {
120    #[error("Stacked PCS: {0}")]
121    StackedPcs(#[from] StackedPcsError),
122    #[error("prove_whir_opening: try_into failed for sumcheck poly evals")]
123    TryIntoFailed,
124    #[error("prove_whir_opening: tree height {tree_height} != expected {expected}")]
125    TreeHeightMismatch { tree_height: usize, expected: usize },
126    #[error("prove_whir_opening: rs_tree is None in whir_round > 0")]
127    RsTreeNone,
128    #[error("prove_whir_opening: tree width {width} != 1")]
129    TreeWidthNotOne { width: usize },
130    #[error("prove_whir_opening: z_0 is None (not last round)")]
131    Z0None,
132    #[error("prove_whir_opening: final_poly is None")]
133    FinalPolyNone,
134    #[error("prove_openings: u_prisma is empty (split_first failed)")]
135    UPrismaEmpty,
136}
137
138/// Errors from `stacked_reduction.rs`.
139#[derive(Error, Debug)]
140pub enum StackedReductionError {
141    #[error(
142        "batch_sumcheck_uni_round0_poly: eq_r_per_lht missing entry for log_height={log_height}"
143    )]
144    EqRMissing { log_height: usize },
145    #[error("batch_sumcheck_poly_eval: eq_r_per_lht missing entry for log_height={log_height}")]
146    EqRMissingPolyEval { log_height: usize },
147    #[error("batch_sumcheck_poly_eval: k_rot_r_per_lht missing entry for log_height={log_height}")]
148    KRotRMissing { log_height: usize },
149}