Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
avm2_recursion_constraint.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [Federico], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
8
10
23
24#include <cstddef>
25
26namespace acir_format {
27
28using namespace bb;
29
30namespace {
31
48void create_dummy_proof(Builder& builder, [[maybe_unused]] size_t proof_size, const std::vector<field_ct>& proof_fields)
49{
50 // TODO(https://github.com/AztecProtocol/barretenberg/issues/1514): restructure this function to use functions from
51 // mock_verifier_inputs
52 using Flavor = avm2::AvmFlavor;
53
54 // a lambda that sets dummy commitments
55 auto set_dummy_commitment = [&builder](const std::vector<stdlib::field_t<Builder>>& fields, size_t& offset) {
56 auto comm = curve::BN254::AffineElement::one() * fr::random_element();
57 auto frs = FrCodec::serialize_to_fields(comm);
58 builder.set_variable(fields[offset].get_witness_index(), frs[0]);
59 builder.set_variable(fields[offset + 1].get_witness_index(), frs[1]);
60 builder.set_variable(fields[offset + 2].get_witness_index(), frs[2]);
61 builder.set_variable(fields[offset + 3].get_witness_index(), frs[3]);
62 offset += 4;
63 };
64 // a lambda that sets dummy evaluation in proof fields vector
65 auto set_dummy_evaluation_in_proof_fields = [&](size_t& offset) {
66 builder.set_variable(proof_fields[offset].get_witness_index(), fr::random_element());
67 offset++;
68 };
69
70 // This routine is adding some placeholders for avm proof and avm vk in the case where witnesses are not present.
71 size_t offset = 0;
72
73 // Witness Commitments
74 for (size_t i = 0; i < Flavor::NUM_WITNESS_ENTITIES; i++) {
75 set_dummy_commitment(proof_fields, offset);
76 }
77
78 // now the univariates
80 set_dummy_evaluation_in_proof_fields(offset);
81 }
82
83 // now the sumcheck evaluations
84 for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; i++) {
85 set_dummy_evaluation_in_proof_fields(offset);
86 }
87
88 // now the gemini fold commitments which are CONST_PROOF_SIZE_LOG_N - 1
89 for (size_t i = 1; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
90 set_dummy_commitment(proof_fields, offset);
91 }
92
93 // the gemini fold evaluations which are CONST_PROOF_SIZE_LOG_N
94 for (size_t i = 0; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
95 set_dummy_evaluation_in_proof_fields(offset);
96 }
97
98 // lastly the shplonk batched quotient commitment and kzg quotient commitment
99 for (size_t i = 0; i < 2; i++) {
100 set_dummy_commitment(proof_fields, offset);
101 }
102
103 // TODO(#13390): Revive the following assertion once we freeze the number of colums in AVM.
104 // BB_ASSERT(offset == proof_size);
105}
106
107} // namespace
108
119 const RecursionConstraint& input)
120{
121 using RecursiveVerifier = avm2::AvmGoblinRecursiveVerifier;
122
124
125 // Construct in-circuit representations of the proof and public inputs
126 const auto proof_fields = fields_from_witnesses(builder, input.proof);
127 const auto public_inputs_flattened = fields_from_witnesses(builder, input.public_inputs);
128
129 // Populate the key fields and proof fields with dummy values to prevent issues (e.g. points must be on curve).
130 if (builder.is_write_vk_mode()) {
131 create_dummy_proof(builder, input.proof.size(), proof_fields);
132 }
133
134 // Execute the Goblin AVM2 recursive verifier
135 RecursiveVerifier verifier(builder);
136
138 verifier.verify_proof(proof_fields, bb::avm2::PublicInputs::flat_to_columns(public_inputs_flattened));
139
140 return output;
141}
142
143} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:93
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
static std::vector< fr > serialize_to_fields(const T &val)
Conversion from transcript values to bb::frs.
An object storing two EC points that represent the inputs to a pairing check.
Recursive verifier of AVM2 proofs that utilizes the Goblin mechanism for efficient EC operations.
AluTraceBuilder builder
Definition alu.test.cpp:124
ssize_t offset
Definition engine.cpp:36
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
HonkRecursionConstraintOutput< bb::UltraCircuitBuilder > create_avm2_recursion_constraints_goblin(bb::UltraCircuitBuilder &builder, const RecursionConstraint &input)
Stub implementation for AVM2 recursion constraints.
std::vector< field_t< Builder > > fields_from_witnesses(Builder &builder, std::span< const uint32_t > witness_indices)
========== ACIR TO BARRETENBERG ========== ///
Definition utils.cpp:16
constexpr std::size_t MAX_AVM_TRACE_LOG_SIZE
Definition constants.hpp:12
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
RecursionConstraint struct contains information required to recursively verify a proof.
static std::vector< std::vector< FF_ > > flat_to_columns(const std::vector< FF_ > &input)
Definition avm_io.hpp:65
static field random_element(numeric::RNG *engine=nullptr) noexcept
An object storing two EC points that represent the inputs to a pairing check.
Output type for recursive ultra verification.