From e642b8241040be03a834c75ef9d25dfb8a7866e2 Mon Sep 17 00:00:00 2001 From: Nicholas Ward Date: Tue, 25 Apr 2023 17:26:37 -0700 Subject: [PATCH] move serialization to separate example --- plonky2/examples/fibonacci.rs | 19 +----- plonky2/examples/fibonacci_serialization.rs | 69 +++++++++++++++++++++ 2 files changed, 70 insertions(+), 18 deletions(-) create mode 100644 plonky2/examples/fibonacci_serialization.rs diff --git a/plonky2/examples/fibonacci.rs b/plonky2/examples/fibonacci.rs index 459f4c9d..e3d865b9 100644 --- a/plonky2/examples/fibonacci.rs +++ b/plonky2/examples/fibonacci.rs @@ -1,7 +1,5 @@ #![allow(clippy::upper_case_acronyms)] -use std::fs; - use anyhow::Result; use plonky2::field::types::Field; use plonky2::iop::witness::{PartialWitness, WitnessWrite}; @@ -41,24 +39,9 @@ fn main() -> Result<()> { pw.set_target(initial_a, F::ZERO); pw.set_target(initial_b, F::ONE); - let data = builder.build_without_randomizing::(); - - let common_circuit_data_serialized = serde_json::to_string(&data.common).unwrap(); - fs::write("common_circuit_data.json", common_circuit_data_serialized) - .expect("Unable to write file"); - - let verifier_only_circuit_data_serialized = serde_json::to_string(&data.verifier_only).unwrap(); - fs::write( - "verifier_only_circuit_data.json", - verifier_only_circuit_data_serialized, - ) - .expect("Unable to write file"); - + let data = builder.build::(); let proof = data.prove(pw)?; - let proof_serialized = serde_json::to_string(&proof).unwrap(); - fs::write("proof_with_public_inputs.json", proof_serialized).expect("Unable to write file"); - println!( "100th Fibonacci number mod |F| (starting with {}, {}) is: {}", proof.public_inputs[0], proof.public_inputs[1], proof.public_inputs[2] diff --git a/plonky2/examples/fibonacci_serialization.rs b/plonky2/examples/fibonacci_serialization.rs new file mode 100644 index 00000000..a252884c --- /dev/null +++ b/plonky2/examples/fibonacci_serialization.rs @@ -0,0 +1,69 @@ +#![allow(clippy::upper_case_acronyms)] + +use std::fs; + +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 a statement of the form +/// "I know the 100th element of the Fibonacci sequence, starting with constants a and b." +/// When a == 0 and b == 1, this is proving knowledge of the 100th (standard) Fibonacci number. +/// This example also serializes the circuit data and proof to JSON files. +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 arithmetic circuit. + let initial_a = builder.add_virtual_target(); + let initial_b = builder.add_virtual_target(); + let mut prev_target = initial_a; + let mut cur_target = initial_b; + for _ in 0..99 { + let temp = builder.add(prev_target, cur_target); + prev_target = cur_target; + cur_target = temp; + } + + // Public inputs are the two initial values (provided below) and the result (which is generated). + builder.register_public_input(initial_a); + builder.register_public_input(initial_b); + builder.register_public_input(cur_target); + + // Provide initial values. + let mut pw = PartialWitness::new(); + pw.set_target(initial_a, F::ZERO); + pw.set_target(initial_b, F::ONE); + + let data = builder.build_without_randomizing::(); + + let common_circuit_data_serialized = serde_json::to_string(&data.common).unwrap(); + fs::write("common_circuit_data.json", common_circuit_data_serialized) + .expect("Unable to write file"); + + let verifier_only_circuit_data_serialized = serde_json::to_string(&data.verifier_only).unwrap(); + fs::write( + "verifier_only_circuit_data.json", + verifier_only_circuit_data_serialized, + ) + .expect("Unable to write file"); + + let proof = data.prove(pw)?; + + let proof_serialized = serde_json::to_string(&proof).unwrap(); + fs::write("proof_with_public_inputs.json", proof_serialized).expect("Unable to write file"); + + println!( + "100th Fibonacci number mod |F| (starting with {}, {}) is: {}", + proof.public_inputs[0], proof.public_inputs[1], proof.public_inputs[2] + ); + + data.verify(proof) +}