diff --git a/poly-iop/Cargo.toml b/poly-iop/Cargo.toml index 433dd10..3fcf4bd 100644 --- a/poly-iop/Cargo.toml +++ b/poly-iop/Cargo.toml @@ -19,6 +19,12 @@ displaydoc = { version = "0.2.3", default-features = false } rayon = { version = "1.5.2", default-features = false, optional = true } +# Benchmarks +[[bench]] +name = "poly-iop-benches" +path = "benches/bench.rs" +harness = false + [features] # default = [ "parallel", "print-trace" ] default = [ "parallel" ] diff --git a/poly-iop/benches/bench.rs b/poly-iop/benches/bench.rs new file mode 100644 index 0000000..7f79d5f --- /dev/null +++ b/poly-iop/benches/bench.rs @@ -0,0 +1,119 @@ +use std::time::Instant; + +use ark_bls12_381::Fr; +use ark_std::test_rng; +use poly_iop::{PolyIOP, PolyIOPErrors, SumCheck, VirtualPolynomial, ZeroCheck}; + +fn main() -> Result<(), PolyIOPErrors> { + bench_sum_check()?; + println!("\n\n"); + bench_zero_check() +} + +fn bench_sum_check() -> Result<(), PolyIOPErrors> { + let mut rng = test_rng(); + for degree in 2..4 { + for nv in 4..25 { + let repetition = if nv < 10 { + 100 + } else if nv < 20 { + 50 + } else { + 10 + }; + + let (poly, asserted_sum) = + VirtualPolynomial::rand(nv, (degree, degree + 1), 2, &mut rng)?; + let poly_info = poly.domain_info.clone(); + let proof = { + let start = Instant::now(); + let mut transcript = as SumCheck>::init_transcript(); + let proof = as SumCheck>::prove(&poly, &mut transcript)?; + + println!( + "sum check proving time for {} variables and {} degree: {} ns", + nv, + degree, + start.elapsed().as_nanos() / repetition as u128 + ); + proof + }; + + { + let start = Instant::now(); + let mut transcript = as SumCheck>::init_transcript(); + let subclaim = as SumCheck>::verify( + asserted_sum, + &proof, + &poly_info, + &mut transcript, + )?; + assert!( + poly.evaluate(&subclaim.point).unwrap() == subclaim.expected_evaluation, + "wrong subclaim" + ); + + println!( + "sum check verification time for {} variables: {} ns", + nv, + start.elapsed().as_nanos() / repetition as u128 + ); + } + + println!("===================================="); + } + } + Ok(()) +} + +fn bench_zero_check() -> Result<(), PolyIOPErrors> { + let mut rng = test_rng(); + for degree in 2..4 { + for nv in 4..20 { + let repetition = if nv < 10 { + 100 + } else if nv < 20 { + 50 + } else { + 10 + }; + + let poly = VirtualPolynomial::rand_zero(nv, (degree, degree + 1), 2, &mut rng)?; + let poly_info = poly.domain_info.clone(); + let proof = { + let start = Instant::now(); + let mut transcript = as ZeroCheck>::init_transcript(); + transcript.append_message(b"testing", b"initializing transcript for testing")?; + let proof = as ZeroCheck>::prove(&poly, &mut transcript)?; + + println!( + "zero check proving time for {} variables and {} degree: {} ns", + nv, + degree, + start.elapsed().as_nanos() / repetition as u128 + ); + proof + }; + + { + let start = Instant::now(); + let mut transcript = as ZeroCheck>::init_transcript(); + transcript.append_message(b"testing", b"initializing transcript for testing")?; + let subclaim = + as ZeroCheck>::verify(&proof, &poly_info, &mut transcript)?.0; + assert!( + poly.evaluate(&subclaim.point)? == subclaim.expected_evaluation, + "wrong subclaim" + ); + println!( + "zero check verification time for {} variables: {} ns", + nv, + start.elapsed().as_nanos() / repetition as u128 + ); + } + + println!("===================================="); + } + } + Ok(()) +} diff --git a/poly-iop/src/lib.rs b/poly-iop/src/lib.rs index ee6cb06..f89f26f 100644 --- a/poly-iop/src/lib.rs +++ b/poly-iop/src/lib.rs @@ -9,7 +9,10 @@ mod utils; mod virtual_poly; mod zero_check; +pub use errors::PolyIOPErrors; +pub use sum_check::SumCheck; pub use virtual_poly::VirtualPolynomial; +pub use zero_check::ZeroCheck; /// Struct for PolyIOP protocol. /// It is instantiated with diff --git a/poly-iop/src/transcript.rs b/poly-iop/src/transcript.rs index e9164c4..df7d117 100644 --- a/poly-iop/src/transcript.rs +++ b/poly-iop/src/transcript.rs @@ -27,7 +27,7 @@ impl IOPTranscript { } // append the message to the transcript - pub(crate) fn append_message( + pub fn append_message( &mut self, label: &'static [u8], msg: &[u8], diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 8f47ea9..a96e980 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -6,3 +6,4 @@ export RUSTFLAGS="-C overflow-checks=on" cargo test --release -- -Zunstable-options --report-time cargo test --no-run --features=print-trace cargo test --no-run --no-default-features +cargo bench --no-run \ No newline at end of file