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_commitment: BrakedownCommitment,
pub zerocheck_proof: SumcheckProof<F>,
pub main_logup_aux: LogUpAux<F>,
pub eval_proof: EvalBatchProof<F>,
pub chiplet_commitments: Vec<BrakedownCommitment>,
pub chiplet_zerocheck_proofs: Vec<SumcheckProof<F>>,
pub chiplet_logup_aux: Vec<LogUpAux<F>>,
pub chiplet_eval_proofs: Vec<EvalBatchProof<F>>,
}
impl<F: TowerField> InnerProof<F> {
#[allow(clippy::too_many_arguments)]
pub fn new(
trace_commitment: BrakedownCommitment,
zerocheck_proof: SumcheckProof<F>,
main_logup_aux: LogUpAux<F>,
eval_proof: EvalBatchProof<F>,
chiplet_commitments: Vec<BrakedownCommitment>,
chiplet_zerocheck_proofs: Vec<SumcheckProof<F>>,
chiplet_logup_aux: Vec<LogUpAux<F>>,
chiplet_eval_proofs: Vec<EvalBatchProof<F>>,
) -> Self {
Self {
trace_commitment,
zerocheck_proof,
main_logup_aux,
eval_proof,
chiplet_commitments,
chiplet_zerocheck_proofs,
chiplet_logup_aux,
chiplet_eval_proofs,
}
}
}
#[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, PartialEq, Serialize, Deserialize)]
pub struct BrakedownCommitment {
pub root: [u8; 32],
pub num_rows: usize,
pub num_cols: usize,
}
#[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 point_evaluation: (Vec<F>, Vec<F>),
#[serde(default)]
pub tensor_vec: Vec<F>,
#[serde(default)]
pub tensor_vec_ring: Vec<F>,
}
impl<F: TowerField> EvalBatchProof<F> {
pub fn new(
sumcheck_proof: SumcheckProof<F>,
ldt_proof: BrakedownProof<F>,
point_evaluation: (Vec<F>, Vec<F>),
tensor_vec: Vec<F>,
tensor_vec_ring: Vec<F>,
) -> Self {
Self {
sumcheck_proof,
ldt_proof,
point_evaluation,
tensor_vec,
tensor_vec_ring,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct LogUpAux<F: TowerField> {
pub h_evals: Vec<(String, F)>,
pub claimed_sums: Vec<(String, F)>,
pub h_commitment: Option<BrakedownCommitment>,
pub h_eval_proof: Option<EvalBatchProof<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,
h_commitment: None,
h_eval_proof: None,
}
}
}