20 : trace_usage_tracker(trace_settings)
21 , num_circuits(num_circuits)
22 , trace_settings(trace_settings)
23 , goblin(bn254_commitment_key)
28 size_t commitment_key_size =
30 info(
"BN254 commitment key size: ", commitment_key_size);
45 ClientCircuit& circuit,
const std::vector<std::shared_ptr<RecursiveVKAndHash>>& input_keys)
47 bool vkeys_provided = !input_keys.empty();
51 "Incorrect number of verification keys provided in "
52 "stdlib verification queue instantiation.");
63 std::shared_ptr<RecursiveVKAndHash> stdlib_vk_and_hash;
65 stdlib_vk_and_hash = input_keys[key_idx++];
83 verifier.verify_proof(proof);
85 verifier_instance->target_sum = StdlibFF::from_witness_index(&circuit, circuit.
zero_idx);
87 verifier_instance->gate_challenges =
88 transcript->template get_powers_of_challenge<StdlibFF>(
"gate_challenge", CONST_PG_LOG_N);
90 return verifier_instance;
102 BB_ASSERT_NEQ(verifier_accumulator,
nullptr,
"verifier_accumulator cannot be null in PG recursive verification");
107 prev_accum_hash = verifier_accumulator->hash_through_transcript(
"", *
transcript);
108 transcript->add_to_hash_buffer(
"accum_hash", *prev_accum_hash);
109 info(
"Previous accumulator hash in PG rec verifier: ", *prev_accum_hash);
113 auto updated_verifier_accumulator = verifier.verify_folding_proof(proof);
115 return updated_verifier_accumulator;
152 MergeCommitments merge_commitments{ .T_prev_commitments = T_prev_commitments };
154 auto verifier_instance =
162 switch (verifier_inputs.
type) {
167 circuit, verifier_instance, accumulation_recursive_transcript, verifier_inputs.
proof);
178 input_verifier_accumulator,
180 accumulation_recursive_transcript,
181 verifier_inputs.
proof,
193 auto num_public_inputs =
static_cast<size_t>(
honk_vk->num_public_inputs);
195 for (
size_t i = 0; i < num_public_inputs; i++) {
196 verifier_inputs.
proof[i].set_public();
200 input_verifier_accumulator,
202 accumulation_recursive_transcript,
203 verifier_inputs.
proof,
208 decider_pairing_points = decider.verify_proof(
decider_proof);
214 throw_or_abort(
"Invalid queue type! Only OINK, PG, PG_TAIL and PG_FINAL are supported");
231 kernel_input.
app_return_data.assert_equal(witness_commitments.secondary_calldata);
241 "Kernel circuits should be folded.");
244 ASSERT(prev_accum_hash.has_value());
247 if (!is_hiding_kernel) {
262 merge_commitments.t_commitments = witness_commitments.
get_ecc_op_wires().get_copy();
265 auto [pairing_points, merged_table_commitments] =
268 pairing_points.aggregate(nested_pairing_points);
269 if (is_hiding_kernel) {
270 pairing_points.aggregate(decider_pairing_points);
273 return { output_verifier_accumulator, pairing_points, merged_table_commitments };
299 bool is_init_kernel =
302 bool is_tail_kernel =
305 bool is_hiding_kernel =
312 if (is_tail_kernel) {
320 if (!is_init_kernel) {
321 current_stdlib_verifier_accumulator =
327 auto [output_stdlib_verifier_accumulator, pairing_points, merged_table_commitments] =
330 current_stdlib_verifier_accumulator,
332 accumulation_recursive_transcript);
333 points_accumulator.
aggregate(pairing_points);
335 T_prev_commitments = merged_table_commitments;
337 current_stdlib_verifier_accumulator = output_stdlib_verifier_accumulator;
342 if (is_hiding_kernel) {
343 BB_ASSERT_EQ(current_stdlib_verifier_accumulator,
nullptr);
344 HidingKernelIO hiding_output{ points_accumulator, T_prev_commitments };
359 current_stdlib_verifier_accumulator->hash_through_transcript(
"", hash_transcript);
367 const std::shared_ptr<Transcript>& transcript)
369 vinfo(
"computing oink proof...");
373 proving_key->target_sum = 0;
375 proving_key->gate_challenges =
380 HonkProof oink_proof = oink_prover.export_proof();
381 vinfo(
"oink proof constructed");
387 const std::shared_ptr<Transcript>& transcript,
390 vinfo(
"computing pg proof...");
397 info(
"Accumulator hash in PG prover: ", accum_hash);
405 vinfo(
"pg proof constructed");
452 ASSERT(precomputed_vk !=
nullptr,
"ClientIVC::accumulate - VK expected for the provided circuit");
480 auto verifier_transcript =
485 switch (queue_type) {
487 vinfo(
"Accumulating first app circuit with OINK");
488 BB_ASSERT_EQ(is_kernel,
false,
"First circuit accumulated must always be an app");
530 Point random_point = Point::random_element();
547 auto& hiding_circuit_vk =
honk_vk;
585 auto [mega_verified, T_prev_commitments] = verifier.template verify_proof<bb::HidingKernelIO>(proof.
mega_proof);
586 vinfo(
"Mega verified: ", mega_verified);
588 TableCommitments t_commitments = verifier.verification_key->witness_commitments.get_ecc_op_wires().get_copy();
593 vinfo(
"Goblin verified: ", goblin_verified);
596 return goblin_verified && mega_verified;
617 vinfo(
"prove decider...");
632 auto start = std::chrono::steady_clock::now();
633 const auto proof =
prove();
634 auto end = std::chrono::steady_clock::now();
635 auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
636 vinfo(
"time to call ClientIVC::prove: ", diff.count(),
" ms.");
639 const bool verified =
verify(proof);
640 end = std::chrono::steady_clock::now();
642 diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
643 vinfo(
"time to verify ClientIVC proof: ", diff.count(),
" ms.");
658 proof.insert(proof.end(), mega_proof.begin(), mega_proof.end());
659 proof.insert(proof.end(), goblin_proof.merge_proof.begin(), goblin_proof.merge_proof.end());
661 proof.end(), goblin_proof.eccvm_proof.pre_ipa_proof.begin(), goblin_proof.eccvm_proof.pre_ipa_proof.end());
662 proof.insert(proof.end(), goblin_proof.eccvm_proof.ipa_proof.begin(), goblin_proof.eccvm_proof.ipa_proof.end());
663 proof.insert(proof.end(), goblin_proof.translator_proof.begin(), goblin_proof.translator_proof.end());
671 msgpack::pack(
buffer, *
this);
677 msgpack::sbuffer
buffer = to_msgpack_buffer();
685 auto uint8_buffer = from_buffer<std::vector<uint8_t>>(
buffer);
687 msgpack::sbuffer sbuf;
688 sbuf.write(
reinterpret_cast<char*
>(uint8_buffer.data()), uint8_buffer.size());
690 return from_msgpack_buffer(sbuf);
695 msgpack::object_handle oh = msgpack::unpack(
buffer.data(),
buffer.size());
696 msgpack::object obj = oh.get();
704 msgpack::sbuffer
buffer = to_msgpack_buffer();
705 std::ofstream ofs(filename, std::ios::binary);
706 if (!ofs.is_open()) {
715 std::ifstream ifs(filename, std::ios::binary);
716 if (!ifs.is_open()) {
720 ifs.seekg(0, std::ios::end);
721 size_t file_size =
static_cast<size_t>(ifs.tellg());
722 ifs.seekg(0, std::ios::beg);
727 msgpack::sbuffer msgpack_buffer;
728 msgpack_buffer.write(
buffer.data(), file_size);
740 const std::shared_ptr<Transcript>& verifier_transcript)
744 verifier_transcript->load_proof(queue_entry.
proof);
751 verifier_transcript->template get_powers_of_challenge<FF>(
"gate_challenge", CONST_PG_LOG_N);
756 verifier_transcript->add_to_hash_buffer(
"accum_hash", accum_hash);
757 info(
"Accumulator hash in PG verifier: ", accum_hash);
#define BB_ASSERT_GT(left, right,...)
#define BB_ASSERT_NEQ(actual, expected,...)
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LT(left, right,...)
#define ASSERT(expression,...)
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
static std::shared_ptr< BaseTranscript > convert_prover_transcript_to_verifier_transcript(const std::shared_ptr< BaseTranscript > &prover_transcript)
Convert a prover transcript to a verifier transcript.
Proof prove()
Construct a proof for the IVC, which, if verified, fully establishes its correctness.
static void hide_op_queue_accumulation_result(ClientCircuit &circuit)
Add a random operation to the op queue to hide its content in Translator computation.
MegaFlavor::CommitmentKey bn254_commitment_key
HonkProof construct_oink_proof(const std::shared_ptr< DeciderProvingKey > &proving_key, const std::shared_ptr< MegaVerificationKey > &honk_vk, const std::shared_ptr< Transcript > &transcript)
TraceSettings trace_settings
std::shared_ptr< Transcript > prover_accumulation_transcript
ExecutionTraceUsageTracker trace_usage_tracker
HonkProof construct_decider_proof(const std::shared_ptr< Transcript > &transcript)
Internal method for constructing a decider proof.
std::shared_ptr< DeciderVerificationKey > recursive_verifier_native_accum
bool prove_and_verify()
Construct and verify a proof for the IVC.
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...
VerificationKey get_vk() const
void accumulate(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk)
Perform prover work for accumulation (e.g. PG folding, merge proving)
void complete_kernel_circuit_logic(ClientCircuit &circuit)
Append logic to complete a kernel circuit.
Flavor::Curve::AffineElement Point
HonkProof construct_pg_proof(const std::shared_ptr< DeciderProvingKey > &proving_key, const std::shared_ptr< MegaVerificationKey > &honk_vk, const std::shared_ptr< Transcript > &transcript, bool is_kernel)
size_t num_circuits_accumulated
void update_native_verifier_accumulator(const VerifierInputs &queue_entry, const std::shared_ptr< Transcript > &verifier_transcript)
Runs either Oink or PG native verifier to update the native verifier accumulator.
ClientIVC(size_t num_circuits, TraceSettings trace_settings={})
static std::shared_ptr< RecursiveDeciderVerificationKey > perform_pg_recursive_verification(ClientCircuit &circuit, const std::shared_ptr< RecursiveDeciderVerificationKey > &verifier_accumulator, const std::shared_ptr< RecursiveDeciderVerificationKey > &verifier_instance, const std::shared_ptr< RecursiveTranscript > &transcript, const StdlibProof &proof, std::optional< StdlibFF > &prev_accum_hash, bool is_kernel)
static std::shared_ptr< RecursiveDeciderVerificationKey > perform_oink_recursive_verification(ClientCircuit &circuit, const std::shared_ptr< RecursiveDeciderVerificationKey > &verifier_instance, const std::shared_ptr< RecursiveTranscript > &transcript, const StdlibProof &proof)
VerificationQueue verification_queue
std::tuple< std::shared_ptr< RecursiveDeciderVerificationKey >, PairingPoints, TableCommitments > perform_recursive_verification_and_databus_consistency_checks(ClientCircuit &circuit, const StdlibVerifierInputs &verifier_inputs, const std::shared_ptr< RecursiveDeciderVerificationKey > &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...
StdlibVerificationQueue stdlib_verification_queue
ProverFoldOutput fold_output
std::array< RecursiveFlavor::Commitment, ClientCircuit::NUM_WIRES > TableCommitments
std::shared_ptr< DeciderVerificationKey > native_verifier_accum
std::shared_ptr< Transcript > transcript
static bool verify(const Proof &proof, const VerificationKey &vk)
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.
HonkProof construct_mega_proof_for_hiding_kernel(ClientCircuit &circuit)
Construct a zero-knowledge proof for the hiding circuit, which recursively verifies the last folding,...
std::shared_ptr< MegaVerificationKey > honk_vk
stdlib::recursion::PairingPoints< ClientCircuit > PairingPoints
CommitmentKey object over a pairing group 𝔾₁.
static bool verify(const GoblinProof &proof, const MergeCommitments &merge_commitments, const std::shared_ptr< Transcript > &transcript, const MergeSettings merge_settings=MergeSettings::PREPEND)
Verify a full Goblin proof (ECCVM, Translator, merge)
std::pair< PairingPoints, RecursiveTableCommitments > recursively_verify_merge(MegaBuilder &builder, const RecursiveMergeCommitments &merge_commitments, const std::shared_ptr< RecursiveTranscript > &transcript, const MergeSettings merge_settings=MergeSettings::PREPEND)
Recursively verify the next merge proof in the merge verification queue.
MergeVerifier::TableCommitments TableCommitments
void prove_merge(const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >(), const MergeSettings merge_settings=MergeSettings::PREPEND)
Construct a merge proof for the goblin ECC ops in the provided circuit; append the proof to the merge...
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
CommitmentKey< curve::BN254 > commitment_key
std::shared_ptr< Transcript > transcript
ecc_op_tuple queue_ecc_eq()
Add point equality operation to the op queue based on the value of the internal accumulator and add c...
ecc_op_tuple queue_ecc_mul_accum(const g1::affine_element &point, const FF &scalar)
Add point mul-then-accumulate operation to the op queue and add corresponding gates.
ecc_op_tuple queue_ecc_no_op()
Logic for a no-op operation.
Container for all witness polynomials used/constructed by the prover.
Class for all the oink rounds, which are shared between the folding prover and ultra prover.
void prove()
Oink Prover function that runs all the rounds of the verifier.
Verifier class for all the presumcheck rounds, which are shared between the folding verifier and ultr...
void verify()
Oink Verifier function that runs all the rounds of the verifier.
std::shared_ptr< DeciderVK > verify_folding_proof(const std::vector< FF > &)
Run the folding protocol on the verifier side to establish whether the public data ϕ of the new accum...
static constexpr size_t CONST_TRANSLATOR_LOG_N
Commitment get_kernel_return_data_commitment(Builder &builder)
Get the previously set kernel return data commitment if it exists, else a default one.
Commitment get_app_return_data_commitment(Builder &builder)
Get the previously set app return data commitment if it exists, else a default one.
void set_app_return_data_commitment(const Commitment &commitment)
void set_kernel_return_data_commitment(const Commitment &commitment)
Manages the data that is propagated on the public inputs of an application/function circuit.
void reconstruct_from_public(const std::vector< FF > &public_inputs)
Reconstructs the IO components from a public inputs array.
PairingInputs pairing_inputs
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.
void reconstruct_from_public(const std::vector< FF > &public_inputs)
Reconstructs the IO components from a public inputs array.
PairingInputs pairing_inputs
static constexpr size_t PUBLIC_INPUTS_SIZE
void set_public()
Set each IO component to be a public input of the underlying circuit.
TableCommitments ecc_op_tables
uint8_t buffer[RANDOM_BUFFER_SIZE]
std::array< typename bn254< Builder >::Group, Builder::NUM_WIRES > empty_ecc_op_tables(Builder &builder)
Construct commitments to empty subtables.
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
uint8_t * to_heap_buffer(T const &value)
A full proof for the IVC scheme containing a Mega proof showing correctness of the hiding circuit (wh...
void to_file_msgpack(const std::string &filename) const
static Proof from_msgpack_buffer(uint8_t const *&buffer)
std::vector< FF > to_field_elements() const
Serialize proof to field elements.
uint8_t * to_msgpack_heap_buffer() const
Very quirky method to convert a msgpack buffer to a "heap" buffer.
static Proof from_file_msgpack(const std::string &filename)
msgpack::sbuffer to_msgpack_buffer() const
void update(const Builder &circuit)
std::shared_ptr< DeciderProvingKey_< Flavor > > accumulator
std::vector< typename Flavor::FF > proof
size_t dyadic_size() const
static field random_element(numeric::RNG *engine=nullptr) noexcept
An object storing two EC points that represent the inputs to a pairing check.
void aggregate(PairingPoints const &other)
Compute a linear combination of the present pairing points with an input set of pairing points.
uint32_t set_public()
Set the witness indices for the limbs of the pairing points to public.
void throw_or_abort(std::string const &err)