Refactor dummy CS instance creation.

This commit is contained in:
Sean Bowe 2016-09-14 11:15:53 -06:00
parent f2c79f9111
commit 6fdcc6f75b
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
2 changed files with 40 additions and 27 deletions

View File

@ -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,

View File

@ -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<curve_Fr> 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<basic_radix2_domain<curve_Fr>>(qap.domain)->omega;
*num_inputs = cs.num_inputs();
return new r1cs_constraint_system<curve_Fr>(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<curve_Fr>(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<basic_radix2_domain<curve_Fr>>(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<curve_Fr>(example.constraint_system);
return libsnark_cs_return(
d,
vars,
num_inputs,
omega,
example.constraint_system
);
}
extern "C" void libsnarkwrap_dropcs(r1cs_constraint_system<curve_Fr> *cs)