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 uint32_t pub_inputs_offset = MegaZKFlavor::has_zero_row ? 1 : 0;
41
42 // Generate mock honk vk
43 // Note: log_circuit_size = VIRTUAL_LOG_N
44 auto honk_vk = create_mock_honk_vk<MegaZKFlavor, IO>(
45 1 << MegaZKFlavor::VIRTUAL_LOG_N, pub_inputs_offset, num_inner_public_inputs);
46
47 // Set honk vk in builder
48 populate_fields(builder, key_fields, honk_vk->to_field_elements());
49
50 // Generate dummy Chonk proof
51 bb::HonkProof chonk_proof = create_mock_chonk_proof<Builder>(num_inner_public_inputs);
52
53 // Set Chonk proof in builder
54 populate_fields(builder, proof_fields, chonk_proof);
55
56 BB_ASSERT_EQ(chonk_proof.size(), proof_size + public_inputs_size);
57}
58
68[[nodiscard(
69 "IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintOutput<bb::UltraCircuitBuilder>
71{
74 using RecursiveVKAndHash = ChonkRecursiveVerifier::VKAndHash;
77
79
80 // Reconstruct proof indices from proof and public inputs
81 std::vector<uint32_t> proof_indices = add_public_inputs_to_proof(input.proof, input.public_inputs);
82
83 // Construct field elements from witness indices
85 std::vector<field_ct> proof_fields = fields_from_witnesses(builder, proof_indices);
87
88 if (builder.is_write_vk_mode()) {
89 BB_ASSERT_GTE(input.proof.size(),
90 IO::PUBLIC_INPUTS_SIZE,
91 "create_chonk_recursion_constraints: fewer proof elements than public inputs.");
92 BB_ASSERT_LTE(input.public_inputs.size(),
93 SIZE_MAX - IO::PUBLIC_INPUTS_SIZE,
94 "create_chonk_recursion_constraints: too many public inputs.");
95 size_t total_pub_inputs_size = input.public_inputs.size() + IO::PUBLIC_INPUTS_SIZE;
96 size_t proof_size_without_pub_inputs = input.proof.size() - IO::PUBLIC_INPUTS_SIZE;
97
99 builder, proof_size_without_pub_inputs, total_pub_inputs_size, key_fields, proof_fields);
100 }
101
102 // Recursively verify Chonk proof
103 auto mega_vk = std::make_shared<VerificationKey>(key_fields);
104 auto mega_vk_and_hash = std::make_shared<RecursiveVKAndHash>(mega_vk, vk_hash);
105 ChonkStdlibProof stdlib_proof = ChonkStdlibProof::from_field_elements(proof_fields);
106
107 ChonkRecursiveVerifier verifier(mega_vk_and_hash);
108 ChonkRecursiveVerifier::Output verification_output = verifier.verify(stdlib_proof);
109
110 // Construct output
111 // Note: ChonkVerifier aggregates all pairing points (PI + PCS + Merge + Translator)
113 output.points_accumulator = verification_output.pairing_points;
114 output.ipa_claim = verification_output.ipa_claim;
115 output.ipa_proof = verification_output.ipa_proof;
116
117 return output;
118}
119
120} // namespace acir_format
#define BB_ASSERT_GTE(left, right,...)
Definition assert.hpp:138
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:93
#define BB_ASSERT_LTE(left, right,...)
Definition assert.hpp:168
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:141
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:62
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.