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: 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// =====================
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
58 // Recursive types
74 // Folding
83
91 struct Proof {
94
101 static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS(size_t virtual_log_n = MegaZKFlavor::VIRTUAL_LOG_N)
102 {
103 return /*mega_proof*/ MegaZKFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS(virtual_log_n) +
104 /*merge_proof*/ MERGE_PROOF_SIZE +
106 /*ipa proof*/ IPA_PROOF_LENGTH +
108 }
109
116 static constexpr size_t PROOF_LENGTH(size_t virtual_log_n = MegaZKFlavor::VIRTUAL_LOG_N)
117 {
118 return PROOF_LENGTH_WITHOUT_PUB_INPUTS(virtual_log_n) +
120 }
121
122 size_t size() const;
123
129 std::vector<FF> to_field_elements() const;
130
132
133 // TODO(https://github.com/AztecProtocol/barretenberg/issues/1299): The following msgpack methods are generic
134 // and should leverage some kind of shared msgpack utility.
135 msgpack::sbuffer to_msgpack_buffer() const;
136
144 uint8_t* to_msgpack_heap_buffer() const;
145 static constexpr const char MSGPACK_SCHEMA_NAME[] = "ChonkProof";
146
147 class DeserializationError : public std::runtime_error {
148 public:
149 DeserializationError(const std::string& msg)
150 : std::runtime_error(std::string("Chonk Proof deserialization error: ") + msg)
151 {}
152 };
153
154 static Proof from_msgpack_buffer(uint8_t const*& buffer);
155 static Proof from_msgpack_buffer(const msgpack::sbuffer& buffer);
156
157 void to_file_msgpack(const std::string& filename) const;
158 static Proof from_file_msgpack(const std::string& filename);
159
161 bool operator==(const Proof& other) const = default;
162 };
163
168
178
183 std::vector<bb::fr> to_field_elements() const
184 {
185 std::vector<bb::fr> elements;
186
187 auto mega_elements = mega->to_field_elements();
188 elements.insert(elements.end(), mega_elements.begin(), mega_elements.end());
189
190 auto eccvm_elements = eccvm->to_field_elements();
191 elements.insert(elements.end(), eccvm_elements.begin(), eccvm_elements.end());
192
193 auto translator_elements = translator->to_field_elements();
194 elements.insert(elements.end(), translator_elements.begin(), translator_elements.end());
195
196 return elements;
197 }
198
205 {
206 size_t read_idx = 0;
207
209 size_t mega_read = mega->from_field_elements(elements.subspan(read_idx));
210 read_idx += mega_read;
211
213 size_t eccvm_read = eccvm->from_field_elements(elements.subspan(read_idx));
214 read_idx += eccvm_read;
215
217 size_t translator_read = translator->from_field_elements(elements.subspan(read_idx));
218 read_idx += translator_read;
219
220 return read_idx;
221 }
222 };
223
224 // Specifies proof type or equivalently the type of recursive verification to be performed on a given proof
225 enum class QUEUE_TYPE : uint8_t {
226 OINK,
227 HN,
228 HN_FINAL, // the final HN verification, used in hiding kernel
229 HN_TAIL, // used in tail to indicate special handling of merge for ZK
230 MEGA
231 };
232
233 // An entry in the native verification queue
235 std::vector<FF> proof; // oink or HN
238 bool is_kernel = false;
239 };
240 using VerificationQueue = std::deque<VerifierInputs>;
241
242 // An entry in the stdlib verification queue
244 StdlibProof proof; // oink or HN
245 std::shared_ptr<RecursiveVKAndHash> honk_vk_and_hash;
247 bool is_kernel = false;
248 };
249 using StdlibVerificationQueue = std::deque<StdlibVerifierInputs>;
250
251 private:
252 // Transcript for Chonk prover (shared between Hiding kernel, Merge, ECCVM, and Translator)
253 std::shared_ptr<Transcript> transcript = std::make_shared<Transcript>();
254
255 // Transcript to be shared across the folding of K_{i-1} (kernel), A_{i} (app)
257
258 size_t num_circuits; // total number of circuits to be accumulated in the IVC
259 public:
260 size_t num_circuits_accumulated = 0; // number of circuits accumulated so far
261
262 ProverAccumulator prover_accumulator; // current HN prover accumulator instance
263
264 HonkProof decider_proof; // decider proof to be verified in the Hiding kernel
265
266 VerifierAccumulator recursive_verifier_native_accum; // native verifier accumulator used in recursive folding
267#ifndef NDEBUG
268 VerifierAccumulator native_verifier_accum; // native verifier accumulator used in prover folding
269 FF native_verifier_accum_hash; // hash of the native verifier accumulator when entering recursive verification
270#endif
271
272 // Set of tuples {proof, verification_key, type (Oink/HN)} to be recursively verified
274 // Set of tuples {stdlib_proof, stdlib_verification_key, type} corresponding to the native verification queue
276
277 // Management of linking databus commitments between circuits in the IVC
279
281
283
284 size_t get_num_circuits() const { return num_circuits; }
285
286 // IVCBase interface
287 Goblin& get_goblin() override { return goblin; }
288 const Goblin& get_goblin() const override { return goblin; }
289
290 Chonk(size_t num_circuits);
291
293 const std::vector<std::shared_ptr<RecursiveVKAndHash>>& input_keys = {});
294
295 [[nodiscard("Pairing points should be accumulated")]] std::
298 ClientCircuit& circuit,
299 const StdlibVerifierInputs& verifier_inputs,
300 const std::optional<RecursiveVerifierAccumulator>& input_verifier_accumulator,
301 const TableCommitments& T_prev_commitments,
302 const std::shared_ptr<RecursiveTranscript>& accumulation_recursive_transcript);
303
304 // Complete the logic of a kernel circuit (e.g. HN/merge recursive verification, databus consistency checks)
306
315 void accumulate(ClientCircuit& circuit, const std::shared_ptr<MegaVerificationKey>& precomputed_vk) override;
316
317 Proof prove();
318
320 static void hide_op_queue_content_in_tail(ClientCircuit& circuit);
322
323 static bool verify(const Proof& proof, const VerificationKey& vk);
324
325 VerificationKey get_vk() const;
326
327 private:
328#ifndef NDEBUG
335 void update_native_verifier_accumulator(const VerifierInputs& queue_entry,
336 const std::shared_ptr<Transcript>& verifier_transcript);
337
339 const std::shared_ptr<ProverInstance>& prover_instance,
340 const std::shared_ptr<MegaVerificationKey>& precomputed_vk);
341#endif
342
344 const std::shared_ptr<MegaVerificationKey>& verification_key);
345
347};
348
349// Serialization methods for Chonk::VerificationKey
350inline void read(uint8_t const*& it, Chonk::VerificationKey& vk)
351{
352 using serialize::read;
353
354 size_t num_frs = Chonk::VerificationKey::calc_num_data_types();
355
356 // Read exactly num_frs field elements from the buffer
357 std::vector<bb::fr> field_elements(num_frs);
358 for (auto& element : field_elements) {
359 read(it, element);
360 }
361
362 // Then use from_field_elements to populate the verification key
363 vk.from_field_elements(field_elements);
364}
365
366inline void write(std::vector<uint8_t>& buf, Chonk::VerificationKey const& vk)
367{
368 using serialize::write;
369
370 // Convert to field elements and write them directly without length prefix
371 auto field_elements = vk.to_field_elements();
372 for (const auto& element : field_elements) {
373 write(buf, element);
374 }
375}
376
377} // namespace bb
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
DeserializationError(const std::string &msg)
Definition chonk.hpp:149
The IVC scheme used by the aztec client for private function execution.
Definition chonk.hpp:38
ProverAccumulator prover_accumulator
Definition chonk.hpp:262
Goblin & get_goblin() override
Definition chonk.hpp:287
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
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:494
void complete_kernel_circuit_logic(ClientCircuit &circuit)
Append logic to complete a kernel circuit.
Definition chonk.cpp:221
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:96
VerifierAccumulator native_verifier_accum
Definition chonk.hpp:268
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:685
Proof prove()
Construct a proof for the IVC, which, if verified, fully establishes its correctness.
Definition chonk.cpp:511
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:484
std::array< RecursiveFlavor::Commitment, ClientCircuit::NUM_WIRES > TableCommitments
Definition chonk.hpp:73
DataBusDepot bus_depot
Definition chonk.hpp:278
std::shared_ptr< Transcript > transcript
Definition chonk.hpp:253
size_t num_circuits_accumulated
Definition chonk.hpp:260
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:727
HonkProof decider_proof
Definition chonk.hpp:264
Flavor::Curve::AffineElement Point
Definition chonk.hpp:48
FF native_verifier_accum_hash
Definition chonk.hpp:269
size_t get_num_circuits() const
Definition chonk.hpp:284
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:326
std::deque< StdlibVerifierInputs > StdlibVerificationQueue
Definition chonk.hpp:249
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:472
RecursiveFlavor::FF StdlibFF
Definition chonk.hpp:60
VerifierAccumulator recursive_verifier_native_accum
Definition chonk.hpp:266
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:460
RecursiveFlavor::Commitment RecursiveCommitment
Definition chonk.hpp:61
MegaFlavor::CommitmentKey bn254_commitment_key
Definition chonk.hpp:280
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:361
MegaCircuitBuilder ClientCircuit
Definition chonk.hpp:52
VerificationKey get_vk() const
Definition chonk.cpp:674
const Goblin & get_goblin() const override
Definition chonk.hpp:288
size_t num_circuits
Definition chonk.hpp:258
std::deque< VerifierInputs > VerificationQueue
Definition chonk.hpp:240
VerificationQueue verification_queue
Definition chonk.hpp:273
Goblin goblin
Definition chonk.hpp:282
std::shared_ptr< Transcript > prover_accumulation_transcript
Definition chonk.hpp:256
static bool verify(const Proof &proof, const VerificationKey &vk)
Definition chonk.cpp:528
StdlibVerificationQueue stdlib_verification_queue
Definition chonk.hpp:275
CommitmentKey object over a pairing group 𝔾₁.
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
static constexpr size_t PUBLIC_INPUTS_SIZE
MultilinearBatchingProverClaim Accumulator
MultilinearBatchingVerifierClaim< Curve > Accumulator
Base class interface for IVC schemes.
A container for the prover polynomials handles.
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
Container for all witness polynomials used/constructed by the prover.
Curve::ScalarField FF
ProverPolynomials_< HasZK > ProverPolynomials
Curve::AffineElement Commitment
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
The recursive counterpart to the "native" Mega flavor.
StdlibTranscript< CircuitBuilder > Transcript
typename Curve::Element Commitment
typename Curve::ScalarField FF
VKAndHash_< FF, VerificationKey > VKAndHash
MegaFlavor::WitnessEntities< Commitment > WitnessCommitments
A container for the witness commitments.
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS(size_t virtual_log_n=VIRTUAL_LOG_N)
static constexpr size_t VIRTUAL_LOG_N
static size_t calc_num_data_types()
Calculate the number of field elements needed for serialization.
Definition flavor.hpp:189
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
The VerifierInstance encapsulates all the necessary information for a Mega Honk Verifier to verify a ...
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.
The stdlib counterpart of VerifierInstance, used in recursive folding verification.
uint8_t const * buf
Definition data_store.hpp:9
uint8_t buffer[RANDOM_BUFFER_SIZE]
Definition engine.cpp:34
UltraKeccakFlavor::VerificationKey VerificationKey
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
void write(std::vector< uint8_t > &buf, Chonk::VerificationKey const &vk)
Definition chonk.hpp:366
void read(uint8_t const *&it, Chonk::VerificationKey &vk)
Definition chonk.hpp:350
BaseTranscript< FrCodec, bb::crypto::Poseidon2< bb::crypto::Poseidon2Bn254ScalarFieldParams > > NativeTranscript
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
VerifierCommitmentKey< Curve > vk
void read(auto &it, msgpack_concepts::HasMsgPack auto &obj)
Automatically derived read for any object that defines .msgpack() (implicitly defined by MSGPACK_FIEL...
void write(auto &buf, const msgpack_concepts::HasMsgPack auto &obj)
Automatically derived write for any object that defines .msgpack() (implicitly defined by MSGPACK_FIE...
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
A full proof for the IVC scheme containing a Mega proof showing correctness of the Hiding kernel (whi...
Definition chonk.hpp:91
void to_file_msgpack(const std::string &filename) const
Definition chonk.cpp:642
static constexpr const char MSGPACK_SCHEMA_NAME[]
Definition chonk.hpp:145
static Proof from_msgpack_buffer(uint8_t const *&buffer)
Definition chonk.cpp:623
bool operator==(const Proof &other) const =default
MSGPACK_FIELDS(mega_proof, goblin_proof)
static Proof from_file_msgpack(const std::string &filename)
Definition chonk.cpp:653
HonkProof mega_proof
Definition chonk.hpp:92
size_t size() const
Definition chonk.cpp:554
static constexpr size_t PROOF_LENGTH(size_t virtual_log_n=MegaZKFlavor::VIRTUAL_LOG_N)
The size of a Chonk proof with backend-added public inputs: HidingKernelIO.
Definition chonk.hpp:116
GoblinProof goblin_proof
Definition chonk.hpp:93
static Proof from_field_elements(const std::vector< Chonk::FF > &fields)
Definition chonk.cpp:571
std::vector< FF > to_field_elements() const
Serialize proof to field elements.
Definition chonk.cpp:559
uint8_t * to_msgpack_heap_buffer() const
Very quirky method to convert a msgpack buffer to a "heap" buffer.
Definition chonk.cpp:615
msgpack::sbuffer to_msgpack_buffer() const
Definition chonk.cpp:608
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS(size_t virtual_log_n=MegaZKFlavor::VIRTUAL_LOG_N)
The size of a Chonk proof without backend-added public inputs.
Definition chonk.hpp:101
std::shared_ptr< RecursiveVKAndHash > honk_vk_and_hash
Definition chonk.hpp:245
static size_t calc_num_data_types()
Calculate the number of field elements needed for serialization.
Definition chonk.hpp:173
std::shared_ptr< ECCVMVerificationKey > eccvm
Definition chonk.hpp:166
size_t from_field_elements(std::span< const bb::fr > elements)
Deserialize verification key from field elements.
Definition chonk.hpp:204
std::shared_ptr< TranslatorVerificationKey > translator
Definition chonk.hpp:167
std::vector< bb::fr > to_field_elements() const
Serialize verification key to field elements.
Definition chonk.hpp:183
std::shared_ptr< MegaVerificationKey > mega
Definition chonk.hpp:165
std::shared_ptr< MegaVerificationKey > honk_vk
Definition chonk.hpp:236
std::vector< FF > proof
Definition chonk.hpp:235
An object storing two EC points that represent the inputs to a pairing check.