1pub mod circuits;
11pub mod cli;
12pub mod snapshot;
13
14use anyhow::Result;
15use binius_core::constraint_system::{ConstraintSystem, ValueVec};
16use binius_frontend::{CircuitBuilder, WitnessFiller};
17use binius_hash::sha256::Sha256HashSuite;
18use binius_hash_prover::ParallelHashSuite;
19use binius_prover::{KeyCollection, OptimalPackedB128, Prover, zk_config::ZKProver};
20use binius_utils::{DeserializeBytes, SerializeBytes};
21use binius_verifier::{
22 Verifier,
23 config::StdChallenger,
24 transcript::{ProverTranscript, VerifierTranscript},
25 zk_config::ZKVerifier,
26};
27use clap::ValueEnum;
28pub use cli::Cli;
29use digest::Output;
30use tracing::level_filters::LevelFilter;
31use tracing_forest::ForestLayer;
32use tracing_subscriber::{EnvFilter, layer::SubscriberExt, util::SubscriberInitExt};
33
34pub fn init_tracing() {
46 let env_filter = EnvFilter::builder()
49 .with_default_directive(LevelFilter::DEBUG.into())
50 .from_env_lossy()
51 .add_directive("ureq=off".parse().expect("literal directive"));
52
53 let _ = tracing_subscriber::registry()
54 .with(env_filter)
55 .with(ForestLayer::default())
56 .try_init();
57}
58
59#[derive(Debug, Clone, Copy, ValueEnum)]
67pub enum HashSuiteType {
68 Sha256,
70 Blake3,
72}
73
74pub type StdVerifier = Verifier<Sha256HashSuite>;
76pub type StdProver = Prover<OptimalPackedB128, Sha256HashSuite>;
78pub type StdZKVerifier = ZKVerifier<Sha256HashSuite>;
80pub type StdZKProver = ZKProver<OptimalPackedB128, Sha256HashSuite>;
82
83pub fn setup<H>(
89 cs: ConstraintSystem,
90 log_inv_rate: usize,
91 key_collection: Option<KeyCollection>,
92) -> Result<(Verifier<H>, Prover<OptimalPackedB128, H>)>
93where
94 H: ParallelHashSuite + Clone,
95 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
96{
97 let _setup_guard = tracing::info_span!("Setup", log_inv_rate).entered();
98 let verifier = Verifier::<H>::setup(cs, log_inv_rate)?;
99 let prover = if let Some(key_collection) = key_collection {
100 Prover::setup_with_key_collection(verifier.clone(), key_collection)?
101 } else {
102 Prover::setup(verifier.clone())?
103 };
104 Ok((verifier, prover))
105}
106
107pub fn setup_zk<H>(
110 cs: ConstraintSystem,
111 log_inv_rate: usize,
112) -> Result<(ZKVerifier<H>, ZKProver<OptimalPackedB128, H>)>
113where
114 H: ParallelHashSuite + Clone,
115 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
116{
117 let _setup_guard = tracing::info_span!("ZK setup", log_inv_rate).entered();
118 let verifier = ZKVerifier::<H>::setup(cs, log_inv_rate)?;
119 let prover = ZKProver::setup(&verifier)?;
120 Ok((verifier, prover))
121}
122
123pub fn setup_verifier<H>(cs: ConstraintSystem, log_inv_rate: usize) -> Result<Verifier<H>>
126where
127 H: ParallelHashSuite + Clone,
128 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
129{
130 let _setup_guard = tracing::info_span!("Setup", log_inv_rate).entered();
131 Ok(Verifier::<H>::setup(cs, log_inv_rate)?)
132}
133
134pub fn setup_zk_verifier<H>(cs: ConstraintSystem, log_inv_rate: usize) -> Result<ZKVerifier<H>>
137where
138 H: ParallelHashSuite + Clone,
139 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
140{
141 let _setup_guard = tracing::info_span!("ZK setup", log_inv_rate).entered();
142 Ok(ZKVerifier::<H>::setup(cs, log_inv_rate)?)
143}
144
145pub fn create_proof<H>(prover: &Prover<OptimalPackedB128, H>, witness: &ValueVec) -> Result<Vec<u8>>
147where
148 H: ParallelHashSuite,
149 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
150{
151 let challenger = StdChallenger::default();
152 let mut prover_transcript = ProverTranscript::new(challenger);
153 prover.prove(witness, &mut prover_transcript)?;
154 Ok(prover_transcript.finalize())
155}
156
157pub fn create_proof_zk<H>(
159 prover: &ZKProver<OptimalPackedB128, H>,
160 witness: &ValueVec,
161 message: Option<&[u8]>,
162) -> Result<Vec<u8>>
163where
164 H: ParallelHashSuite,
165 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
166{
167 let challenger = StdChallenger::default();
168 let _scope = tracing::info_span!("Prove").entered();
169 let mut prover_transcript = ProverTranscript::new(challenger);
170 let mut rng = rand::rng();
171 match message {
172 Some(message) => prover.prove_sig(witness, message, &mut rng, &mut prover_transcript)?,
173 None => prover.prove(witness, &mut rng, &mut prover_transcript)?,
174 }
175 Ok(prover_transcript.finalize())
176}
177
178pub fn check_proof<H>(
180 verifier: &Verifier<H>,
181 witness: &ValueVec,
182 proof_bytes: Vec<u8>,
183) -> Result<()>
184where
185 H: ParallelHashSuite,
186 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
187{
188 let challenger = StdChallenger::default();
189 let mut verifier_transcript = VerifierTranscript::new(challenger, proof_bytes);
190 verifier.verify(witness.inout(), &mut verifier_transcript)?;
191 verifier_transcript.finalize()?;
192 Ok(())
193}
194
195pub fn check_proof_zk<H>(
197 verifier: &ZKVerifier<H>,
198 witness: &ValueVec,
199 proof_bytes: Vec<u8>,
200 message: Option<&[u8]>,
201) -> Result<()>
202where
203 H: ParallelHashSuite,
204 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
205{
206 let challenger = StdChallenger::default();
207 let _scope = tracing::info_span!("Verify").entered();
208 let mut verifier_transcript = VerifierTranscript::new(challenger, proof_bytes);
209 match message {
210 Some(message) => verifier.verify_sig(witness.inout(), message, &mut verifier_transcript)?,
211 None => verifier.verify(witness.inout(), &mut verifier_transcript)?,
212 }
213 verifier_transcript.finalize()?;
214 Ok(())
215}
216
217pub fn prove_verify<H>(
218 verifier: &Verifier<H>,
219 prover: &Prover<OptimalPackedB128, H>,
220 witness: &ValueVec,
221) -> Result<()>
222where
223 H: ParallelHashSuite,
224 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
225{
226 let proof_bytes = create_proof(prover, witness)?;
227 tracing::info!("Proof size: {} KiB", proof_bytes.len() / 1024);
228 check_proof(verifier, witness, proof_bytes)?;
229 Ok(())
230}
231
232pub fn prove_verify_zk<H>(
233 verifier: &ZKVerifier<H>,
234 prover: &ZKProver<OptimalPackedB128, H>,
235 witness: &ValueVec,
236 message: Option<&[u8]>,
237) -> Result<()>
238where
239 H: ParallelHashSuite,
240 Output<H::LeafHash>: SerializeBytes + DeserializeBytes,
241{
242 let proof_bytes = create_proof_zk(prover, witness, message)?;
243 tracing::info!("Proof size: {} KiB", proof_bytes.len() / 1024);
244 check_proof_zk(verifier, witness, proof_bytes, message)?;
245 Ok(())
246}
247
248pub trait ExampleCircuit: Sized {
301 type Params: clap::Args;
304
305 type Instance: clap::Args;
308
309 fn build(params: Self::Params, builder: &mut CircuitBuilder) -> Result<Self>;
316
317 fn populate_witness(
324 &self,
325 instance: Self::Instance,
326 filler: &mut WitnessFiller<'_>,
327 ) -> Result<()>;
328
329 fn param_summary(params: &Self::Params) -> Option<String> {
341 let _ = params;
342 None
343 }
344}