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
22#ifndef NDEBUG
24#endif
25#include <algorithm>
26
27namespace bb {
28
38class Chonk : public IVCBase {
39 // CHONK: "Client Honk" - An UltraHonk variant with incremental folding and delayed non-native arithmetic.
40
41 public:
45 using FF = Flavor::FF;
48 using Point = Flavor::Curve::AffineElement;
52 using ClientCircuit = MegaCircuitBuilder; // can only be Mega
57 // Recursive types
73 // Folding
82
105 enum class QUEUE_TYPE : uint8_t { OINK, HN, HN_TAIL, HN_FINAL, MEGA };
106
107 // An entry in the native verification queue
109 std::vector<FF> proof; // oink or HN
112 bool is_kernel = false;
113 };
114 using VerificationQueue = std::deque<VerifierInputs>;
115
116 // An entry in the stdlib verification queue
118 StdlibProof proof; // oink or HN
121 bool is_kernel = false;
122
123 // Explicit constructor needed for older libc++ (iOS SDK) compatibility with std::deque::emplace_back
125 std::shared_ptr<RecursiveVKAndHash> honk_vk_and_hash_,
126 QUEUE_TYPE type_,
127 bool is_kernel_)
128 : proof(std::move(proof_))
129 , honk_vk_and_hash(std::move(honk_vk_and_hash_))
130 , type(type_)
131 , is_kernel(is_kernel_)
132 {}
133 };
134 using StdlibVerificationQueue = std::deque<StdlibVerifierInputs>;
135
136 private:
137 // Transcript for Chonk prover (shared between Hiding kernel, Merge, ECCVM, and Translator)
138 std::shared_ptr<Transcript> transcript = std::make_shared<Transcript>();
139
140 // Transcript to be shared across the folding of K_{i-1} (kernel), A_{i} (app)
142
143 size_t num_circuits; // total number of circuits to be accumulated in the IVC
144 public:
145 size_t num_circuits_accumulated = 0; // number of circuits accumulated so far
146
147 ProverAccumulator prover_accumulator; // current HN prover accumulator instance
148
149 HonkProof decider_proof; // decider proof to be verified in the Hiding kernel
150
151 VerifierAccumulator recursive_verifier_native_accum; // native verifier accumulator used in recursive folding
152#ifndef NDEBUG
153 VerifierAccumulator native_verifier_accum; // native verifier accumulator used in prover folding
154 FF native_verifier_accum_hash; // hash of the native verifier accumulator when entering recursive verification
157#endif
158
159 // PARALLEL QUEUES: These two queues must stay synchronized.
160 // - verification_queue: Native proofs created by accumulate() (prover side)
161 // - stdlib_verification_queue: Circuit witnesses for complete_kernel_circuit_logic() (verifier side)
162 // The stdlib queue is populated from the native queue via instantiate_stdlib_verification_queue().
165
166 // Management of linking databus commitments between circuits in the IVC
168
170
172
173 size_t get_num_circuits() const { return num_circuits; }
174
175 // IVCBase interface
176 Goblin& get_goblin() override { return goblin; }
177 const Goblin& get_goblin() const override { return goblin; }
178
179 Chonk(size_t num_circuits);
180
182 const std::vector<std::shared_ptr<RecursiveVKAndHash>>& input_keys = {});
183
184 [[nodiscard("Pairing points should be accumulated")]] std::
187 ClientCircuit& circuit,
188 const StdlibVerifierInputs& verifier_inputs,
189 const std::optional<RecursiveVerifierAccumulator>& input_verifier_accumulator,
190 const TableCommitments& T_prev_commitments,
191 const std::shared_ptr<RecursiveTranscript>& accumulation_recursive_transcript);
192
193 // Complete the logic of a kernel circuit (e.g. HN/merge recursive verification, databus consistency checks)
195
204 void accumulate(ClientCircuit& circuit, const std::shared_ptr<MegaVerificationKey>& precomputed_vk) override;
205
207
209 static void hide_op_queue_content_in_tail(ClientCircuit& circuit);
211
217
218 private:
219#ifndef NDEBUG
226 void update_native_verifier_accumulator(const VerifierInputs& queue_entry,
227 const std::shared_ptr<Transcript>& verifier_transcript);
228
230 const std::shared_ptr<ProverInstance>& prover_instance,
231 const std::shared_ptr<MegaVerificationKey>& precomputed_vk);
232#endif
233
235 const std::shared_ptr<MegaVerificationKey>& verification_key);
236
238};
239
240} // 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:38
ProverAccumulator prover_accumulator
Definition chonk.hpp:147
Goblin & get_goblin() override
Definition chonk.hpp:176
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:45
HonkProof construct_honk_proof_for_hiding_kernel(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &verification_key)
Construct a zero-knowledge proof for the Hiding kernel, which recursively verifies the last folding,...
Definition chonk.cpp:535
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:569
void complete_kernel_circuit_logic(ClientCircuit &circuit)
Append logic to complete a kernel circuit.
Definition chonk.cpp:246
std::tuple< std::optional< RecursiveVerifierAccumulator >, std::vector< PairingPoints >, TableCommitments > perform_recursive_verification_and_databus_consistency_checks(ClientCircuit &circuit, const StdlibVerifierInputs &verifier_inputs, const std::optional< RecursiveVerifierAccumulator > &input_verifier_accumulator, const TableCommitments &T_prev_commitments, const std::shared_ptr< RecursiveTranscript > &accumulation_recursive_transcript)
Populate the provided circuit with constraints for (1) recursive verification of the provided accumul...
Definition chonk.cpp:98
VerifierAccumulator native_verifier_accum
Definition chonk.hpp:153
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:577
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:525
std::array< RecursiveFlavor::Commitment, ClientCircuit::NUM_WIRES > TableCommitments
Definition chonk.hpp:72
DataBusDepot bus_depot
Definition chonk.hpp:167
std::shared_ptr< Transcript > transcript
Definition chonk.hpp:138
size_t num_circuits_accumulated
Definition chonk.hpp:145
Flavor::Commitment Commitment
Definition chonk.hpp:46
void debug_incoming_circuit(ClientCircuit &circuit, const std::shared_ptr< ProverInstance > &prover_instance, const std::shared_ptr< MegaVerificationKey > &precomputed_vk)
Definition chonk.cpp:626
HonkProof decider_proof
Definition chonk.hpp:149
Flavor::Curve::AffineElement Point
Definition chonk.hpp:48
FF native_verifier_accum_hash
Definition chonk.hpp:154
size_t get_num_circuits() const
Definition chonk.hpp:173
QUEUE_TYPE
Proof type determining recursive verification logic in kernel circuits.
Definition chonk.hpp:105
bool has_last_app_been_accumulated
Definition chonk.hpp:156
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:357
std::deque< StdlibVerifierInputs > StdlibVerificationQueue
Definition chonk.hpp:134
static void hide_op_queue_content_in_tail(ClientCircuit &circuit)
Adds three random non-ops to the tail kernel for zero-knowledge.
Definition chonk.cpp:513
ChonkProof prove()
Construct Chonk proof, which, if verified, fully establishes the correctness of RCG.
Definition chonk.cpp:552
RecursiveFlavor::FF StdlibFF
Definition chonk.hpp:59
VerifierAccumulator recursive_verifier_native_accum
Definition chonk.hpp:151
bool is_previous_circuit_a_kernel
Definition chonk.hpp:155
static void hide_op_queue_accumulation_result(ClientCircuit &circuit)
Add a hiding op with fully random Px, Py field elements to prevent information leakage in Translator ...
Definition chonk.cpp:501
RecursiveFlavor::Commitment RecursiveCommitment
Definition chonk.hpp:60
MegaFlavor::CommitmentKey bn254_commitment_key
Definition chonk.hpp:169
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:397
MegaCircuitBuilder ClientCircuit
Definition chonk.hpp:52
const Goblin & get_goblin() const override
Definition chonk.hpp:177
size_t num_circuits
Definition chonk.hpp:143
std::deque< VerifierInputs > VerificationQueue
Definition chonk.hpp:114
VerificationQueue verification_queue
Definition chonk.hpp:163
Goblin goblin
Definition chonk.hpp:171
std::shared_ptr< Transcript > prover_accumulation_transcript
Definition chonk.hpp:141
StdlibVerificationQueue stdlib_verification_queue
Definition chonk.hpp:164
CommitmentKey object over a pairing group 𝔾₁.
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).
Definition flavor.hpp:136
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.
A container for the prover polynomials handles.
Container for all witness polynomials used/constructed by the prover.
Curve::ScalarField FF
ProverPolynomials_< HasZK > ProverPolynomials
Curve::AffineElement Commitment
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
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:172
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
Base Stdlib verification key class.
Definition flavor.hpp:423
FixedVKAndHash_< PrecomputedEntities< 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:591
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.
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
StdlibVerifierInputs(StdlibProof proof_, std::shared_ptr< RecursiveVKAndHash > honk_vk_and_hash_, QUEUE_TYPE type_, bool is_kernel_)
Definition chonk.hpp:124
std::shared_ptr< RecursiveVKAndHash > honk_vk_and_hash
Definition chonk.hpp:119
std::shared_ptr< MegaVerificationKey > honk_vk
Definition chonk.hpp:110
std::vector< FF > proof
Definition chonk.hpp:109
Prover's claim for multilinear batching - contains polynomials and their evaluation claims.
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
An object storing two EC points that represent the inputs to a pairing check.