From 6fdcc6f75b89ca4536a819da00c9e5f009b9a5bd Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 14 Sep 2016 11:15:53 -0600 Subject: [PATCH] Refactor dummy CS instance creation. --- snark/src/lib.rs | 4 +-- snark/src/libsnarkwrap.cpp | 63 +++++++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/snark/src/lib.rs b/snark/src/lib.rs index b6ad548..7278a1d 100644 --- a/snark/src/lib.rs +++ b/snark/src/lib.rs @@ -9,7 +9,7 @@ use bn::*; extern "C" { fn libsnarkwrap_init(); - fn libsnarkwrap_getcs(d: *mut libc::uint64_t, vars: *mut libc::uint64_t, inputs: *mut libc::uint64_t, omega: *mut Fr) -> *mut libc::c_void; + fn libsnarkwrap_getcs_dummy(d: *mut libc::uint64_t, vars: *mut libc::uint64_t, inputs: *mut libc::uint64_t, omega: *mut Fr) -> *mut libc::c_void; fn libsnarkwrap_dropcs(cs: *mut libc::c_void); fn libsnarkwrap_dropkeypair(kp: *mut libc::c_void); fn libsnarkwrap_eval( @@ -204,7 +204,7 @@ impl CS { let mut num_inputs = 0; let mut o = Fr::zero(); - let cs = unsafe { libsnarkwrap_getcs(&mut d, &mut vars, &mut num_inputs, &mut o) }; + let cs = unsafe { libsnarkwrap_getcs_dummy(&mut d, &mut vars, &mut num_inputs, &mut o) }; CS { ptr: cs, diff --git a/snark/src/libsnarkwrap.cpp b/snark/src/libsnarkwrap.cpp index c51172f..ba09931 100644 --- a/snark/src/libsnarkwrap.cpp +++ b/snark/src/libsnarkwrap.cpp @@ -39,35 +39,48 @@ extern "C" void libsnarkwrap_init() { // QAP -extern "C" void* libsnarkwrap_getcs(uint64_t *d, uint64_t *vars, uint64_t *num_inputs, curve_Fr *omega) +void* libsnark_cs_return( + uint64_t *d, uint64_t *vars, uint64_t *num_inputs, curve_Fr *omega, + r1cs_constraint_system cs +) +{ + // A/B swap + cs.swap_AB_if_beneficial(); + + // QAP reduction + auto qap = r1cs_to_qap_instance_map(cs); + + *vars = cs.num_variables()+1; + *d = qap.degree(); + + // Sanity checks + assert(qap.A_in_Lagrange_basis.size() == *vars); + assert(qap.B_in_Lagrange_basis.size() == *vars); + assert(qap.C_in_Lagrange_basis.size() == *vars); + + // Degree of the QAP must be a power of 2 + assert(*d >= 2); + assert(((*d / 2) * 2) == *d); + + // Assume radix2 evaluation domain + *omega = std::static_pointer_cast>(qap.domain)->omega; + *num_inputs = cs.num_inputs(); + + return new r1cs_constraint_system(cs); +} + +extern "C" void* libsnarkwrap_getcs_dummy(uint64_t *d, uint64_t *vars, uint64_t *num_inputs, curve_Fr *omega) { // Generate a dummy circuit auto example = generate_r1cs_example_with_field_input(250, 4); - // A/B swap - example.constraint_system.swap_AB_if_beneficial(); - - { - // QAP reduction - auto qap = r1cs_to_qap_instance_map(example.constraint_system); - - // Sanity checks - assert(qap.A_in_Lagrange_basis.size() == example.constraint_system.num_variables()+1); - assert(qap.B_in_Lagrange_basis.size() == example.constraint_system.num_variables()+1); - assert(qap.C_in_Lagrange_basis.size() == example.constraint_system.num_variables()+1); - - // Degree of the QAP must be a power of 2 - assert(qap.degree() == 256); - - // Assume radix2 evaluation domain - *omega = std::static_pointer_cast>(qap.domain)->omega; - - *d = qap.degree(); - *vars = example.constraint_system.num_variables()+1; - *num_inputs = example.constraint_system.num_inputs(); - } - - return new r1cs_constraint_system(example.constraint_system); + return libsnark_cs_return( + d, + vars, + num_inputs, + omega, + example.constraint_system + ); } extern "C" void libsnarkwrap_dropcs(r1cs_constraint_system *cs)