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 size_t num_inner_public_inputs = public_inputs_size - IO::PUBLIC_INPUTS_SIZE;
39
40 // Generate mock honk vk
41 // Note: log_circuit_size = VIRTUAL_LOG_N
42 auto honk_vk = create_mock_honk_vk<MegaZKFlavor, IO>(1 << MegaZKFlavor::VIRTUAL_LOG_N, num_inner_public_inputs);
43
44 // Set honk vk in builder
45 populate_fields(builder, key_fields, honk_vk->to_field_elements());
46
47 // Generate dummy Chonk proof
48 bb::HonkProof chonk_proof = create_mock_chonk_proof<Builder>(num_inner_public_inputs);
49
50 // Set Chonk proof in builder
51 populate_fields(builder, proof_fields, chonk_proof);
52
53 BB_ASSERT_EQ(chonk_proof.size(), proof_size + public_inputs_size);
54}
55
65[[nodiscard(
66 "IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintOutput<bb::UltraCircuitBuilder>
68{
71 using RecursiveVKAndHash = ChonkRecursiveVerifier::VKAndHash;
74
76
77 // Reconstruct proof indices from proof and public inputs
78 std::vector<uint32_t> proof_indices = add_public_inputs_to_proof(input.proof, input.public_inputs);
79
80 // Construct field elements from witness indices
82 std::vector<field_ct> proof_fields = fields_from_witnesses(builder, proof_indices);
84
85 if (builder.is_write_vk_mode()) {
86 BB_ASSERT_GTE(input.proof.size(),
87 IO::PUBLIC_INPUTS_SIZE,
88 "create_chonk_recursion_constraints: fewer proof elements than public inputs.");
89 BB_ASSERT_LTE(input.public_inputs.size(),
90 SIZE_MAX - IO::PUBLIC_INPUTS_SIZE,
91 "create_chonk_recursion_constraints: too many public inputs.");
92 size_t total_pub_inputs_size = input.public_inputs.size() + IO::PUBLIC_INPUTS_SIZE;
93 size_t proof_size_without_pub_inputs = input.proof.size() - IO::PUBLIC_INPUTS_SIZE;
94
96 builder, proof_size_without_pub_inputs, total_pub_inputs_size, key_fields, proof_fields);
97 }
98
99 // Recursively verify Chonk proof
100 auto mega_vk = std::make_shared<VerificationKey>(key_fields);
101 auto mega_vk_and_hash = std::make_shared<RecursiveVKAndHash>(mega_vk, vk_hash);
102 ChonkStdlibProof stdlib_proof = ChonkStdlibProof::from_field_elements(proof_fields);
103
104 ChonkRecursiveVerifier verifier(mega_vk_and_hash);
105 ChonkRecursiveVerifier::Output verification_output = verifier.verify(stdlib_proof);
106
107 // Construct output
108 // Note: ChonkVerifier aggregates all pairing points (PI + PCS + Merge + Translator)
110 output.points_accumulator = verification_output.pairing_points;
111 output.ipa_claim = verification_output.ipa_claim;
112 output.ipa_proof = verification_output.ipa_proof;
113
114 return output;
115}
116
117} // 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:135
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:67
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
static ChonkProof_ from_field_elements(const std::vector< FF > &fields)
Reconstruct proof from field elements.
Output type for recursive ultra verification.