binius_core/constraint_system/
mod.rs

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