Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
mock_verifier_inputs.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
17#include "proof_surgeon.hpp"
19
20namespace acir_format {
21
22using namespace bb;
23
30template <class Curve = curve::BN254>
31void populate_field_elements_for_mock_commitments(std::vector<fr>& fields, const size_t& num_commitments)
32{
33 auto mock_commitment = Curve::AffineElement::one();
34 std::vector<fr> mock_commitment_frs = field_conversion::convert_to_bn254_frs(mock_commitment);
35 for (size_t i = 0; i < num_commitments; ++i) {
36 for (const fr& val : mock_commitment_frs) {
37 fields.emplace_back(val);
38 }
39 }
40}
41
49template <class FF = curve::BN254::ScalarField>
50void populate_field_elements(std::vector<fr>& fields,
51 const size_t& num_elements,
53{
54 for (size_t i = 0; i < num_elements; ++i) {
55 std::vector<fr> field_elements = value.has_value()
58 fields.insert(fields.end(), field_elements.begin(), field_elements.end());
59 }
60}
61
67template <typename Flavor, class PublicInputs> HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size)
68{
69 HonkProof proof;
70
71 // Populate mock public inputs
72 typename PublicInputs::Builder builder;
73 PublicInputs::add_default(builder);
74
75 // Populate the proof with as many public inputs as required from the ACIR constraints
76 populate_field_elements<fr>(proof, inner_public_inputs_size);
77
78 // Populate the proof with the public inputs added from barretenberg
79 for (const auto& pub : builder.public_inputs()) {
80 proof.emplace_back(builder.get_variable(pub));
81 }
82
83 // Populate mock witness polynomial commitments
85
86 return proof;
87}
88
93template <typename Flavor> HonkProof create_mock_decider_proof()
94{
95 using FF = Flavor::FF;
96 using Curve = Flavor::Curve;
97 HonkProof proof;
98
99 constexpr size_t const_proof_log_n = Flavor::VIRTUAL_LOG_N;
100
101 if constexpr (Flavor::HasZK) {
102 // Libra concatenation commitment
103 populate_field_elements_for_mock_commitments<Curve>(proof, 1);
104
105 // Libra sum
106 populate_field_elements<FF>(proof, 1);
107 }
108
109 // Sumcheck univariates
110 const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = const_proof_log_n * Flavor::BATCHED_RELATION_PARTIAL_LENGTH;
111 populate_field_elements<FF>(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES);
112
113 // Sumcheck multilinear evaluations
114 populate_field_elements<FF>(proof, Flavor::NUM_ALL_ENTITIES);
115
116 if constexpr (Flavor::HasZK) {
117 // Libra claimed evaluation
118 populate_field_elements<FF>(proof, 1);
119
120 // Libra grand sum commitment
121 populate_field_elements_for_mock_commitments<Curve>(proof, 1);
122
123 // Libra quotient commitment
124 populate_field_elements_for_mock_commitments<Curve>(proof, 1);
125
126 // Gemini masking commitment
127 populate_field_elements_for_mock_commitments<Curve>(proof, 1);
128
129 // Gemini masking evaluation
130 populate_field_elements<FF>(proof, 1);
131 }
132
133 // Gemini fold commitments
134 const size_t NUM_GEMINI_FOLD_COMMITMENTS = const_proof_log_n - 1;
135 populate_field_elements_for_mock_commitments<Curve>(proof, NUM_GEMINI_FOLD_COMMITMENTS);
136
137 // Gemini fold evaluations
138 const size_t NUM_GEMINI_FOLD_EVALUATIONS = const_proof_log_n;
139 populate_field_elements<FF>(proof, NUM_GEMINI_FOLD_EVALUATIONS);
140
142 // Gemini P pos evaluation
143 populate_field_elements<FF>(proof, 1);
144
145 // Gemini P neg evaluation
146 populate_field_elements<FF>(proof, 1);
147 }
148
149 if constexpr (Flavor::HasZK) {
150 // NUM_SMALL_IPA_EVALUATIONS libra evals
151 populate_field_elements<FF>(proof, NUM_SMALL_IPA_EVALUATIONS);
152 }
153
154 // Shplonk batched quotient commitment
155 populate_field_elements_for_mock_commitments<Curve>(proof, /*num_commitments=*/1);
156 // KZG quotient commitment
157 populate_field_elements_for_mock_commitments<Curve>(proof, /*num_commitments=*/1);
158
159 return proof;
160}
161
167template <typename Flavor, class PublicInputs> HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size)
168{
169 // Construct a Honk proof as the concatenation of an Oink proof and a Decider proof
170 HonkProof oink_proof = create_mock_oink_proof<Flavor, PublicInputs>(inner_public_inputs_size);
171 HonkProof decider_proof = create_mock_decider_proof<Flavor>();
172 HonkProof proof;
173 proof.reserve(oink_proof.size() + decider_proof.size());
174 proof.insert(proof.end(), oink_proof.begin(), oink_proof.end());
175 proof.insert(proof.end(), decider_proof.begin(), decider_proof.end());
176
177 if constexpr (HasIPAAccumulator<Flavor>) {
178 HonkProof ipa_proof = create_mock_ipa_proof();
179 proof.insert(proof.end(), ipa_proof.begin(), ipa_proof.end());
180 }
181 return proof;
182}
183
188template <typename Flavor, class PublicInputs> HonkProof create_mock_pg_proof()
189{
190 // The first part of a PG proof is an Oink proof
191 HonkProof proof = create_mock_oink_proof<Flavor, PublicInputs>();
192
193 // Populate mock perturbator coefficients
194 populate_field_elements<fr>(proof, CONST_PG_LOG_N, /*value=*/fr::zero());
195
196 // Populate mock combiner quotient coefficients
197 size_t NUM_COEFF_COMBINER_QUOTIENT =
199 populate_field_elements<fr>(proof, NUM_COEFF_COMBINER_QUOTIENT, /*value=*/fr::zero());
200
201 return proof;
202}
203
210{
211 Goblin::MergeProof proof;
212 proof.reserve(MERGE_PROOF_SIZE);
213
214 uint32_t mock_shift_size = 5; // Must be smaller than 32, otherwise pow raises an error
215
216 // Populate mock shift size
217 populate_field_elements<fr>(proof, 1, /*value=*/fr{ mock_shift_size });
218
219 // There are 8 entities in the merge protocol (4 columns x 2 components: T_j, g_j(X) = X^{l-1} t_j(X))
220 // and 8 evaluations (4 columns x 2 components: g_j(kappa), t_j(1/kappa))
221 const size_t NUM_TRANSCRIPT_ENTITIES = 8;
222 const size_t NUM_TRANSCRIPT_EVALUATIONS = 8;
223
224 // Transcript poly commitments
225 populate_field_elements_for_mock_commitments(proof, NUM_TRANSCRIPT_ENTITIES);
226
227 // Transcript poly evaluations
228 populate_field_elements(proof, NUM_TRANSCRIPT_EVALUATIONS);
229
230 // Shplonk proof: commitment to the quotient
232
233 // KZG proof: commitment to W
235
236 BB_ASSERT_EQ(proof.size(), MERGE_PROOF_SIZE);
237
238 return proof;
239}
240
241template <typename Builder> HonkProof create_mock_civc_proof(const size_t inner_public_inputs_size)
242{
243 HonkProof proof;
244
245 HonkProof mega_proof = create_mock_honk_proof<MegaZKFlavor, stdlib::recursion::honk::HidingKernelIO<Builder>>(
246 inner_public_inputs_size);
249 HonkProof translator_proof = create_mock_translator_proof();
250
251 ClientIVC::Proof civc_proof{ mega_proof, { merge_proof, eccvm_proof, translator_proof } };
252 proof = civc_proof.to_field_elements();
253
254 return proof;
255}
256
265{
266 using FF = ECCVMFlavor::FF;
267 HonkProof proof;
268
269 // 1. NUM_WITNESS_ENTITIES commitments
270 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, ECCVMFlavor::NUM_WITNESS_ENTITIES);
271
272 // 2. Libra concatenation commitment
273 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments*/ 1);
274
275 // 3. Libra sum
276 populate_field_elements<FF>(proof, 1);
277
278 // 4. Sumcheck univariates commitments + 5. Sumcheck univariate evaluations
279 for (size_t idx = 0; idx < CONST_ECCVM_LOG_N; idx++) {
280 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
281 populate_field_elements<FF>(proof, /*num_elements=*/2);
282 }
283
284 // 6. ALL_ENTITIES sumcheck evaluations
285 populate_field_elements<FF>(proof, ECCVMFlavor::NUM_ALL_ENTITIES);
286
287 // 7. Libra evaluation
288 populate_field_elements<FF>(proof, 1);
289
290 // 8. Libra grand sum commitment
291 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
292
293 // 9. Libra quotient commitment
294 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
295
296 // 10. Gemini masking commitment
297 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
298
299 // 11. Gemini masking evaluations
300 populate_field_elements<FF>(proof, 1);
301
302 // 12. Gemini fold commitments
303 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof,
304 /*num_commitments=*/CONST_ECCVM_LOG_N - 1);
305
306 // 13. Gemini evaluations
307 populate_field_elements<FF>(proof, CONST_ECCVM_LOG_N);
308
309 // 14. NUM_SMALL_IPA_EVALUATIONS libra evals
310 populate_field_elements<FF>(proof, NUM_SMALL_IPA_EVALUATIONS);
311
312 // 15. Shplonk
313 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
314
315 // 16. Translator concatenated masking term commitment
316 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
317
318 // 17. Translator op evaluation
319 populate_field_elements<FF>(proof, 1);
320
321 // 18. Translator Px evaluation
322 populate_field_elements<FF>(proof, 1);
323
324 // 19. Translator Py evaluation
325 populate_field_elements<FF>(proof, 1);
326
327 // 20. Translator z1 evaluation
328 populate_field_elements<FF>(proof, 1);
329
330 // 21. Translator z2 evaluation
331 populate_field_elements<FF>(proof, 1);
332
333 // 22. Translator concatenated masking term evaluation
334 populate_field_elements<FF>(proof, 1);
335
336 // 23. Translator grand sum commitment
337 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
338
339 // 24. Translator quotient commitment
340 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
341
342 // 25. Translator concatenation evaluation
343 populate_field_elements<FF>(proof, 1);
344
345 // 26. Translator grand sum shift evaluation
346 populate_field_elements<FF>(proof, 1);
347
348 // 27. Translator grand sum evaluation
349 populate_field_elements<FF>(proof, 1);
350
351 // 28. Translator quotient evaluation
352 populate_field_elements<FF>(proof, 1);
353
354 // 29. Shplonk
355 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
356
357 BB_ASSERT_EQ(proof.size(), ECCVMFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS - IPA_PROOF_LENGTH);
358
359 return proof;
360}
361
370{
371 HonkProof proof;
372
373 // Commitments to L and R for CONST_ECCVM_LOG_N round
374 populate_field_elements_for_mock_commitments<curve::Grumpkin>(
375 proof, /*num_commitments=*/CONST_ECCVM_LOG_N + CONST_ECCVM_LOG_N);
376
377 // Commitment to G_0
378 populate_field_elements_for_mock_commitments<curve::Grumpkin>(proof, /*num_commitments=*/1);
379
380 // a_0 evaluation (a_0 is in the base field of BN254)
381 populate_field_elements<curve::BN254::BaseField>(proof, 1);
382
383 BB_ASSERT_EQ(proof.size(), IPA_PROOF_LENGTH);
384
385 return proof;
386}
387
394{
395 using BF = TranslatorFlavor::BF;
397
398 HonkProof proof;
400
401 // 1. Accumulated result
402 populate_field_elements<BF>(proof, 1);
403
404 // 2. NUM_WITNESS_ENTITIES commitments
405 populate_field_elements_for_mock_commitments<Curve>(proof,
406 /*num_commitments=*/TranslatorFlavor::NUM_WITNESS_ENTITIES - 4);
407
408 // Insert decider proof
409 proof.insert(proof.end(), decider_proof.begin(), decider_proof.end());
410
412
413 return proof;
414}
415
423template <typename Flavor, class PublicInputs>
425 const size_t pub_inputs_offset,
426 const size_t inner_public_inputs_size)
427{
428 // Set relevant VK metadata and commitments
429 auto honk_verification_key = std::make_shared<typename Flavor::VerificationKey>();
430 honk_verification_key->log_circuit_size = bb::numeric::get_msb(dyadic_size);
431 honk_verification_key->num_public_inputs = inner_public_inputs_size + PublicInputs::PUBLIC_INPUTS_SIZE;
432 honk_verification_key->pub_inputs_offset = pub_inputs_offset; // must be set correctly
433
434 for (auto& commitment : honk_verification_key->get_all()) {
435 commitment = curve::BN254::AffineElement::one(); // arbitrary mock commitment
436 }
437
438 return honk_verification_key;
439}
440
446{
447 using FF = typename Flavor::FF;
448
449 // Set relevant VK metadata and commitments
450 auto decider_verification_key = std::make_shared<DeciderVerificationKey_<Flavor>>();
452 create_mock_honk_vk<Flavor, stdlib::recursion::honk::DefaultIO<typename Flavor::CircuitBuilder>>(
453 0, 0); // metadata does not need to be accurate
454 decider_verification_key->vk = vk;
455 decider_verification_key->is_complete = true;
456 decider_verification_key->gate_challenges =
457 std::vector<FF>(static_cast<size_t>(CONST_PG_LOG_N), FF::random_element());
458
459 for (auto& commitment : decider_verification_key->witness_commitments.get_all()) {
460 commitment = curve::BN254::AffineElement::one(); // arbitrary mock commitment
461 }
462
463 return decider_verification_key;
464}
465
466// Explicitly instantiate template functions
469template HonkProof create_mock_oink_proof<MegaFlavor, stdlib::recursion::honk::HidingKernelIO<MegaCircuitBuilder>>(
470 const size_t);
471
472template HonkProof create_mock_oink_proof<UltraFlavor, stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(
473 const size_t);
474template HonkProof create_mock_oink_proof<UltraZKFlavor, stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(
475 const size_t);
476template HonkProof create_mock_oink_proof<UltraFlavor, stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(
477 const size_t);
478template HonkProof create_mock_oink_proof<UltraZKFlavor, stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(
479 const size_t);
481
487
490template HonkProof create_mock_honk_proof<MegaFlavor, stdlib::recursion::honk::HidingKernelIO<MegaCircuitBuilder>>(
491 const size_t);
492
493template HonkProof create_mock_honk_proof<UltraFlavor, stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(
494 const size_t);
495template HonkProof create_mock_honk_proof<UltraZKFlavor, stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(
496 const size_t);
497template HonkProof create_mock_honk_proof<UltraFlavor, stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(
498 const size_t);
499template HonkProof create_mock_honk_proof<UltraZKFlavor, stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(
500 const size_t);
502
505template HonkProof create_mock_pg_proof<MegaFlavor, stdlib::recursion::honk::HidingKernelIO<MegaCircuitBuilder>>();
506
509
511 const size_t, const size_t, const size_t);
514 const size_t, const size_t, const size_t);
517 stdlib::recursion::honk::HidingKernelIO<MegaCircuitBuilder>>(const size_t, const size_t, const size_t);
520 stdlib::recursion::honk::HidingKernelIO<UltraCircuitBuilder>>(const size_t, const size_t, const size_t);
521
524 stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(const size_t, const size_t, const size_t);
527 stdlib::recursion::honk::DefaultIO<UltraCircuitBuilder>>(const size_t, const size_t, const size_t);
530 stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(const size_t, const size_t, const size_t);
533 stdlib::recursion::honk::DefaultIO<MegaCircuitBuilder>>(const size_t, const size_t, const size_t);
536 const size_t, const size_t, const size_t);
537
539
540} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
typename Curve::ScalarField FF
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
MergeProver::MergeProof MergeProof
Definition goblin.hpp:36
Curve::ScalarField FF
curve::BN254 Curve
static constexpr size_t NUM_ALL_ENTITIES
static constexpr bool HasZK
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t VIRTUAL_LOG_N
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
Child class of MegaFlavor that runs with ZK Sumcheck. See more in Sumcheck Outline.
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
Child class of UltraFlavor that runs with ZK Sumcheck.
Manages the data that is propagated on the public inputs of an application/function circuit.
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
Manages the data that is propagated on the public inputs of a kernel circuit.
The data that is propagated on the public inputs of a rollup circuit.
AluTraceBuilder builder
Definition alu.test.cpp:123
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
template HonkProof create_mock_decider_proof< UltraRollupFlavor >()
template HonkProof create_mock_pg_proof< MegaFlavor, stdlib::recursion::honk::KernelIO >()
std::shared_ptr< typename Flavor::VerificationKey > create_mock_honk_vk(const size_t dyadic_size, const size_t pub_inputs_offset, const size_t inner_public_inputs_size)
Create a mock MegaHonk VK that has the correct structure.
HonkProof create_mock_pg_proof()
Create a mock PG proof that has the correct structure but is not in general valid.
template HonkProof create_mock_civc_proof< MegaCircuitBuilder >(const size_t)
template HonkProof create_mock_decider_proof< UltraZKFlavor >()
template HonkProof create_mock_decider_proof< TranslatorFlavor >()
HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size)
Create a mock oink proof that has the correct structure but is not in general valid.
template HonkProof create_mock_honk_proof< MegaFlavor, stdlib::recursion::honk::KernelIO >(const size_t)
template HonkProof create_mock_civc_proof< UltraCircuitBuilder >(const size_t)
Goblin::MergeProof create_mock_merge_proof()
Create a mock merge proof which has the correct structure but is not necessarily valid.
void populate_field_elements(std::vector< fr > &fields, const size_t &num_elements, std::optional< FF > value=std::nullopt)
Helper to populate a field buffer with some number of field elements.
HonkProof create_mock_translator_proof()
Create a mock translator proof which has the correct structure but is not necessarily valid.
HonkProof create_mock_civc_proof(const size_t inner_public_inputs_size)
void populate_field_elements_for_mock_commitments(std::vector< fr > &fields, const size_t &num_commitments)
Helper to populate a field buffer with fields corresponding to some number of mock commitment values.
HonkProof create_mock_pre_ipa_proof()
Create a mock pre-ipa proof which has the correct structure but is not necessarily valid.
template HonkProof create_mock_oink_proof< MegaFlavor, stdlib::recursion::honk::AppIO >(const size_t)
template HonkProof create_mock_honk_proof< MegaFlavor, stdlib::recursion::honk::AppIO >(const size_t)
HonkProof create_mock_decider_proof()
Create a mock decider proof that has the correct structure but is not in general valid.
template HonkProof create_mock_oink_proof< UltraRollupFlavor, stdlib::recursion::honk::RollupIO >(const size_t)
template std::shared_ptr< DeciderVerificationKey_< MegaFlavor > > create_mock_decider_vk< MegaFlavor >()
template HonkProof create_mock_decider_proof< UltraFlavor >()
HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size)
Create a mock honk proof that has the correct structure but is not in general valid.
template HonkProof create_mock_honk_proof< UltraRollupFlavor, stdlib::recursion::honk::RollupIO >(const size_t)
template HonkProof create_mock_pg_proof< MegaFlavor, stdlib::recursion::honk::AppIO >()
template HonkProof create_mock_oink_proof< MegaFlavor, stdlib::recursion::honk::KernelIO >(const size_t)
std::shared_ptr< DeciderVerificationKey_< Flavor > > create_mock_decider_vk()
Create a mock Decider verification key for initilization of a mock verifier accumulator.
HonkProof create_mock_ipa_proof()
Create a mock ipa proof which has the correct structure but is not necessarily valid.
template std::shared_ptr< MegaFlavor::VerificationKey > create_mock_honk_vk< MegaFlavor, stdlib::recursion::honk::AppIO >(const size_t, const size_t, const size_t)
template HonkProof create_mock_decider_proof< MegaFlavor >()
std::vector< bb::fr > convert_to_bn254_frs(const T &val)
Conversion from transcript values to bb::frs.
constexpr T get_msb(const T in)
Definition get_msb.hpp:47
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
Definition proof.hpp:15
typename Flavor::FF FF
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
A full proof for the IVC scheme containing a Mega proof showing correctness of the hiding circuit (wh...
std::vector< FF > to_field_elements() const
Serialize proof to field elements.
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()