Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
r1cs.hpp
Go to the documentation of this file.
1 
17 #ifndef R1CS_HPP_
18 #define R1CS_HPP_
19 
20 #include <cstdlib>
21 #include <iostream>
23 #include <map>
24 #include <string>
25 #include <vector>
26 
27 namespace libsnark
28 {
29 
30 /************************* R1CS constraint ***********************************/
31 
32 template<typename FieldT> class r1cs_constraint;
33 
34 template<typename FieldT>
35 std::ostream &operator<<(std::ostream &out, const r1cs_constraint<FieldT> &c);
36 
37 template<typename FieldT>
38 std::istream &operator>>(std::istream &in, r1cs_constraint<FieldT> &c);
39 
50 template<typename FieldT> class r1cs_constraint
51 {
52 public:
54 
60 
62  const std::initializer_list<linear_combination<FieldT>> &A,
63  const std::initializer_list<linear_combination<FieldT>> &B,
64  const std::initializer_list<linear_combination<FieldT>> &C);
65 
66  bool operator==(const r1cs_constraint<FieldT> &other) const;
67 
68  friend std::ostream &operator<<<FieldT>(
69  std::ostream &out, const r1cs_constraint<FieldT> &c);
70  friend std::istream &operator>>
71  <FieldT>(std::istream &in, r1cs_constraint<FieldT> &c);
72 };
73 
74 /************************* R1CS variable assignment **************************/
75 
81 /* TODO: specify that it does *NOT* include the constant 1 */
82 template<typename FieldT> using r1cs_primary_input = std::vector<FieldT>;
83 
84 template<typename FieldT> using r1cs_auxiliary_input = std::vector<FieldT>;
85 
86 template<typename FieldT>
88  std::vector<FieldT>; /* note the changed name! (TODO: remove this comment
89  after primary_input transition is complete) */
90 
91 /************************* R1CS constraint system ****************************/
92 
93 template<typename FieldT> class r1cs_constraint_system;
94 
95 template<typename FieldT>
96 std::ostream &operator<<(
97  std::ostream &out, const r1cs_constraint_system<FieldT> &cs);
98 
99 template<typename FieldT>
100 std::istream &operator>>(std::istream &in, r1cs_constraint_system<FieldT> &cs);
101 
114 template<typename FieldT> class r1cs_constraint_system
115 {
116 public:
119 
120  std::vector<r1cs_constraint<FieldT>> constraints;
121 
123 
124  size_t num_inputs() const;
125  size_t num_variables() const;
126  size_t num_constraints() const;
127 
128 #ifdef DEBUG
129  std::map<size_t, std::string> constraint_annotations;
130  std::map<size_t, std::string> variable_annotations;
131 #endif
132 
133  bool is_valid() const;
134  bool is_satisfied(
135  const r1cs_primary_input<FieldT> &primary_input,
136  const r1cs_auxiliary_input<FieldT> &auxiliary_input) const;
137 
139  void add_constraint(
140  const r1cs_constraint<FieldT> &c, const std::string &annotation);
141 
142  void swap_AB_if_beneficial();
143 
144  bool operator==(const r1cs_constraint_system<FieldT> &other) const;
145 
146  friend std::ostream &operator<<<FieldT>(
147  std::ostream &out, const r1cs_constraint_system<FieldT> &cs);
148  friend std::istream &operator>>
149  <FieldT>(std::istream &in, r1cs_constraint_system<FieldT> &cs);
150 
152 };
153 
154 } // namespace libsnark
155 
157 
158 #endif // R1CS_HPP_
libsnark::r1cs_constraint_system::constraints
std::vector< r1cs_constraint< FieldT > > constraints
Definition: r1cs.hpp:120
libsnark::r1cs_constraint
Definition: protoboard.hpp:23
libsnark::r1cs_constraint_system::num_inputs
size_t num_inputs() const
libsnark::linear_combination
Definition: variable.hpp:40
libsnark::r1cs_constraint_system::is_satisfied
bool is_satisfied(const r1cs_primary_input< FieldT > &primary_input, const r1cs_auxiliary_input< FieldT > &auxiliary_input) const
libsnark
Definition: accumulation_vector.hpp:18
libsnark::operator<<
std::ostream & operator<<(std::ostream &out, const accumulation_vector< T > &v)
libsnark::r1cs_constraint::r1cs_constraint
r1cs_constraint()
Definition: r1cs.hpp:55
libsnark::r1cs_constraint::a
linear_combination< FieldT > a
Definition: r1cs.hpp:53
libsnark::r1cs_constraint_system::primary_input_size
size_t primary_input_size
Definition: r1cs.hpp:117
libsnark::r1cs_constraint::operator==
bool operator==(const r1cs_constraint< FieldT > &other) const
libsnark::r1cs_constraint_system::operator==
bool operator==(const r1cs_constraint_system< FieldT > &other) const
libsnark::r1cs_constraint::c
linear_combination< FieldT > c
Definition: r1cs.hpp:53
libsnark::r1cs_constraint_system::auxiliary_input_size
size_t auxiliary_input_size
Definition: r1cs.hpp:118
libsnark::r1cs_constraint::b
linear_combination< FieldT > b
Definition: r1cs.hpp:53
libsnark::r1cs_constraint_system::num_variables
size_t num_variables() const
libsnark::r1cs_constraint_system::report_linear_constraint_statistics
void report_linear_constraint_statistics() const
variable.hpp
r1cs.tcc
libsnark::r1cs_constraint_system::r1cs_constraint_system
r1cs_constraint_system()
Definition: r1cs.hpp:122
libsnark::operator>>
std::istream & operator>>(std::istream &in, accumulation_vector< T > &v)
libsnark::r1cs_auxiliary_input
std::vector< FieldT > r1cs_auxiliary_input
Definition: r1cs.hpp:84
libsnark::r1cs_variable_assignment
std::vector< FieldT > r1cs_variable_assignment
Definition: r1cs.hpp:88
libsnark::r1cs_constraint_system::is_valid
bool is_valid() const
libsnark::r1cs_constraint_system
Definition: protoboard.hpp:25
libsnark::r1cs_constraint_system::add_constraint
void add_constraint(const r1cs_constraint< FieldT > &c)
libsnark::r1cs_constraint_system::num_constraints
size_t num_constraints() const
libsnark::r1cs_primary_input
std::vector< FieldT > r1cs_primary_input
Definition: r1cs.hpp:82
libsnark::r1cs_constraint_system::swap_AB_if_beneficial
void swap_AB_if_beneficial()