Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
chonk.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
23#ifndef NDEBUG
25#endif
26#include <algorithm>
27
28namespace bb {
29
39class Chonk : public IVCBase {
40 // CHONK: "Client Honk" - An UltraHonk variant with incremental folding and delayed non-native arithmetic.
41
42 public:
46 using FF = Flavor::FF;
49 using Point = Flavor::Curve::AffineElement;
53 using ClientCircuit = MegaCircuitBuilder; // can only be Mega
58 // Recursive types
74 // Folding
83
84 // Result types for decomposed verification steps
89
94
117 enum class QUEUE_TYPE : uint8_t { OINK, HN, HN_TAIL, HN_FINAL, MEGA };
118
119 // An entry in the native verification queue
121 std::vector<FF> proof; // oink or HN
124 bool is_kernel = false;
125 };
126 using VerificationQueue = std::deque<VerifierInputs>;
127
128 // An entry in the stdlib verification queue
130 StdlibProof proof; // oink or HN
133 bool is_kernel = false;
134
135 // Explicit constructor needed for older libc++ (iOS SDK) compatibility with std::deque::emplace_back
137 std::shared_ptr<RecursiveVKAndHash> honk_vk_and_hash_,
138 QUEUE_TYPE type_,
139 bool is_kernel_)
140 : proof(std::move(proof_))
141 , honk_vk_and_hash(std::move(honk_vk_and_hash_))
142 , type(type_)
143 , is_kernel(is_kernel_)
144 {}
145 };
146 using StdlibVerificationQueue = std::deque<StdlibVerifierInputs>;
147
148 private:
149 // Transcript for Chonk prover (shared between Hiding kernel, Merge, ECCVM, and Translator)
150 std::shared_ptr<Transcript> transcript = std::make_shared<Transcript>();
151
152 // Transcript to be shared across the folding of K_{i-1} (kernel), A_{i} (app)
154
155 size_t num_circuits; // total number of circuits to be accumulated in the IVC
156 public:
157 size_t num_circuits_accumulated = 0; // number of circuits accumulated so far
158
159 ProverAccumulator prover_accumulator; // current HN prover accumulator instance
160
161 HonkProof decider_proof; // decider proof to be verified in the Hiding kernel
162
163 VerifierAccumulator recursive_verifier_native_accum; // native verifier accumulator used in recursive folding
164#ifndef NDEBUG
165 VerifierAccumulator native_verifier_accum; // native verifier accumulator used in prover folding
166 FF native_verifier_accum_hash; // hash of the native verifier accumulator when entering recursive verification
169#endif
170
171 // PARALLEL QUEUES: These two queues must stay synchronized.
172 // - verification_queue: Native proofs created by accumulate() (prover side)
173 // - stdlib_verification_queue: Circuit witnesses for complete_kernel_circuit_logic() (verifier side)
174 // The stdlib queue is populated from the native queue via instantiate_stdlib_verification_queue().
177
178 // Management of linking databus commitments between circuits in the IVC
180
182
183 // Hiding kernel prover state: built during accumulate(MEGA), consumed by prove().
185 std::shared_ptr<MegaZKVerificationKey> hiding_vk;
186
187 size_t get_num_circuits() const { return num_circuits; }
188
189 // IVCBase interface
190 Goblin& get_goblin() override { return goblin; }
191 const Goblin& get_goblin() const override { return goblin; }
192
193 Chonk(size_t num_circuits);
194
196 const std::vector<std::shared_ptr<RecursiveVKAndHash>>& input_keys = {});
197
198 [[nodiscard("Pairing points should be accumulated")]] std::
201 ClientCircuit& circuit,
202 const StdlibVerifierInputs& verifier_inputs,
203 const std::optional<RecursiveVerifierAccumulator>& input_verifier_accumulator,
204 const std::optional<StdlibFF>& running_hash,
205 const std::shared_ptr<RecursiveTranscript>& accumulation_recursive_transcript);
206
207 // Complete the logic of a kernel circuit (e.g. HN/merge recursive verification, databus consistency checks)
209
218 void accumulate(ClientCircuit& circuit, const std::shared_ptr<MegaVerificationKey>& precomputed_vk) override;
219
221
223
229
230 private:
231#ifndef NDEBUG
238 void update_native_verifier_accumulator(const VerifierInputs& queue_entry,
239 const std::shared_ptr<Transcript>& verifier_transcript);
240
242 const std::shared_ptr<ProverInstance>& prover_instance,
243 const std::shared_ptr<MegaVerificationKey>& precomputed_vk);
244#endif
245
246 FoldingResult verify_folding(ClientCircuit& circuit,
247 const StdlibVerifierInputs& verifier_inputs,
248 const std::shared_ptr<RecursiveVerifierInstance>& verifier_instance,
249 const std::shared_ptr<RecursiveTranscript>& accumulation_recursive_transcript) const;
250
251 PublicInputsResult process_public_inputs_and_consistency_checks(const StdlibVerifierInputs& verifier_inputs,
252 std::vector<StdlibFF>& public_inputs,
253 WitnessCommitments& witness_commitments,
254 const std::optional<StdlibFF>& prev_accum_hash);
255
257
259 const std::shared_ptr<MegaVerificationKey>& precomputed_vk,
260 QUEUE_TYPE queue_type,
261 std::shared_ptr<ProverInstance> prover_instance);
262
264};
265
266} // namespace bb
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
The IVC scheme used by the aztec client for private function execution.
Definition chonk.hpp:39
ProverAccumulator prover_accumulator
Definition chonk.hpp:159
Goblin & get_goblin() override
Definition chonk.hpp:190
void instantiate_stdlib_verification_queue(ClientCircuit &circuit, const std::vector< std::shared_ptr< RecursiveVKAndHash > > &input_keys={})
Instantiate a stdlib verification queue for use in the kernel completion logic.
Definition chonk.cpp:43
std::shared_ptr< MegaZKFlavor::VKAndHash > get_hiding_kernel_vk_and_hash() const
Get the hiding kernel verification key and hash for Chonk verification.
Definition chonk.cpp:666
void complete_kernel_circuit_logic(ClientCircuit &circuit)
Append logic to complete a kernel circuit.
Definition chonk.cpp:297
VerifierAccumulator native_verifier_accum
Definition chonk.hpp:165
void accumulate_and_fold(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk, QUEUE_TYPE queue_type, std::shared_ptr< ProverInstance > prover_instance)
Perform HyperNova folding for a circuit and produce the corresponding merge proof.
Definition chonk.cpp:481
RecursiveFlavor::WitnessCommitments WitnessCommitments
Definition chonk.hpp:71
void accumulate_hiding_kernel(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk)
Build the hiding kernel's ZK proving key and verification key (proving is deferred to prove()).
Definition chonk.cpp:444
void update_native_verifier_accumulator(const VerifierInputs &queue_entry, const std::shared_ptr< Transcript > &verifier_transcript)
Update native verifier accumulator. Useful for debugging.
Definition chonk.cpp:674
static void hide_op_queue_content_in_hiding(ClientCircuit &circuit)
Adds two random non-ops to the hiding kernel for zero-knowledge.
Definition chonk.cpp:607
std::array< RecursiveFlavor::Commitment, ClientCircuit::NUM_WIRES > TableCommitments
Definition chonk.hpp:73
DataBusDepot bus_depot
Definition chonk.hpp:179
std::shared_ptr< Transcript > transcript
Definition chonk.hpp:150
size_t num_circuits_accumulated
Definition chonk.hpp:157
Flavor::Commitment Commitment
Definition chonk.hpp:47
void debug_incoming_circuit(ClientCircuit &circuit, const std::shared_ptr< ProverInstance > &prover_instance, const std::shared_ptr< MegaVerificationKey > &precomputed_vk)
Definition chonk.cpp:723
HonkProof decider_proof
Definition chonk.hpp:161
Flavor::Curve::AffineElement Point
Definition chonk.hpp:49
FF native_verifier_accum_hash
Definition chonk.hpp:166
size_t get_num_circuits() const
Definition chonk.hpp:187
QUEUE_TYPE
Proof type determining recursive verification logic in kernel circuits.
Definition chonk.hpp:117
bool has_last_app_been_accumulated
Definition chonk.hpp:168
QUEUE_TYPE get_queue_type() const
Get queue type for the proof of a circuit about to be accumulated based on num circuits accumulated s...
Definition chonk.cpp:416
std::deque< StdlibVerifierInputs > StdlibVerificationQueue
Definition chonk.hpp:146
ChonkProof prove()
Construct Chonk proof using the batched MegaZK + Translator protocol.
Definition chonk.cpp:626
RecursiveFlavor::FF StdlibFF
Definition chonk.hpp:60
PublicInputsResult process_public_inputs_and_consistency_checks(const StdlibVerifierInputs &verifier_inputs, std::vector< StdlibFF > &public_inputs, WitnessCommitments &witness_commitments, const std::optional< StdlibFF > &prev_accum_hash)
Process public inputs from a verified circuit and perform databus consistency checks.
Definition chonk.cpp:147
VerifierAccumulator recursive_verifier_native_accum
Definition chonk.hpp:163
bool is_previous_circuit_a_kernel
Definition chonk.hpp:167
RecursiveFlavor::Commitment RecursiveCommitment
Definition chonk.hpp:61
std::tuple< std::optional< RecursiveVerifierAccumulator >, std::vector< PairingPoints >, StdlibFF > recursive_verification_and_consistency_checks(ClientCircuit &circuit, const StdlibVerifierInputs &verifier_inputs, const std::optional< RecursiveVerifierAccumulator > &input_verifier_accumulator, const std::optional< StdlibFF > &running_hash, const std::shared_ptr< RecursiveTranscript > &accumulation_recursive_transcript)
Orchestrate recursive verification, databus consistency checks, and merge verification for a single c...
Definition chonk.cpp:230
std::shared_ptr< HidingKernelProverInstance > hiding_prover_inst
Definition chonk.hpp:184
void accumulate(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk) override
Perform prover work for accumulation (e.g. HN folding, merge proving)
Definition chonk.cpp:573
MegaCircuitBuilder ClientCircuit
Definition chonk.hpp:53
FoldingResult verify_folding(ClientCircuit &circuit, const StdlibVerifierInputs &verifier_inputs, const std::shared_ptr< RecursiveVerifierInstance > &verifier_instance, const std::shared_ptr< RecursiveTranscript > &accumulation_recursive_transcript) const
Perform recursive folding verification for a single circuit in the IVC.
Definition chonk.cpp:87
const Goblin & get_goblin() const override
Definition chonk.hpp:191
size_t num_circuits
Definition chonk.hpp:155
std::deque< VerifierInputs > VerificationQueue
Definition chonk.hpp:126
VerificationQueue verification_queue
Definition chonk.hpp:175
Goblin goblin
Definition chonk.hpp:181
std::shared_ptr< MegaZKVerificationKey > hiding_vk
Definition chonk.hpp:185
std::shared_ptr< Transcript > prover_accumulation_transcript
Definition chonk.hpp:153
StdlibVerificationQueue stdlib_verification_queue
Definition chonk.hpp:176
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
Simple verification key class for fixed-size circuits (ECCVM, Translator, AVM).
Definition flavor.hpp:101
HyperNova decider prover. Produces final opening proof for the accumulated claim.
HyperNova decider verifier (native + recursive). Verifies final opening proof.
HyperNova folding prover. Folds circuit instances into accumulators, deferring PCS verification.
MultilinearBatchingProverClaim Accumulator
HyperNova folding verifier (native + recursive). Verifies folding proofs and maintains accumulators.
MultilinearBatchingVerifierClaim< Curve > Accumulator
Base class interface for IVC schemes.
Container for all witness polynomials used/constructed by the prover.
Curve::ScalarField FF
ProverPolynomialsBase< AllEntities_< Polynomial >, AllValues, Polynomial > ProverPolynomials
A container for the prover polynomials handles.
Curve::AffineElement Commitment
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key stores commitments to the precomputed (non-witness) polynomials used by the veri...
The recursive counterpart to the "native" Mega flavor.
StdlibTranscript< CircuitBuilder > Transcript
typename Curve::Element Commitment
StdlibVerificationKey_< CircuitBuilder, NativeFlavor::PrecomputedEntities< Commitment >, NativeFlavor::VerificationKey > VerificationKey
typename Curve::ScalarField FF
VKAndHash_< FF, VerificationKey > VKAndHash
MegaFlavor::WitnessEntities< Commitment > WitnessCommitments
A container for the witness commitments.
Base Native verification key class.
Definition flavor.hpp:135
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
A container for polynomials handles used by the prover.
Base Stdlib verification key class.
Definition flavor.hpp:371
FixedVKAndHash_< VKEntities< Commitment >, FF, TranslatorHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
Wrapper holding a verification key and its precomputed hash.
Definition flavor.hpp:541
The VerifierInstance encapsulates all the necessary information for a Honk Verifier to verify a proof...
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.
KernelIO_< MAX_APPS_PER_KERNEL > KernelIO
DefaultIO< MegaCircuitBuilder > AppIO
The data that is propagated on the public inputs of an application/function circuit.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
ChonkProof_< false > ChonkProof
BaseTranscript< FrCodec, bb::crypto::Poseidon2< bb::crypto::Poseidon2Bn254ScalarFieldParams > > NativeTranscript
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< PairingPoints > pairing_points
Definition chonk.hpp:87
std::optional< RecursiveVerifierAccumulator > output_accumulator
Definition chonk.hpp:86
PairingPoints pairing_points
Definition chonk.hpp:91
std::optional< StdlibFF > ecc_op_hash
Definition chonk.hpp:92
StdlibVerifierInputs(StdlibProof proof_, std::shared_ptr< RecursiveVKAndHash > honk_vk_and_hash_, QUEUE_TYPE type_, bool is_kernel_)
Definition chonk.hpp:136
std::shared_ptr< RecursiveVKAndHash > honk_vk_and_hash
Definition chonk.hpp:131
std::shared_ptr< MegaVerificationKey > honk_vk
Definition chonk.hpp:122
std::vector< FF > proof
Definition chonk.hpp:121
Prover's claim for multilinear batching - contains polynomials and their evaluation claims.
Verifier's claim for multilinear batching - contains commitments and evaluation claims.