Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
bacs_to_r1cs.tcc
Go to the documentation of this file.
1 /** @file
2 *****************************************************************************
3 
4 Implementation of interfaces for a BACS-to-R1CS reduction.
5 
6 See bacs_to_r1cs.hpp .
7 
8 *****************************************************************************
9 * @author This file is part of libsnark, developed by SCIPR Lab
10 * and contributors (see AUTHORS).
11 * @copyright MIT license (see LICENSE file)
12 *****************************************************************************/
13 
14 #ifndef BACS_TO_R1CS_TCC_
15 #define BACS_TO_R1CS_TCC_
16 
17 #include <libsnark/relations/circuit_satisfaction_problems/bacs/bacs.hpp>
18 #include <libsnark/relations/constraint_satisfaction_problems/r1cs/r1cs.hpp>
19 
20 namespace libsnark
21 {
22 
23 template<typename FieldT>
24 r1cs_constraint_system<FieldT> bacs_to_r1cs_instance_map(
25  const bacs_circuit<FieldT> &circuit)
26 {
27  libff::enter_block("Call to bacs_to_r1cs_instance_map");
28  assert(circuit.is_valid());
29  r1cs_constraint_system<FieldT> result;
30 
31 #ifdef DEBUG
32  result.variable_annotations = circuit.variable_annotations;
33 #endif
34 
35  result.primary_input_size = circuit.primary_input_size;
36  result.auxiliary_input_size =
37  circuit.auxiliary_input_size + circuit.gates.size();
38 
39  for (auto &g : circuit.gates) {
40  result.constraints.emplace_back(
41  r1cs_constraint<FieldT>(g.lhs, g.rhs, g.output));
42 #ifdef DEBUG
43  auto it = circuit.gate_annotations.find(g.output.index);
44  if (it != circuit.gate_annotations.end()) {
45  result.constraint_annotations[result.constraints.size() - 1] =
46  it->second;
47  }
48 #endif
49  }
50 
51  for (auto &g : circuit.gates) {
52  if (g.is_circuit_output) {
53  result.constraints.emplace_back(
54  r1cs_constraint<FieldT>(1, g.output, 0));
55 
56 #ifdef DEBUG
57  result.constraint_annotations[result.constraints.size() - 1] =
58  FMT("", "output_%zu_is_circuit_output", g.output.index);
59 #endif
60  }
61  }
62 
63  libff::leave_block("Call to bacs_to_r1cs_instance_map");
64 
65  return result;
66 }
67 
68 template<typename FieldT>
69 r1cs_variable_assignment<FieldT> bacs_to_r1cs_witness_map(
70  const bacs_circuit<FieldT> &circuit,
71  const bacs_primary_input<FieldT> &primary_input,
72  const bacs_auxiliary_input<FieldT> &auxiliary_input)
73 {
74  libff::enter_block("Call to bacs_to_r1cs_witness_map");
75  const r1cs_variable_assignment<FieldT> result =
76  circuit.get_all_wires(primary_input, auxiliary_input);
77  libff::leave_block("Call to bacs_to_r1cs_witness_map");
78 
79  return result;
80 }
81 
82 } // namespace libsnark
83 
84 #endif // BACS_TO_R1CS_TCC_