use crate::poly::univariate::UnivariatePoly;
use alloc::string::String;
use alloc::vec::Vec;
use core::marker::PhantomData;
use hekate_math::TowerField;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct InnerProof<F: TowerField> {
pub trace_root: [u8; 32],
pub h_root: Option<[u8; 32]>,
pub zerocheck_proof: SumcheckProof<F>,
pub main_logup_aux: LogUpAux<F>,
pub main_point_evaluation: (Vec<F>, Vec<F>),
pub eval_proof: EvalBatchProof<F>,
pub chiplet_rows: Vec<usize>,
pub chiplet_zerocheck_proofs: Vec<SumcheckProof<F>>,
pub chiplet_logup_aux: Vec<LogUpAux<F>>,
pub chiplet_point_evaluations: Vec<(Vec<F>, Vec<F>)>,
pub pad_root: Option<[u8; 32]>,
pub outer: Option<OuterProof<F>>,
}
impl<F: TowerField> InnerProof<F> {
#[allow(clippy::too_many_arguments)]
pub fn new(
trace_root: [u8; 32],
h_root: Option<[u8; 32]>,
zerocheck_proof: SumcheckProof<F>,
main_logup_aux: LogUpAux<F>,
main_point_evaluation: (Vec<F>, Vec<F>),
eval_proof: EvalBatchProof<F>,
chiplet_rows: Vec<usize>,
chiplet_zerocheck_proofs: Vec<SumcheckProof<F>>,
chiplet_logup_aux: Vec<LogUpAux<F>>,
chiplet_point_evaluations: Vec<(Vec<F>, Vec<F>)>,
pad_root: Option<[u8; 32]>,
outer: Option<OuterProof<F>>,
) -> Self {
Self {
trace_root,
h_root,
zerocheck_proof,
main_logup_aux,
main_point_evaluation,
eval_proof,
chiplet_rows,
chiplet_zerocheck_proofs,
chiplet_logup_aux,
chiplet_point_evaluations,
pad_root,
outer,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OuterOpening<F: TowerField> {
pub columns: Vec<u32>,
pub values: Vec<F>,
pub siblings: Vec<[u8; 32]>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct OuterProof<F: TowerField> {
pub aux_root: [u8; 32],
pub interleaved: Vec<F>,
pub linear: Vec<F>,
pub quadratic: Vec<F>,
pub pad_opening: OuterOpening<F>,
pub aux_opening: OuterOpening<F>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct BrakedownProof<F: TowerField> {
pub opened_columns: Vec<Vec<u8>>,
pub batch_path: Vec<[u8; 32]>,
_marker: PhantomData<F>,
}
impl<F: TowerField> BrakedownProof<F> {
pub fn new(opened_columns: Vec<Vec<u8>>, batch_path: Vec<[u8; 32]>) -> Self {
Self {
opened_columns,
batch_path,
_marker: PhantomData,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SumcheckProof<F: TowerField> {
pub round_polys: Vec<UnivariatePoly<F>>,
pub claimed_evaluation: F,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct EvalBatchProof<F: TowerField> {
pub sumcheck_proof: SumcheckProof<F>,
pub ldt_proof: BrakedownProof<F>,
pub tensor_vec: Vec<F>,
pub masters: Vec<F>,
pub h_ldt_proof: Option<BrakedownProof<F>>,
}
impl<F: TowerField> EvalBatchProof<F> {
pub fn new(
sumcheck_proof: SumcheckProof<F>,
ldt_proof: BrakedownProof<F>,
tensor_vec: Vec<F>,
masters: Vec<F>,
h_ldt_proof: Option<BrakedownProof<F>>,
) -> Self {
Self {
sumcheck_proof,
ldt_proof,
tensor_vec,
masters,
h_ldt_proof,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct LogUpAux<F: TowerField> {
pub h_evals: Vec<(String, F)>,
pub claimed_sums: Vec<(String, F)>,
}
impl<F: TowerField> LogUpAux<F> {
pub fn new(h_evals: Vec<(String, F)>, claimed_sums: Vec<(String, F)>) -> Self {
Self {
h_evals,
claimed_sums,
}
}
}