Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir_format.cpp
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#include "acir_format.hpp"
8
26
27#include <cstddef>
28#include <cstdint>
29#include <memory>
30
31namespace acir_format {
32
33using namespace bb;
34
35template <typename Builder>
37 const std::vector<OpeningClaim<stdlib::grumpkin<Builder>>>& nested_ipa_claims,
38 const std::vector<stdlib::Proof<Builder>>& nested_ipa_proofs);
39
40template <typename Builder>
43 const std::vector<OpeningClaim<stdlib::grumpkin<Builder>>>& nested_ipa_claims,
44 const std::vector<stdlib::Proof<Builder>>& nested_ipa_proofs);
45
46template <typename Builder> struct HonkRecursionConstraintsOutput {
51 bool is_root_rollup = false;
52
53 template <class T>
54 void update(T& other, bool update_ipa_data)
57 {
58 // Update points accumulator
59 if (this->points_accumulator.has_data) {
60 this->points_accumulator.aggregate(other.points_accumulator);
61 } else {
62 this->points_accumulator = other.points_accumulator;
63 }
64
65 if (update_ipa_data) {
67 // Update ipa proofs and claims
68 this->nested_ipa_proofs.push_back(other.ipa_proof);
69 this->nested_ipa_claims.push_back(other.ipa_claim);
70 } else {
71 // Update ipa proofs and claims (if other has no proofs/claims, we are not appending anything)
72 this->nested_ipa_proofs.insert(
73 this->nested_ipa_proofs.end(), other.nested_ipa_proofs.begin(), other.nested_ipa_proofs.end());
74 this->nested_ipa_claims.insert(
75 this->nested_ipa_claims.end(), other.nested_ipa_claims.begin(), other.nested_ipa_claims.end());
76 }
77 }
78 }
79};
80
81template <typename Builder>
82void build_constraints(Builder& builder, AcirFormat& constraints, const ProgramMetadata& metadata)
83{
85 bool collect_gates_per_opcode = metadata.collect_gates_per_opcode;
86
87 if (collect_gates_per_opcode) {
88 constraints.gates_per_opcode.resize(constraints.num_acir_opcodes, 0);
89 }
90
91 GateCounter gate_counter{ &builder, collect_gates_per_opcode };
92
93 // Add standard width-4 Ultra arithmetic gates
94 for (auto [constraint, opcode_idx] :
97 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
98 }
99
100 // When an expression doesn't fit into a single width-4 gate, we split it across multiple gates and we leverage
101 // w4_shift to use the least possible number of intermediate witnesses. See the documentation of
102 // split_into_mul_quad_gates for more information.
103 for (auto [big_constraint, opcode_idx] :
105 create_big_quad_constraint(builder, big_constraint);
106 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
107 }
108
109 // Add logic constraint
110 for (const auto& [constraint, opcode_idx] :
113 builder, constraint.a, constraint.b, constraint.result, constraint.num_bits, constraint.is_xor_gate);
114 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
115 }
116
117 // Add range constraint
118 for (const auto& [constraint, opcode_idx] :
120 builder.create_range_constraint(constraint.witness, constraint.num_bits, "");
121 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
122 }
123
124 // Add aes128 constraints
125 for (const auto& [constraint, opcode_idx] :
128 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
129 }
130
131 // Add sha256 constraints
132 for (const auto& [constraint, opcode_idx] :
135 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
136 }
137
138 // Add ECDSA k1 constraints
139 for (const auto& [constraint, opcode_idx] :
141 create_ecdsa_verify_constraints<stdlib::secp256k1<Builder>>(builder, constraint);
142 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
143 }
144
145 // Add ECDSA r1 constraints
146 for (const auto& [constraint, opcode_idx] :
148 create_ecdsa_verify_constraints<stdlib::secp256r1<Builder>>(builder, constraint);
149 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
150 }
151
152 // Add blake2s constraints
153 for (const auto& [constraint, opcode_idx] :
156 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
157 }
158
159 // Add blake3 constraints
160 for (const auto& [constraint, opcode_idx] :
163 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
164 }
165
166 // Add keccak permutations
167 for (const auto& [constraint, opcode_idx] :
170 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
171 }
172
173 // Add poseidon2 constraints
174 for (const auto& [constraint, opcode_idx] :
177 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
178 }
179
180 // Add multi scalar mul constraints
181 for (const auto& [constraint, opcode_idx] :
185 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
186 }
187
188 // Add ec add constraints
189 for (const auto& [constraint, opcode_idx] :
192 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
193 }
194
195 // Add block constraints
196 for (const auto& [constraint, opcode_indices] :
199 if (collect_gates_per_opcode) {
200 size_t avg_gates_per_opcode = gate_counter.compute_diff() / opcode_indices.size();
201 for (size_t opcode_index : opcode_indices) {
202 constraints.gates_per_opcode[opcode_index] = avg_gates_per_opcode;
203 }
204 }
205 }
206
207 // RecursionConstraints
208 bool has_honk_recursion_constraints = !constraints.honk_recursion_constraints.empty();
209 bool has_avm_recursion_constraints = !constraints.avm_recursion_constraints.empty();
210 bool has_hn_recursion_constraints = !constraints.hn_recursion_constraints.empty();
211 bool has_chonk_recursion_constraints = !constraints.chonk_recursion_constraints.empty();
212
213 if constexpr (IsMegaBuilder<Builder>) {
214 // We shouldn't have both honk recursion constraints and HN recursion constraints.
215 BB_ASSERT_EQ(!has_honk_recursion_constraints || !has_hn_recursion_constraints,
216 true,
217 "Invalid circuit: both honk and ivc recursion constraints present.");
218
219 // AVM constraints are not handled when using MegaBuilder
220 if (has_avm_recursion_constraints) {
221 info("WARNING: this circuit contains unhandled avm_recursion_constraints!");
222 }
223
224 if (has_honk_recursion_constraints) {
226 process_honk_recursion_constraints(builder, constraints, gate_counter);
227
228 // Propagate pairing points
231 inputs.set_public();
232 } else if (has_hn_recursion_constraints) {
233 process_hypernova_recursion_constraints(builder, constraints, metadata.ivc, gate_counter);
234 } else {
235 // If its an app circuit that has no recursion constraints, add default pairing points to public inputs.
237 }
238 } else {
239 bool has_pairing_points =
240 has_honk_recursion_constraints || has_chonk_recursion_constraints || has_avm_recursion_constraints;
241
242 // We only handle:
243 // - Chonk recursion constraints (Private Base Rollup)
244 // - HONK + AVM recursion constraints (Public Base Rollup)
245 // - HONK recursion constraints
246 // - AVM recursion constraints
247 // However, as mock protocol circuits use Chonk + AVM (mock Public Base Rollup), instead of throwing an assert
248 // we return a vinfo for the case of Chonk + AVM
249 BB_ASSERT_EQ(has_hn_recursion_constraints,
250 false,
251 "Invalid circuit: HN recursion constraints are present with UltraBuilder.");
252 BB_ASSERT_EQ(!(has_chonk_recursion_constraints && has_honk_recursion_constraints),
253 true,
254 "Invalid circuit: both honk and chonk recursion constraints are present.");
255 if (has_chonk_recursion_constraints && has_avm_recursion_constraints) {
256 vinfo(
257 "WARNING: both chonk and avm recursion constraints are present. While we support this combination, we "
258 "expect to see it only in a mock "
259 "circuit.");
260 }
261
262 // Container for data to be propagated
264
265 if (has_honk_recursion_constraints) {
266 honk_output = process_honk_recursion_constraints(builder, constraints, gate_counter);
267 }
268
269 if (has_chonk_recursion_constraints) {
270 honk_output = process_chonk_recursion_constraints(builder, constraints, gate_counter);
271 }
272
273 if (has_avm_recursion_constraints) {
275 process_avm_recursion_constraints(builder, constraints, gate_counter);
276
277 // Update honk_output: append (potentially 0) ipa claims and proofs.
278 // If honk output has points accumulator, aggregate it with the one coming from the avm. Otherwise, override
279 // it with the avm's one.
280 honk_output.update(avm_output, /*update_ipa_data=*/!avm_output.nested_ipa_claims.empty());
281 }
282
283 if (metadata.has_ipa_claim) {
285 // Proving with UltraRollupFlavor, we need to handle IPA
286 auto [ipa_claim, ipa_proof] =
288
289 // Set proof
290 builder.ipa_proof = ipa_proof;
291
292 // Propagate public inputs
293 IO inputs;
294 inputs.pairing_inputs =
295 has_pairing_points ? honk_output.points_accumulator : PairingPoints::construct_default();
296 inputs.ipa_claim = ipa_claim;
297 inputs.set_public();
298 } else {
300
301 if (honk_output.is_root_rollup) {
302 // The root rollup performs full IPA verification
304 } else {
305 // We shouldn't accidentally have IPA proofs.
306 BB_ASSERT_EQ(honk_output.nested_ipa_proofs.size(),
307 static_cast<size_t>(0),
308 "IPA proofs present when not expected.");
309 }
310
311 // Propagate public inputs
312 if (has_pairing_points) {
313 IO inputs;
314 inputs.pairing_inputs = honk_output.points_accumulator;
315 inputs.set_public();
316 } else {
317 IO::add_default(builder);
318 }
319 }
320 }
321}
322
331template <typename Builder>
333 const std::vector<OpeningClaim<stdlib::grumpkin<Builder>>>& nested_ipa_claims,
334 const std::vector<stdlib::Proof<Builder>>& nested_ipa_proofs)
335{
337
339 nested_ipa_claims.size(), nested_ipa_proofs.size(), "Mismatched number of nested IPA claims and proofs.");
340 BB_ASSERT_EQ(nested_ipa_claims.size(), 2U, "Root rollup must have two nested IPA claims.");
341
342 auto [ipa_claim, ipa_proof] = handle_IPA_accumulation(builder, nested_ipa_claims, nested_ipa_proofs);
343
344 // IPA verification
346 &builder, 1 << CONST_ECCVM_LOG_N, VerifierCommitmentKey<curve::Grumpkin>(1 << CONST_ECCVM_LOG_N));
347
348 auto accumulated_ipa_transcript = std::make_shared<StdlibTranscript>(stdlib::Proof<Builder>(builder, ipa_proof));
349 IPA<stdlib::grumpkin<Builder>>::full_verify_recursive(
350 verifier_commitment_key, ipa_claim, accumulated_ipa_transcript);
351}
352
361template <typename Builder>
364 const std::vector<OpeningClaim<stdlib::grumpkin<Builder>>>& nested_ipa_claims,
365 const std::vector<stdlib::Proof<Builder>>& nested_ipa_proofs)
366{
368 nested_ipa_claims.size(), nested_ipa_proofs.size(), "Mismatched number of nested IPA claims and proofs.");
369
371 HonkProof final_ipa_proof;
372
373 if (nested_ipa_claims.size() == 2) {
374 // If we have two claims, accumulate.
375 CommitmentKey<curve::Grumpkin> commitment_key(1 << CONST_ECCVM_LOG_N);
377
378 auto ipa_transcript_1 = std::make_shared<StdlibTranscript>(nested_ipa_proofs[0]);
379 auto ipa_transcript_2 = std::make_shared<StdlibTranscript>(nested_ipa_proofs[1]);
380 auto [ipa_claim, ipa_proof] = IPA<stdlib::grumpkin<Builder>>::accumulate(
381 commitment_key, ipa_transcript_1, nested_ipa_claims[0], ipa_transcript_2, nested_ipa_claims[1]);
382
383 final_ipa_claim = ipa_claim;
384 final_ipa_proof = ipa_proof;
385 } else if (nested_ipa_claims.size() == 1) {
386 // If we have one claim, just forward it along.
387 final_ipa_claim = nested_ipa_claims[0];
388 // This conversion looks suspicious but there's no need to make this an output of the circuit since
389 // its a proof that will be checked anyway.
390 final_ipa_proof = nested_ipa_proofs[0].get_value();
391 } else if (nested_ipa_claims.empty()) {
392 // If we don't have any claims, we may need to inject a fake one if we're proving with
393 // UltraRollupHonk, indicated by the manual setting of the honk_recursion metadata to 2.
394 info("Proving with UltraRollupHonk but no IPA claims exist.");
395 auto [stdlib_opening_claim, ipa_proof] =
396 IPA<stdlib::grumpkin<Builder>>::create_random_valid_ipa_claim_and_proof(builder);
397
398 final_ipa_claim = stdlib_opening_claim;
399 final_ipa_proof = ipa_proof;
400 } else {
401 // We don't support and shouldn't expect to support circuits with 3+ IPA recursive verifiers.
402 throw_or_abort("Too many nested IPA claims to accumulate");
403 }
404
405 BB_ASSERT_EQ(final_ipa_proof.size(), IPA_PROOF_LENGTH);
406
407 // Return the IPA claim and proof
408 return { final_ipa_claim, final_ipa_proof };
409}
410
411template <typename Builder>
412[[nodiscard("IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<Builder>
414{
416 // Add recursion constraints
417 for (const auto& [constraint, opcode_idx] : zip_view(
419 HonkRecursionConstraintOutput<Builder> honk_recursion_constraint;
420
421 if (constraint.proof_type == HONK_ZK) {
422 honk_recursion_constraint =
423 create_honk_recursion_constraints<UltraZKRecursiveFlavor_<Builder>>(builder, constraint);
424 } else if (constraint.proof_type == HONK) {
425 honk_recursion_constraint =
426 create_honk_recursion_constraints<UltraRecursiveFlavor_<Builder>>(builder, constraint);
427 } else if (constraint.proof_type == ROLLUP_HONK || constraint.proof_type == ROOT_ROLLUP_HONK) {
428 if constexpr (!IsUltraBuilder<Builder>) {
429 throw_or_abort("Rollup Honk proof type not supported on MegaBuilder");
430 } else {
431 honk_recursion_constraint =
432 create_honk_recursion_constraints<UltraRollupRecursiveFlavor_<Builder>>(builder, constraint);
433 }
434 } else {
435 throw_or_abort("Invalid Honk proof type");
436 }
437
438 // Update output
439 output.update(honk_recursion_constraint,
440 /*update_ipa_data=*/constraint.proof_type == ROLLUP_HONK ||
441 constraint.proof_type == ROOT_ROLLUP_HONK);
442 output.is_root_rollup = constraint.proof_type == ROOT_ROLLUP_HONK;
443
444 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
445 }
446 BB_ASSERT(!(output.is_root_rollup && output.nested_ipa_claims.size() != 2),
447 "Root rollup must accumulate two IPA proofs.");
448 return output;
449}
450
452 AcirFormat& constraints,
455{
456 using StdlibVerificationKey = Chonk::RecursiveVerificationKey;
457 using StdlibVKAndHash = Chonk::RecursiveVKAndHash;
458 using StdlibFF = Chonk::RecursiveFlavor::FF;
459
460 // Lambda template to handle both Chonk and Chonk with the same code
461 auto process_with_ivc = [&]<typename IVCType>(const std::shared_ptr<IVCType>& ivc) {
462 // We expect the length of the internal verification queue to match the number of ivc recursion constraints
463 BB_ASSERT_EQ(constraints.hn_recursion_constraints.size(),
464 ivc->verification_queue.size(),
465 "WARNING: Mismatch in number of recursive verifications during kernel creation!");
466
467 // If no witness is provided, populate the VK and public inputs in the recursion constraint with dummy values so
468 // that the present kernel circuit is constructed correctly. (Used for constructing VKs without witnesses).
469 if (builder.is_write_vk_mode()) {
470 // Create stdlib representations of each {proof, vkey} pair to be recursively verified
471 for (auto [constraint, queue_entry] :
472 zip_view(constraints.hn_recursion_constraints, ivc->verification_queue)) {
473 populate_dummy_vk_in_constraint(builder, queue_entry.honk_vk, constraint.key);
474 builder.set_variable(constraint.key_hash, queue_entry.honk_vk->hash());
475 }
476 }
477
478 // Construct a stdlib verification key for each constraint based on the verification key witness indices
479 // therein
481 stdlib_vk_and_hashs.reserve(constraints.hn_recursion_constraints.size());
482 for (const auto& constraint : constraints.hn_recursion_constraints) {
483 stdlib_vk_and_hashs.push_back(std::make_shared<StdlibVKAndHash>(
485 StdlibVerificationKey::from_witness_indices(builder, constraint.key)),
486 StdlibFF::from_witness_index(&builder, constraint.key_hash)));
487 }
488 // Create stdlib representations of each {proof, vkey} pair to be recursively verified
489 ivc->instantiate_stdlib_verification_queue(builder, stdlib_vk_and_hashs);
490
491 // Connect the public_input witnesses in each constraint to the corresponding public input witnesses in the
492 // internal verification queue. This ensures that the witnesses utilized in constraints generated based on
493 // acir are properly connected to the constraints generated herein via the ivc scheme (e.g. recursive
494 // verifications).
495 for (auto [constraint, queue_entry] :
496 zip_view(constraints.hn_recursion_constraints, ivc->stdlib_verification_queue)) {
497
498 // Get the witness indices for the public inputs contained within the proof in the verification queue
499 std::vector<uint32_t> public_input_indices =
501 constraint.public_inputs.size());
502
503 // Assert equality between the internal public input witness indices and those in the acir constraint
504 for (auto [witness_idx, constraint_witness_idx] :
505 zip_view(public_input_indices, constraint.public_inputs)) {
506 builder.assert_equal(witness_idx, constraint_witness_idx);
507 }
508 }
509
510 // Complete the kernel circuit with all required recursive verifications, databus consistency checks etc.
511 ivc->complete_kernel_circuit_logic(builder);
512
513 // Note: we can't easily track the gate contribution from each individual hn_recursion_constraint since they
514 // are handled simultaneously in the above function call; instead we track the total contribution
515 gate_counter.track_diff(constraints.gates_per_opcode,
517 };
518
519 // If an ivc instance is not provided, we mock one with the state required to construct the recursion
520 // constraints present in the program. This is for when we write_vk.
521 if (ivc_base == nullptr) {
522
524 process_with_ivc(mock_ivc);
525 } else {
526 auto sumcheck_ivc = std::static_pointer_cast<Chonk>(ivc_base);
527 process_with_ivc(sumcheck_ivc);
528 }
529}
530
531[[nodiscard("IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<UltraCircuitBuilder>
533 AcirFormat& constraints,
535{
537 // Add recursion constraints
538 for (const auto& [constraint, opcode_idx] :
543
544 // Update the output
545 output.update(honk_output, /*update_ipa_data=*/true);
546
547 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
548 }
549
550 return output;
551}
552
553[[nodiscard("IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintsOutput<UltraCircuitBuilder>
555 AcirFormat& constraints,
557{
559 // Add recursion constraints
560 for (const auto& [constraint, opcode_idx] : zip_view(
564
565 // Update the output
566 output.update(avm2_recursion_output, /*update_ipa_data=*/true);
567
568 gate_counter.track_diff(constraints.gates_per_opcode, opcode_idx);
569 }
570 return output;
571}
572
579template <> UltraCircuitBuilder create_circuit(AcirProgram& program, const ProgramMetadata& metadata)
580{
581 BB_BENCH();
582 AcirFormat& constraints = program.constraints;
583 WitnessVector& witness = program.witness;
584 const bool is_write_vk_mode = witness.empty();
585
586 if (!is_write_vk_mode) {
587 BB_ASSERT_EQ(witness.size(),
588 constraints.max_witness_index + 1,
589 "ACIR witness size (" << witness.size() << ") does not match max witness index ("
590 << constraints.max_witness_index << ").");
591 } else {
592 witness.resize(constraints.max_witness_index + 1, 0);
593 }
594
595 UltraCircuitBuilder builder{ metadata.size_hint, witness, constraints.public_inputs, is_write_vk_mode };
596
597 // Populate constraints in the builder
598 build_constraints(builder, constraints, metadata);
599
600 vinfo("Created circuit");
601
602 return builder;
603};
604
611template <> MegaCircuitBuilder create_circuit(AcirProgram& program, const ProgramMetadata& metadata)
612{
613 BB_BENCH();
614 AcirFormat& constraints = program.constraints;
615 WitnessVector& witness = program.witness;
616 const bool is_write_vk_mode = witness.empty();
617
618 if (!is_write_vk_mode) {
619 BB_ASSERT_EQ(witness.size(),
620 constraints.max_witness_index + 1,
621 "ACIR witness size (" << witness.size() << ") does not match max witness index ("
622 << constraints.max_witness_index << ").");
623 } else {
624 witness.resize(constraints.max_witness_index + 1, 0);
625 }
626
627 auto op_queue = (metadata.ivc == nullptr) ? std::make_shared<ECCOpQueue>() : metadata.ivc->get_goblin().op_queue;
628
629 // Construct a builder using the witness and public input data from acir and with the goblin-owned op_queue
630 MegaCircuitBuilder builder{ op_queue, witness, constraints.public_inputs, is_write_vk_mode };
631
632 // Populate constraints in the builder
633 build_constraints(builder, constraints, metadata);
634
635 vinfo("Created circuit");
636
637 return builder;
638};
639
642
643} // namespace acir_format
#define BB_ASSERT(expression,...)
Definition assert.hpp:67
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:77
#define BB_BENCH()
Definition bb_bench.hpp:223
Shared type definitions for the Barretenberg RPC API.
Utility class for tracking the gate count of acir constraints.
void track_diff(std::vector< size_t > &gates_per_opcode, size_t opcode_index)
static std::vector< uint32_t > get_public_inputs_witness_indices_from_proof(const bb::stdlib::Proof< bb::MegaCircuitBuilder > &proof, const size_t num_public_inputs_to_extract)
Get the witness indices for a given number of public inputs contained within a stdlib proof.
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
RecursiveFlavor::VerificationKey RecursiveVerificationKey
Definition chonk.hpp:63
RecursiveFlavor::VKAndHash RecursiveVKAndHash
Definition chonk.hpp:64
CommitmentKey object over a pairing group 𝔾₁.
IPA (inner product argument) commitment scheme class.
Definition ipa.hpp:93
typename Curve::ScalarField FF
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:53
An object storing two EC points that represent the inputs to a pairing check.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:19
Manages the data that is propagated on the public inputs of an application/function circuit.
static void add_default(Builder &builder)
Add default public inputs when they are not present.
The data that is propagated on the public inputs of a rollup circuit.
#define vinfo(...)
Definition log.hpp:80
void info(Args... args)
Definition log.hpp:75
AluTraceBuilder builder
Definition alu.test.cpp:124
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
AvmProvingInputs inputs
HonkRecursionConstraintOutput< bb::UltraCircuitBuilder > create_avm2_recursion_constraints_goblin(bb::UltraCircuitBuilder &builder, const RecursionConstraint &input)
Stub implementation for AVM2 recursion constraints.
void perform_full_IPA_verification(Builder &builder, const std::vector< OpeningClaim< stdlib::grumpkin< Builder > > > &nested_ipa_claims, const std::vector< stdlib::Proof< Builder > > &nested_ipa_proofs)
Perform full recursive IPA verification.
void create_quad_constraint(Builder &builder, bb::mul_quad_< typename Builder::FF > &mul_quad)
Create a simple width-4 Ultra arithmetic gate constraint representing the equation.
template void build_constraints< MegaCircuitBuilder >(MegaCircuitBuilder &, AcirFormat &, const ProgramMetadata &)
void create_block_constraints(UltraCircuitBuilder &builder, const BlockConstraint &constraint, bool has_valid_witness_assignments)
Create block constraints; Specialization for Ultra arithmetization.
template void build_constraints< UltraCircuitBuilder >(UltraCircuitBuilder &, AcirFormat &, const ProgramMetadata &)
std::shared_ptr< Chonk > create_mock_chonk_from_constraints(const std::vector< RecursionConstraint > &constraints)
Create an IVC object with mocked state corresponding to a set of IVC recursion constraints.
void create_blake3_constraints(Builder &builder, const Blake3Constraint &constraint)
HonkRecursionConstraintsOutput< UltraCircuitBuilder > process_chonk_recursion_constraints(UltraCircuitBuilder &builder, AcirFormat &constraints, GateCounter< UltraCircuitBuilder > &gate_counter)
std::vector< bb::fr > WitnessVector
HonkRecursionConstraintsOutput< Builder > process_honk_recursion_constraints(Builder &builder, AcirFormat &constraints, GateCounter< Builder > &gate_counter)
void create_keccak_permutations_constraints(Builder &builder, const Keccakf1600 &constraint)
void create_ec_add_constraint(Builder &builder, const EcAdd &input)
Create constraints for addition of two points on the Grumpkin curve.
void build_constraints(Builder &builder, AcirFormat &constraints, const ProgramMetadata &metadata)
void create_blake2s_constraints(Builder &builder, const Blake2sConstraint &constraint)
std::pair< OpeningClaim< stdlib::grumpkin< Builder > >, HonkProof > handle_IPA_accumulation(Builder &builder, const std::vector< OpeningClaim< stdlib::grumpkin< Builder > > > &nested_ipa_claims, const std::vector< stdlib::Proof< Builder > > &nested_ipa_proofs)
Set the IPA claim and proof.
UltraCircuitBuilder create_circuit(AcirProgram &program, const ProgramMetadata &metadata)
Specialization for creating an Ultra circuit from an acir program.
void create_sha256_compression_constraints(Builder &builder, const Sha256Compression &constraint)
void populate_dummy_vk_in_constraint(MegaCircuitBuilder &builder, const std::shared_ptr< MegaFlavor::VerificationKey > &mock_verification_key, std::vector< uint32_t > &key_witness_indices)
Populate VK witness fields from a recursion constraint from a provided VerificationKey.
void create_aes128_constraints(Builder &builder, const AES128Constraint &constraint)
void create_multi_scalar_mul_constraint(Builder &builder, const MultiScalarMul &constraint_input)
Create constraints for multi-scalar multiplication on the Grumpkin curve.
void create_poseidon2_permutations_constraints(Builder &builder, const Poseidon2Constraint &constraint)
void create_big_quad_constraint(Builder &builder, std::vector< mul_quad_< typename Builder::FF > > &big_constraint)
HonkRecursionConstraintOutput< bb::UltraCircuitBuilder > create_chonk_recursion_constraints(bb::UltraCircuitBuilder &builder, const RecursionConstraint &input)
Add constraints associated with recursive verification of a Chonk proof.
void process_hypernova_recursion_constraints(MegaCircuitBuilder &builder, AcirFormat &constraints, std::shared_ptr< IVCBase > ivc_base, GateCounter< MegaCircuitBuilder > &gate_counter)
HonkRecursionConstraintsOutput< UltraCircuitBuilder > process_avm_recursion_constraints(UltraCircuitBuilder &builder, AcirFormat &constraints, GateCounter< UltraCircuitBuilder > &gate_counter)
void create_logic_gate(Builder &builder, const WitnessOrConstant< bb::fr > a, const WitnessOrConstant< bb::fr > b, const uint32_t result, const size_t num_bits, const bool is_xor_gate)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
BaseTranscript< stdlib::StdlibCodec< stdlib::field_t< UltraCircuitBuilder > >, stdlib::poseidon2< UltraCircuitBuilder > > UltraStdlibTranscript
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< MultiScalarMul > multi_scalar_mul_constraints
std::vector< Blake2sConstraint > blake2s_constraints
std::vector< Sha256Compression > sha256_compression
std::vector< Poseidon2Constraint > poseidon2_constraints
std::vector< LogicConstraint > logic_constraints
std::vector< QuadConstraints > quad_constraints
std::vector< EcAdd > ec_add_constraints
std::vector< Keccakf1600 > keccak_permutations
std::vector< RecursionConstraint > honk_recursion_constraints
std::vector< Blake3Constraint > blake3_constraints
std::vector< EcdsaConstraint > ecdsa_r1_constraints
std::vector< RangeConstraint > range_constraints
std::vector< AES128Constraint > aes128_constraints
AcirFormatOriginalOpcodeIndices original_opcode_indices
std::vector< BlockConstraint > block_constraints
std::vector< EcdsaConstraint > ecdsa_k1_constraints
std::vector< RecursionConstraint > hn_recursion_constraints
std::vector< uint32_t > public_inputs
std::vector< size_t > gates_per_opcode
std::vector< RecursionConstraint > avm_recursion_constraints
std::vector< RecursionConstraint > chonk_recursion_constraints
std::vector< std::vector< QuadConstraints > > big_quad_constraints
std::vector< std::vector< size_t > > block_constraints
void update(T &other, bool update_ipa_data)
std::vector< stdlib::Proof< Builder > > nested_ipa_proofs
std::vector< OpeningClaim< stdlib::grumpkin< Builder > > > nested_ipa_claims
std::shared_ptr< bb::IVCBase > ivc
Curve grumpkin in circuit setting.
Definition grumpkin.hpp:21
void aggregate(PairingPoints const &other)
Compute a linear combination of the present pairing points with an input set of pairing points.
static PairingPoints construct_default()
Construct default pairing points.
void throw_or_abort(std::string const &err)