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: 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
8#ifndef DISABLE_AZTEC_VM
9
11
24
25#include <cstddef>
26
27namespace acir_format {
28
29using namespace bb;
33
34namespace {
48 [[maybe_unused]] size_t proof_size,
49 const std::vector<field_ct>& key_fields,
50 const std::vector<field_ct>& proof_fields)
51{
52 // TODO(https://github.com/AztecProtocol/barretenberg/issues/1514): restructure this function to use functions from
53 // mock_verifier_inputs
54 using Flavor = avm2::AvmFlavor;
55
56 // a lambda that sets dummy commitments
57 auto set_dummy_commitment = [&builder](const std::vector<stdlib::field_t<Builder>>& fields, size_t& offset) {
58 auto comm = curve::BN254::AffineElement::one() * fr::random_element();
60 builder.set_variable(fields[offset].witness_index, frs[0]);
61 builder.set_variable(fields[offset + 1].witness_index, frs[1]);
62 builder.set_variable(fields[offset + 2].witness_index, frs[2]);
63 builder.set_variable(fields[offset + 3].witness_index, frs[3]);
64 offset += 4;
65 };
66 // a lambda that sets dummy evaluation in proof fields vector
67 auto set_dummy_evaluation_in_proof_fields = [&](size_t& offset) {
68 builder.set_variable(proof_fields[offset].witness_index, fr::random_element());
69 offset++;
70 };
71
72 size_t offset = 0;
73 for (size_t i = 0; i < Flavor::NUM_PRECOMPUTED_ENTITIES; ++i) {
74 set_dummy_commitment(key_fields, offset);
75 }
76
77 // This routine is adding some placeholders for avm proof and avm vk in the case where witnesses are not present.
78 // TODO(#14234)[Unconditional PIs validation]: Remove next line and use offset == 0 for subsequent line.
79 builder.set_variable(proof_fields[0].witness_index, 1);
80 offset = 1; // TODO(#14234)[Unconditional PIs validation]: reset offset = 1
81
82 // Witness Commitments
83 for (size_t i = 0; i < Flavor::NUM_WITNESS_ENTITIES; i++) {
84 set_dummy_commitment(proof_fields, offset);
85 }
86
87 // now the univariates
89 set_dummy_evaluation_in_proof_fields(offset);
90 }
91
92 // now the sumcheck evaluations
93 for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; i++) {
94 set_dummy_evaluation_in_proof_fields(offset);
95 }
96
97 // now the gemini fold commitments which are CONST_PROOF_SIZE_LOG_N - 1
98 for (size_t i = 1; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
99 set_dummy_commitment(proof_fields, offset);
100 }
101
102 // the gemini fold evaluations which are CONST_PROOF_SIZE_LOG_N
103 for (size_t i = 0; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
104 set_dummy_evaluation_in_proof_fields(offset);
105 }
106
107 // lastly the shplonk batched quotient commitment and kzg quotient commitment
108 for (size_t i = 0; i < 2; i++) {
109 set_dummy_commitment(proof_fields, offset);
110 }
111
112 // TODO(#13390): Revive the following assertion once we freeze the number of colums in AVM.
113 // ASSERT(offset == proof_size);
114}
115
116} // namespace
117
128 const RecursionConstraint& input,
129 bool has_valid_witness_assignments)
130{
131 using RecursiveVerifier = avm2::AvmGoblinRecursiveVerifier;
132
134
135 // Construct in-circuit representations of the verification key, proof and public inputs
136 const auto key_fields = RecursionConstraint::fields_from_witnesses(builder, input.key);
137 const auto proof_fields = RecursionConstraint::fields_from_witnesses(builder, input.proof);
138 const auto public_inputs_flattened = RecursionConstraint::fields_from_witnesses(builder, input.public_inputs);
139
140 // Populate the key fields and proof fields with dummy values to prevent issues (e.g. points must be on curve).
141 if (!has_valid_witness_assignments) {
142 create_dummy_vkey_and_proof(builder, input.proof.size(), key_fields, proof_fields);
143 }
144
145 // Execute the Goblin AVM2 recursive verifier
146 RecursiveVerifier verifier(builder, key_fields);
147
149 verifier.verify_proof(proof_fields, bb::avm2::PublicInputs::flat_to_columns(public_inputs_flattened));
150
151 return output;
152}
153
154} // namespace acir_format
155#endif // DISABLE_AZTEC_VM
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
static constexpr size_t NUM_PRECOMPUTED_ENTITIES
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
An object storing two bn254 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:123
ssize_t offset
Definition engine.cpp:36
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
HonkRecursionConstraintOutput< Builder > create_avm2_recursion_constraints_goblin(Builder &builder, const RecursionConstraint &input, bool has_valid_witness_assignments)
Add constraints associated with recursive verification of an AVM2 proof using Goblin.
void create_dummy_vkey_and_proof(Builder &builder, size_t proof_size, size_t public_inputs_size, const std::vector< field_ct > &key_fields, const std::vector< field_ct > &proof_fields)
Creates a dummy vkey and proof object.
constexpr size_t MAX_AVM_TRACE_LOG_SIZE
Definition constants.hpp:9
std::vector< bb::fr > convert_to_bn254_frs(const T &val)
Conversion from transcript values to bb::frs.
Entry point for Barretenberg command-line interface.
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< bb::stdlib::field_t< Builder > > fields_from_witnesses(Builder &builder, const std::vector< uint32_t > &witness_indices)
static std::vector< std::vector< FF_ > > flat_to_columns(const std::vector< FF_ > &input)
static field random_element(numeric::RNG *engine=nullptr) noexcept
An object storing two EC points that represent the inputs to a pairing check.