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
10
23
24#include <cstddef>
25
26namespace acir_format {
27
28using namespace bb;
29
30namespace {
31
49 [[maybe_unused]] size_t proof_size,
50 const std::vector<field_ct>& key_fields,
51 const std::vector<field_ct>& proof_fields)
52{
53 // TODO(https://github.com/AztecProtocol/barretenberg/issues/1514): restructure this function to use functions from
54 // mock_verifier_inputs
55 using Flavor = avm2::AvmFlavor;
56
57 // a lambda that sets dummy commitments
58 auto set_dummy_commitment = [&builder](const std::vector<stdlib::field_t<Builder>>& fields, size_t& offset) {
59 auto comm = curve::BN254::AffineElement::one() * fr::random_element();
60 auto frs = FrCodec::serialize_to_fields(comm);
61 builder.set_variable(fields[offset].get_witness_index(), frs[0]);
62 builder.set_variable(fields[offset + 1].get_witness_index(), frs[1]);
63 builder.set_variable(fields[offset + 2].get_witness_index(), frs[2]);
64 builder.set_variable(fields[offset + 3].get_witness_index(), frs[3]);
65 offset += 4;
66 };
67 // a lambda that sets dummy evaluation in proof fields vector
68 auto set_dummy_evaluation_in_proof_fields = [&](size_t& offset) {
69 builder.set_variable(proof_fields[offset].get_witness_index(), fr::random_element());
70 offset++;
71 };
72
73 size_t offset = 0;
74 for (size_t i = 0; i < Flavor::NUM_PRECOMPUTED_ENTITIES; ++i) {
75 set_dummy_commitment(key_fields, offset);
76 }
77
78 // This routine is adding some placeholders for avm proof and avm vk in the case where witnesses are not present.
79 // TODO(#14234)[Unconditional PIs validation]: Remove next line and use offset == 0 for subsequent line.
80 builder.set_variable(proof_fields[0].get_witness_index(), 1);
81 offset = 1; // TODO(#14234)[Unconditional PIs validation]: reset offset = 1
82
83 // Witness Commitments
84 for (size_t i = 0; i < Flavor::NUM_WITNESS_ENTITIES; i++) {
85 set_dummy_commitment(proof_fields, offset);
86 }
87
88 // now the univariates
90 set_dummy_evaluation_in_proof_fields(offset);
91 }
92
93 // now the sumcheck evaluations
94 for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; i++) {
95 set_dummy_evaluation_in_proof_fields(offset);
96 }
97
98 // now the gemini fold commitments which are CONST_PROOF_SIZE_LOG_N - 1
99 for (size_t i = 1; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
100 set_dummy_commitment(proof_fields, offset);
101 }
102
103 // the gemini fold evaluations which are CONST_PROOF_SIZE_LOG_N
104 for (size_t i = 0; i < avm2::MAX_AVM_TRACE_LOG_SIZE; i++) {
105 set_dummy_evaluation_in_proof_fields(offset);
106 }
107
108 // lastly the shplonk batched quotient commitment and kzg quotient commitment
109 for (size_t i = 0; i < 2; i++) {
110 set_dummy_commitment(proof_fields, offset);
111 }
112
113 // TODO(#13390): Revive the following assertion once we freeze the number of colums in AVM.
114 // BB_ASSERT(offset == proof_size);
115}
116
117} // namespace
118
129 const RecursionConstraint& input)
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 (builder.is_write_vk_mode()) {
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
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:77
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t NUM_PRECOMPUTED_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.
void create_dummy_vkey_and_proof(UltraCircuitBuilder &builder, size_t proof_size, size_t public_inputs_size, const std::vector< stdlib::field_t< UltraCircuitBuilder > > &key_fields, const std::vector< stdlib::field_t< UltraCircuitBuilder > > &proof_fields)
Creates a dummy vkey and proof object.
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< 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)
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.