Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bigint_constraint.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
13
14#include <array>
15#include <cstdint>
16#include <vector>
17
18namespace acir_format {
19
21 std::vector<uint32_t> inputs;
22 std::vector<uint32_t> modulus;
23 uint32_t result;
24
25 // For serialization, update with any new fields
27 friend bool operator==(BigIntFromLeBytes const& lhs, BigIntFromLeBytes const& rhs) = default;
28};
29
31
33 uint32_t lhs;
34 uint32_t rhs;
35 uint32_t result;
37
38 // For serialization, update with any new fields
40 friend bool operator==(BigIntOperation const& lhs, BigIntOperation const& rhs) = default;
41};
42
44 uint32_t input;
45 std::vector<uint32_t> result;
46
47 // For serialization, update with any new fields
49 friend bool operator==(BigIntToLeBytes const& lhs, BigIntToLeBytes const& rhs) = default;
50};
51
63
68 public:
69 uint64_t modulus_0;
70 uint64_t modulus_1;
71 uint64_t modulus_2;
72 uint64_t modulus_3;
73};
74
75template <typename Builder> class DSLBigInts {
82
83 private:
90
92
93 public:
94 DSLBigInts() = default;
95
96 void set_builder(Builder* ctx) { builder = ctx; }
97
98 ModulusId get_modulus_id(uint32_t bigint_id)
99 {
100 if (this->m_bn254_fq.contains(bigint_id)) {
101 return ModulusId::BN254_FQ;
102 }
103 if (this->m_bn254_fr.contains(bigint_id)) {
104 return ModulusId::BN254_FR;
105 }
106 if (this->m_secp256k1_fq.contains(bigint_id)) {
108 }
109 if (this->m_secp256k1_fr.contains(bigint_id)) {
111 }
112 if (this->m_secp256r1_fq.contains(bigint_id)) {
114 }
115 if (this->m_secp256r1_fr.contains(bigint_id)) {
117 }
118
119 return ModulusId::UNKNOWN;
120 }
121
128 {
130 builder->set_variable(limbs_idx[4], value);
131 for (uint32_t i = 0; i < 4; i++) {
132 uint256_t limb = value % limb_modulus;
133 value = (value - limb) / limb_modulus;
134 builder->set_variable(limbs_idx[i], limb);
135 }
136 }
137
140 void get_witness_idx_of_limbs(uint32_t bigint_id, std::array<uint32_t, 5>& limbs_idx)
141 {
142 if (m_bn254_fr.contains(bigint_id)) {
143 for (uint32_t i = 0; i < 4; i++) {
144 limbs_idx[i] = m_bn254_fr[bigint_id].binary_basis_limbs[i].element.witness_index;
145 }
146 limbs_idx[4] = m_bn254_fr[bigint_id].prime_basis_limb.witness_index;
147 } else if (m_bn254_fq.contains(bigint_id)) {
148 for (uint32_t i = 0; i < 4; i++) {
149 limbs_idx[i] = m_bn254_fq[bigint_id].binary_basis_limbs[i].element.witness_index;
150 }
151 limbs_idx[4] = m_bn254_fq[bigint_id].prime_basis_limb.witness_index;
152 } else if (m_secp256k1_fq.contains(bigint_id)) {
153 auto big_field = m_secp256k1_fq[bigint_id];
154 for (uint32_t i = 0; i < 4; i++) {
155 limbs_idx[i] = big_field.binary_basis_limbs[i].element.witness_index;
156 }
157 limbs_idx[4] = big_field.prime_basis_limb.witness_index;
158 } else if (m_secp256k1_fr.contains(bigint_id)) {
159 auto big_field = m_secp256k1_fr[bigint_id];
160 for (uint32_t i = 0; i < 4; i++) {
161 limbs_idx[i] = big_field.binary_basis_limbs[i].element.witness_index;
162 }
163 limbs_idx[4] = big_field.prime_basis_limb.witness_index;
164 } else if (m_secp256r1_fr.contains(bigint_id)) {
165 auto big_field = m_secp256r1_fr[bigint_id];
166 for (uint32_t i = 0; i < 4; i++) {
167 limbs_idx[i] = big_field.binary_basis_limbs[i].element.witness_index;
168 }
169 limbs_idx[4] = big_field.prime_basis_limb.witness_index;
170 } else if (m_secp256r1_fq.contains(bigint_id)) {
171 auto big_field = m_secp256r1_fq[bigint_id];
172 for (uint32_t i = 0; i < 4; i++) {
173 limbs_idx[i] = big_field.binary_basis_limbs[i].element.witness_index;
174 }
175 limbs_idx[4] = big_field.prime_basis_limb.witness_index;
176 }
177 }
178 big_bn254_fr bn254_fr(uint32_t bigint_id)
179 {
180 ASSERT(this->m_bn254_fr.contains(bigint_id));
181 return this->m_bn254_fr[bigint_id];
182 }
183
184 void set_bn254_fr(const big_bn254_fr& bigint, uint32_t bigint_id) { this->m_bn254_fr[bigint_id] = bigint; }
185
186 big_bn254_fq bn254_fq(uint32_t bigint_id)
187 {
188 ASSERT(this->m_bn254_fq.contains(bigint_id));
189 return this->m_bn254_fq[bigint_id];
190 }
191
192 void set_bn254_fq(const big_bn254_fq& bigint, uint32_t bigint_id) { this->m_bn254_fq[bigint_id] = bigint; }
193
194 big_secp256r1_fq secp256r1_fq(uint32_t bigint_id)
195 {
196 ASSERT(this->m_secp256r1_fq.contains(bigint_id));
197 return this->m_secp256r1_fq[bigint_id];
198 }
199
200 void set_secp256r1_fq(const big_secp256r1_fq& bigint, uint32_t bigint_id)
201 {
202 this->m_secp256r1_fq[bigint_id] = bigint;
203 }
204
205 big_secp256r1_fr secp256r1_fr(uint32_t bigint_id)
206 {
207 ASSERT(this->m_secp256r1_fr.contains(bigint_id));
208 return this->m_secp256r1_fr[bigint_id];
209 }
210
211 void set_secp256r1_fr(const big_secp256r1_fr& bigint, uint32_t bigint_id)
212 {
213 this->m_secp256r1_fr[bigint_id] = bigint;
214 }
215
216 big_secp256k1_fq secp256k1_fq(uint32_t bigint_id)
217 {
218 ASSERT(this->m_secp256k1_fq.contains(bigint_id));
219 return this->m_secp256k1_fq[bigint_id];
220 }
221
222 void set_secp256k1_fq(const big_secp256k1_fq& bigint, uint32_t bigint_id)
223 {
224 this->m_secp256k1_fq[bigint_id] = bigint;
225 }
226
227 big_secp256k1_fr secp256k1_fr(uint32_t bigint_id)
228 {
229 if (this->m_secp256k1_fr.contains(bigint_id)) {
230 return this->m_secp256k1_fr[bigint_id];
231 }
232 return { 0 };
233 }
234
235 void set_secp256k1_fr(const big_secp256k1_fr& bigint, uint32_t bigint_id)
236 {
237 this->m_secp256k1_fr[bigint_id] = bigint;
238 }
239};
240
241template <typename Builder>
243 const BigIntFromLeBytes& input,
244 DSLBigInts<Builder>& dsl_bigints);
245template <typename Builder>
247 const BigIntToLeBytes& input,
248 DSLBigInts<Builder>& dsl_bigints);
249
250template <typename Builder>
251void create_bigint_operations_constraint(const BigIntOperation& input, DSLBigInts<Builder>& dsl_bigints, bool);
252template <typename Builder>
253void create_bigint_addition_constraint(const BigIntOperation& input, DSLBigInts<Builder>& dsl_bigints);
254template <typename Builder>
255void create_bigint_sub_constraint(const BigIntOperation& input, DSLBigInts<Builder>& dsl_bigints);
256template <typename Builder>
257void create_bigint_mul_constraint(const BigIntOperation& input, DSLBigInts<Builder>& dsl_bigints);
258template <typename Builder>
259void create_bigint_div_constraint(const BigIntOperation& input, DSLBigInts<Builder>& dsl_bigints, bool);
260
261} // namespace acir_format
#define ASSERT(expression,...)
Definition assert.hpp:49
std::map< uint32_t, big_secp256r1_fr > m_secp256r1_fr
std::map< uint32_t, big_bn254_fr > m_bn254_fr
ModulusId get_modulus_id(uint32_t bigint_id)
big_secp256k1_fr secp256k1_fr(uint32_t bigint_id)
void set_secp256r1_fq(const big_secp256r1_fq &bigint, uint32_t bigint_id)
big_secp256r1_fq secp256r1_fq(uint32_t bigint_id)
big_bn254_fr bn254_fr(uint32_t bigint_id)
std::map< uint32_t, big_secp256r1_fq > m_secp256r1_fq
void set_secp256k1_fr(const big_secp256k1_fr &bigint, uint32_t bigint_id)
std::map< uint32_t, big_bn254_fq > m_bn254_fq
big_secp256r1_fr secp256r1_fr(uint32_t bigint_id)
big_bn254_fq bn254_fq(uint32_t bigint_id)
void set_secp256r1_fr(const big_secp256r1_fr &bigint, uint32_t bigint_id)
void set_value(uint256_t value, const std::array< uint32_t, 5 > limbs_idx)
void get_witness_idx_of_limbs(uint32_t bigint_id, std::array< uint32_t, 5 > &limbs_idx)
void set_bn254_fr(const big_bn254_fr &bigint, uint32_t bigint_id)
std::map< uint32_t, big_secp256k1_fr > m_secp256k1_fr
big_secp256k1_fq secp256k1_fq(uint32_t bigint_id)
std::map< uint32_t, big_secp256k1_fq > m_secp256k1_fq
void set_secp256k1_fq(const big_secp256k1_fq &bigint, uint32_t bigint_id)
void set_builder(Builder *ctx)
void set_bn254_fq(const big_bn254_fq &bigint, uint32_t bigint_id)
void set_variable(const uint32_t index, const FF &value)
Set the value of the variable pointed to by a witness index.
AluTraceBuilder builder
Definition alu.test.cpp:123
void create_bigint_div_constraint(const BigIntOperation &input, DSLBigInts< Builder > &dsl_bigint, bool has_valid_witness_assignments)
void create_bigint_sub_constraint(const BigIntOperation &input, DSLBigInts< Builder > &dsl_bigint)
void create_bigint_from_le_bytes_constraint(Builder &builder, const BigIntFromLeBytes &input, DSLBigInts< Builder > &dsl_bigints)
void create_bigint_addition_constraint(const BigIntOperation &input, DSLBigInts< Builder > &dsl_bigint)
void create_bigint_to_le_bytes_constraint(Builder &builder, const BigIntToLeBytes &input, DSLBigInts< Builder > &dsl_bigints)
void create_bigint_mul_constraint(const BigIntOperation &input, DSLBigInts< Builder > &dsl_bigint)
void create_bigint_operations_constraint(const BigIntOperation &input, DSLBigInts< Builder > &dsl_bigint, bool has_valid_witness_assignments)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
friend bool operator==(BigIntFromLeBytes const &lhs, BigIntFromLeBytes const &rhs)=default
std::vector< uint32_t > modulus
MSGPACK_FIELDS(lhs, rhs, opcode, result)
friend bool operator==(BigIntOperation const &lhs, BigIntOperation const &rhs)=default
std::vector< uint32_t > result
friend bool operator==(BigIntToLeBytes const &lhs, BigIntToLeBytes const &rhs)=default