Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
chonk_recursion_constraints.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
11
12namespace acir_format {
13
14using namespace bb;
15
29 size_t proof_size,
30 size_t public_inputs_size,
31 const std::vector<stdlib::field_t<UltraCircuitBuilder>>& key_fields,
32 const std::vector<stdlib::field_t<UltraCircuitBuilder>>& proof_fields)
33{
36
38
39 size_t num_inner_public_inputs = public_inputs_size - IO::PUBLIC_INPUTS_SIZE;
40
41 // Generate mock honk vk
42 // Note: log_circuit_size = VIRTUAL_LOG_N
43 auto honk_vk = create_mock_honk_vk<MegaZKFlavor, IO>(1 << MegaZKFlavor::VIRTUAL_LOG_N, num_inner_public_inputs);
44
45 // Set honk vk in builder
46 populate_fields(builder, key_fields, honk_vk->to_field_elements());
47
48 // Generate dummy Chonk proof
49 bb::HonkProof chonk_proof = create_mock_chonk_proof<Builder>(num_inner_public_inputs);
50
51 // Set Chonk proof in builder
52 populate_fields(builder, proof_fields, chonk_proof);
53
54 BB_ASSERT_EQ(chonk_proof.size(), proof_size + public_inputs_size);
55}
56
66[[nodiscard(
67 "IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintOutput<bb::UltraCircuitBuilder>
69{
72 using RecursiveVKAndHash = ChonkRecursiveVerifier::VKAndHash;
75
77
78 // Reconstruct proof indices from proof and public inputs
79 std::vector<uint32_t> proof_indices = add_public_inputs_to_proof(input.proof, input.public_inputs);
80
81 // Construct field elements from witness indices
83 std::vector<field_ct> proof_fields = fields_from_witnesses(builder, proof_indices);
85
86 if (builder.is_write_vk_mode()) {
87 BB_ASSERT_GTE(input.proof.size(),
88 IO::PUBLIC_INPUTS_SIZE,
89 "create_chonk_recursion_constraints: fewer proof elements than public inputs.");
90 BB_ASSERT_LTE(input.public_inputs.size(),
91 SIZE_MAX - IO::PUBLIC_INPUTS_SIZE,
92 "create_chonk_recursion_constraints: too many public inputs.");
93 size_t total_pub_inputs_size = input.public_inputs.size() + IO::PUBLIC_INPUTS_SIZE;
94 size_t proof_size_without_pub_inputs = input.proof.size() - IO::PUBLIC_INPUTS_SIZE;
95
97 builder, proof_size_without_pub_inputs, total_pub_inputs_size, key_fields, proof_fields);
98 }
99
100 // Recursively verify Chonk proof
101 auto mega_vk = std::make_shared<VerificationKey>(key_fields);
102 auto mega_vk_and_hash = std::make_shared<RecursiveVKAndHash>(mega_vk, vk_hash);
103 ChonkStdlibProof stdlib_proof = ChonkStdlibProof::from_field_elements(proof_fields);
104
105 ChonkRecursiveVerifier verifier(mega_vk_and_hash);
106 ChonkRecursiveVerifier::Output verification_output = verifier.verify(stdlib_proof);
107
108 // Construct output
109 // Note: ChonkVerifier aggregates all pairing points (PI + PCS + Merge + Translator)
111 output.points_accumulator = verification_output.pairing_points;
112 output.ipa_claim = verification_output.ipa_claim;
113 output.ipa_proof = verification_output.ipa_proof;
114
115 return output;
116}
117
118} // namespace acir_format
#define BB_ASSERT_GTE(left, right,...)
Definition assert.hpp:128
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:83
#define BB_ASSERT_LTE(left, right,...)
Definition assert.hpp:158
Verifier for Chonk IVC proofs (both native and recursive).
std::conditional_t< IsRecursive, ReductionResult, bool > Output
typename HidingKernelVerifier::VerificationKey VK
Output verify(const Proof &proof)
Verify a Chonk proof.
typename HidingKernelVerifier::VKAndHash VKAndHash
static constexpr size_t VIRTUAL_LOG_N
Base Native verification key class.
Definition flavor.hpp:172
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:63
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
AluTraceBuilder builder
Definition alu.test.cpp:124
void populate_fields(Builder &builder, const std::vector< field_t< Builder > > &fields, const std::vector< bb::fr > &values)
========== WRITE_VK UTILITIES ========== ///
Definition utils.cpp:78
std::vector< field_t< Builder > > fields_from_witnesses(Builder &builder, std::span< const uint32_t > witness_indices)
========== ACIR TO BARRETENBERG ========== ///
Definition utils.cpp:16
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.
std::vector< uint32_t > add_public_inputs_to_proof(const std::vector< uint32_t > &proof_in, const std::vector< uint32_t > &public_inputs)
Reconstruct a barretenberg style proof from an ACIR style proof + public inputs.
Definition utils.cpp:40
HonkRecursionConstraintOutput< bb::UltraCircuitBuilder > create_chonk_recursion_constraints(bb::UltraCircuitBuilder &builder, const RecursionConstraint &input)
Add constraints associated with recursive verification of a Chonk proof.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
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.
Chonk proof type.
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
The size of a Chonk proof without backend-added public inputs.
static ChonkProof_ from_field_elements(const std::vector< FF > &fields)
Common logic to reconstruct proof from field elements.
Output type for recursive ultra verification.