use nebu::Goldilocks;
use super::{CCSInstance, CCSWitness, Commitment, Proof};
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ProofGroup {
pub proof: Proof,
pub accumulator: Accumulator,
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TraceProof {
pub universal: ProofGroup,
pub binding: Option<ProofGroup>,
}
impl TraceProof {
pub fn groups(&self) -> impl Iterator<Item = &ProofGroup> {
core::iter::once(&self.universal).chain(self.binding.iter())
}
pub fn group_count(&self) -> usize {
1 + usize::from(self.binding.is_some())
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Statement {
pub program_hash: [u8; 32],
pub input_hash: [u8; 32],
pub output_hash: [u8; 32],
pub focus_bound: u64,
pub bbg_root: [u8; 32],
}
#[derive(Clone, Debug)]
pub struct ProofParams {
pub security: SecurityLevel,
pub lens: LensBackend,
pub max_trace_log: u32,
}
impl Default for ProofParams {
fn default() -> Self {
Self {
security: SecurityLevel::Sec128,
lens: LensBackend::Brakedown,
max_trace_log: 20,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SecurityLevel {
Sec100,
Sec128,
}
impl SecurityLevel {
pub fn lambda(self) -> usize {
match self {
SecurityLevel::Sec100 => 100,
SecurityLevel::Sec128 => 128,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LensBackend {
Brakedown,
Binius,
}
#[derive(Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Accumulator {
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) committed_instance: CCSInstance,
#[cfg_attr(feature = "serde", serde(skip))]
pub(crate) folded_witness: CCSWitness,
pub(crate) witness_commitment: Commitment,
pub(crate) error_evals: Vec<Goldilocks>,
pub(crate) step_count: u64,
}
impl Accumulator {
pub fn blank(instance: &CCSInstance) -> Self {
let z = vec![Goldilocks::ZERO; 64];
Self {
committed_instance: instance.clone(),
folded_witness: CCSWitness { z: z.clone() },
witness_commitment: lens::brakedown::Brakedown::commit_raw(&z),
error_evals: vec![Goldilocks::ZERO; instance.num_rows],
step_count: 0,
}
}
pub fn witness_commitment(&self) -> &Commitment {
&self.witness_commitment
}
pub fn step_count(&self) -> u64 {
self.step_count
}
}
#[derive(Debug)]
pub enum CommitError {
ExecutionFailed(nox::ErrorKind),
FocusExhausted,
TraceOverflow,
StatementMismatch,
UnsupportedRecursiveOpening,
LookBinding,
HashBinding,
AxisBinding,
StepUnsatisfied(usize),
DecideFailed(DecideError),
}
#[derive(Debug)]
pub enum OpenError {
InvalidPoint,
LensFailed,
}
#[derive(Debug)]
pub enum FoldError {
InstanceMismatch,
WitnessMismatch,
UnsatisfyingWitness,
}
#[derive(Debug)]
pub enum DecideError {
EmptyAccumulator,
SumcheckFailed { round: usize },
LensFailed,
}