diff --git a/README.md b/README.md index 6a27b4e2..72cbcc82 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,15 @@ A good starting point for how to use Plonky2 for simple applications is the incl * [`factorial`](plonky2/examples/factorial.rs): Proving knowledge of 100! * [`fibonacci`](plonky2/examples/fibonacci.rs): Proving knowledge of the hundredth Fibonacci number +* [`range_check`](plonky2/examples/range_check.rs): Proving that a field element is in a given range * [`square_root`](plonky2/examples/square_root.rs): Proving knowledge of the square root of a given field element +To run an example, use + +```sh +cargo run --example +``` + ## Building diff --git a/plonky2/examples/range_check.rs b/plonky2/examples/range_check.rs new file mode 100644 index 00000000..605359a8 --- /dev/null +++ b/plonky2/examples/range_check.rs @@ -0,0 +1,38 @@ +#![allow(clippy::upper_case_acronyms)] + +use anyhow::Result; +use plonky2::field::types::Field; +use plonky2::iop::witness::{PartialWitness, WitnessWrite}; +use plonky2::plonk::circuit_builder::CircuitBuilder; +use plonky2::plonk::circuit_data::CircuitConfig; +use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; + +/// An example of using Plonky2 to prove that a given value lies in a given range. +fn main() -> Result<()> { + const D: usize = 2; + type C = PoseidonGoldilocksConfig; + type F = >::F; + + let config = CircuitConfig::standard_recursion_config(); + let mut builder = CircuitBuilder::::new(config); + + // The secret value. + let value = builder.add_virtual_target(); + builder.register_public_input(value); + + let log_max = 6; + builder.range_check(value, log_max); + + let mut pw = PartialWitness::new(); + pw.set_target(value, F::from_canonical_usize(42)); + + let data = builder.build::(); + let proof = data.prove(pw)?; + + println!( + "Value {} is less than 2^{}", + proof.public_inputs[0], log_max, + ); + + data.verify(proof) +}