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: 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// =====================
10#include "proof_surgeon.hpp"
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{
37
39
40 size_t num_inner_public_inputs = public_inputs_size - IO::PUBLIC_INPUTS_SIZE;
41 uint32_t pub_inputs_offset = MegaZKFlavor::has_zero_row ? 1 : 0;
42
43 // Generate mock honk vk
44 // Note: log_circuit_size = VIRTUAL_LOG_N
45 auto honk_vk = create_mock_honk_vk<MegaZKFlavor, IO>(
46 1 << MegaZKFlavor::VIRTUAL_LOG_N, pub_inputs_offset, num_inner_public_inputs);
47
48 // Set honk vk in builder
49 size_t offset = 0;
50 for (auto& vk_element : honk_vk->to_field_elements()) {
51 builder.set_variable(key_fields[offset].get_witness_index(), vk_element);
52 offset++;
53 }
54
55 // Generate dummy Chonk proof
56 bb::HonkProof chonk_proof = create_mock_chonk_proof<Builder>(num_inner_public_inputs);
57
58 // Set Chonk proof in builder
59 offset = 0;
60 for (auto& proof_element : chonk_proof) {
61 builder.set_variable(proof_fields[offset].get_witness_index(), proof_element);
62 offset++;
63 }
64
65 BB_ASSERT_EQ(offset, proof_size + public_inputs_size);
66}
67
77[[nodiscard(
78 "IPA claim and Pairing points should be accumulated")]] HonkRecursionConstraintOutput<bb::UltraCircuitBuilder>
80{
84 using RecursiveVKAndHash = ChonkRecursiveVerifier::RecursiveVKAndHash;
87
89
90 // Reconstruct proof indices from proof and public inputs
91 std::vector<uint32_t> proof_indices =
93
94 // Construct field elements from witness indices
98
99 if (builder.is_write_vk_mode()) {
100 size_t total_pub_inputs_size = input.public_inputs.size() + IO::PUBLIC_INPUTS_SIZE;
101 size_t proof_size_without_pub_inputs = input.proof.size() - IO::PUBLIC_INPUTS_SIZE;
102
104 builder, proof_size_without_pub_inputs, total_pub_inputs_size, key_fields, proof_fields);
105 }
106
107 // Recursively verify Chonk proof
108 auto mega_vk = std::make_shared<VerificationKey>(key_fields);
109 auto mega_vk_and_hash = std::make_shared<RecursiveVKAndHash>(mega_vk, vk_hash);
110 ChonkRecursiveVerifier::StdlibProof stdlib_proof(proof_fields, input.public_inputs.size());
111
112 ChonkRecursiveVerifier verifier(&builder, mega_vk_and_hash);
113 ChonkRecursiveVerifier::Output verification_output = verifier.verify(stdlib_proof);
114
115 // Construct output
117 output.points_accumulator = verification_output.points_accumulator;
118 output.ipa_claim = verification_output.opening_claim;
119 output.ipa_proof = verification_output.ipa_proof;
120
121 return output;
122}
123
124} // namespace acir_format
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:77
static std::vector< uint32_t > create_indices_for_reconstructed_proof(const std::vector< uint32_t > &proof_in, const std::vector< uint32_t > &public_inputs)
Reconstruct a bberg style proof from a acir style proof + public inputs.
static constexpr size_t VIRTUAL_LOG_N
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:62
Output verify(const StdlibProof &)
Creates a circuit that executes the Chonk verification algorithm.
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
AluTraceBuilder builder
Definition alu.test.cpp:124
ssize_t offset
Definition engine.cpp:36
UltraKeccakFlavor::VerificationKey VerificationKey
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.
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!
static std::vector< bb::stdlib::field_t< Builder > > fields_from_witnesses(Builder &builder, const std::vector< uint32_t > &witness_indices)
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS(size_t virtual_log_n=Flavor::VIRTUAL_LOG_N)