binius_core/constraint_system/
mod.rs

1// Copyright 2024-2025 Irreducible Inc.
2
3pub mod channel;
4mod common;
5pub mod error;
6pub mod exp;
7mod prove;
8pub mod validate;
9mod verify;
10
11use binius_field::{BinaryField128b, TowerField};
12use binius_macros::SerializeBytes;
13use binius_utils::{DeserializeBytes, SerializationError, SerializationMode};
14use channel::{ChannelId, Flush};
15use exp::Exp;
16pub use prove::prove;
17pub use verify::verify;
18
19use crate::oracle::{ConstraintSet, MultilinearOracleSet, OracleId};
20
21/// Contains the 3 things that place constraints on witness data in Binius
22/// - virtual oracles
23/// - polynomial constraints
24/// - channel flushes
25///
26/// As a result, a ConstraintSystem allows us to validate all of these
27/// constraints against a witness, as well as enabling generic prove/verify
28#[derive(Debug, Clone, SerializeBytes)]
29pub struct ConstraintSystem<F: TowerField> {
30	pub oracles: MultilinearOracleSet<F>,
31	pub table_constraints: Vec<ConstraintSet<F>>,
32	pub non_zero_oracle_ids: Vec<OracleId>,
33	pub flushes: Vec<Flush<F>>,
34	pub exponents: Vec<Exp<F>>,
35	pub max_channel_id: ChannelId,
36}
37
38impl DeserializeBytes for ConstraintSystem<BinaryField128b> {
39	fn deserialize(
40		mut read_buf: impl bytes::Buf,
41		mode: SerializationMode,
42	) -> Result<Self, SerializationError>
43	where
44		Self: Sized,
45	{
46		Ok(Self {
47			oracles: DeserializeBytes::deserialize(&mut read_buf, mode)?,
48			table_constraints: DeserializeBytes::deserialize(&mut read_buf, mode)?,
49			non_zero_oracle_ids: DeserializeBytes::deserialize(&mut read_buf, mode)?,
50			flushes: DeserializeBytes::deserialize(&mut read_buf, mode)?,
51			exponents: DeserializeBytes::deserialize(&mut read_buf, mode)?,
52			max_channel_id: DeserializeBytes::deserialize(&mut read_buf, mode)?,
53		})
54	}
55}
56
57impl<F: TowerField> ConstraintSystem<F> {
58	pub const fn no_base_constraints(self) -> Self {
59		self
60	}
61}
62
63/// Constraint system proof that has been serialized into bytes
64#[derive(Debug, Clone)]
65pub struct Proof {
66	pub transcript: Vec<u8>,
67}
68
69impl Proof {
70	pub fn get_proof_size(&self) -> usize {
71		self.transcript.len()
72	}
73}