23 std::shared_ptr<MegaZKVK> mega_zk_vk,
24 std::shared_ptr<Transcript> transcript)
25 : mega_zk_inst(
std::move(mega_zk_instance))
26 , mega_zk_vk(
std::move(mega_zk_vk))
27 , transcript(
std::move(transcript))
38 BB_BENCH_NAME(
"BatchedHonkTranslatorProver::execute_mega_zk_oink");
40 oink_prover.
prove(
false);
52 BB_BENCH_NAME(
"BatchedHonkTranslatorProver::execute_translator_oink");
79 BB_BENCH_NAME(
"BatchedHonkTranslatorProver::execute_joint_sumcheck_rounds");
81 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
84 std::vector<FF> gate_challenges =
88 FF alpha_power_KH =
FF(1);
90 alpha_power_KH *= alpha;
100 const size_t mega_zk_log_n =
mega_zk_inst->log_dyadic_size();
121 auto& mega_zk_params =
mega_zk_inst->relation_parameters;
122 auto& translator_polys =
translator_key->proving_key->polynomials;
125 MegaZKPartialEvals mega_zk_partial(mega_zk_polys,
static_cast<size_t>(1) << mega_zk_log_n);
137 static constexpr bool UseCommittedSumcheck =
true;
140 auto send_round = [&](
size_t round_idx) ->
FF {
150 auto update_round_state = [&](
size_t round_idx,
const FF& u) {
152 transcript->send_to_verifier(
"Sumcheck:minicircuit_evaluations",
163 auto do_round = [&](
auto& hpolys,
auto& tpolys,
size_t round_idx) ->
FF {
170 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/compute_univariate");
171 U_H = mega_zk_round.
compute_univariate(hpolys, mega_zk_params, gate_sep, mega_zk_alphas);
174 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/disabled_contribution");
185 BB_BENCH_NAME(
"joint_sumcheck/translator/compute_univariate");
190 eval *= alpha_power_KH;
195 return send_round(round_idx);
201 const FF u = do_round(mega_zk_polys, translator_polys, 0);
205 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/partially_evaluate");
206 MegaZKSumcheck::partially_evaluate(mega_zk_polys, mega_zk_partial, u);
212 BB_BENCH_NAME(
"joint_sumcheck/translator/partially_evaluate");
213 TransSumcheck::partially_evaluate(translator_polys, translator_partial, u);
219 update_round_state(0, u);
223 for (
size_t round_idx = 1; round_idx < mega_zk_log_n; round_idx++) {
224 const FF u = do_round(mega_zk_partial, translator_partial, round_idx);
228 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/partially_evaluate_in_place");
229 MegaZKSumcheck::partially_evaluate_in_place(mega_zk_partial, u);
235 BB_BENCH_NAME(
"joint_sumcheck/translator/partially_evaluate_in_place");
236 TransSumcheck::partially_evaluate_in_place(translator_partial, u);
241 update_round_state(round_idx, u);
246 for (
size_t round_idx = mega_zk_log_n; round_idx <
JOINT_LOG_N; round_idx++) {
252 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/virtual_univariate");
253 U_joint += MegaZKSumcheck::compute_virtual_round_univariate(
254 mega_zk_round, mega_zk_partial, mega_zk_params, gate_sep, mega_zk_alphas, rdp);
262 BB_BENCH_NAME(
"joint_sumcheck/translator/compute_univariate");
267 eval *= alpha_power_KH;
273 const FF u = send_round(round_idx);
278 BB_BENCH_NAME(
"joint_sumcheck/hiding_kernel/fold_for_zero_extension");
279 MegaZKSumcheck::fold_for_zero_extension(mega_zk_partial, u);
285 BB_BENCH_NAME(
"joint_sumcheck/translator/partially_evaluate_in_place");
286 TransSumcheck::partially_evaluate_in_place(translator_partial, u);
290 update_round_state(round_idx, u);
307 transcript->send_to_verifier(
"Sumcheck:evaluations_translator",
328 BB_BENCH_NAME(
"BatchedHonkTranslatorProver::execute_joint_pcs");
339 small_subgroup_ipa.prove();
343 const size_t joint_circuit_size =
static_cast<size_t>(1) <<
JOINT_LOG_N;
344 const size_t mega_zk_max_end =
mega_zk_inst->polynomials.max_end_index();
345 const size_t trans_max_end =
translator_key->proving_key->circuit_size;
346 const size_t max_end_index =
std::max(mega_zk_max_end, trans_max_end);
348 PolynomialBatcher polynomial_batcher(joint_circuit_size, max_end_index);
352 auto trans_unshifted =
translator_key->proving_key->polynomials.get_pcs_unshifted();
353 auto mega_zk_unshifted =
mega_zk_inst->polynomials.get_unshifted();
354 auto joint_unshifted =
concatenate(trans_unshifted, mega_zk_unshifted);
355 polynomial_batcher.set_unshifted(joint_unshifted);
358 auto mega_zk_shifted =
mega_zk_inst->polynomials.get_to_be_shifted();
359 auto trans_shifted =
translator_key->proving_key->polynomials.get_pcs_to_be_shifted();
360 auto joint_shifted =
concatenate(mega_zk_shifted, trans_shifted);
361 polynomial_batcher.set_to_be_shifted_by_one(joint_shifted);
369 small_subgroup_ipa.get_witness_polynomials(),
378 BB_BENCH_NAME(
"BatchedHonkTranslatorProver::prove_mega_zk_oink");
#define BB_ASSERT(expression,...)
#define BB_BENCH_NAME(name)
std::shared_ptr< MegaZKProverInstance > mega_zk_inst
BatchedHonkTranslatorProver(std::shared_ptr< MegaZKProverInstance > mega_zk_instance, std::shared_ptr< MegaZKVK > mega_zk_vk, std::shared_ptr< Transcript > transcript)
MegaZKFlavor::AllValues mega_zk_claimed_evals
std::vector< Polynomial< FF > > round_univariates_list
std::shared_ptr< TranslatorProvingKey > translator_key
static constexpr size_t JOINT_LOG_N
std::vector< FF > joint_challenge
void execute_joint_sumcheck_rounds()
Execute the joint 17-round sumcheck.
bb::RelationParameters< FF > translator_relation_parameters
TranslatorFlavor::AllValues trans_claimed_evals
std::shared_ptr< Transcript > transcript
void execute_joint_pcs()
Execute the joint Shplemini / KZG PCS over both circuits' polynomials.
std::array< FF, MegaZKFlavor::NUM_SUBRELATIONS - 1 > MegaZKSubrelationSeparators
HonkProof prove(std::shared_ptr< TranslatorProvingKey > translator_proving_key)
FF claimed_libra_evaluation
std::vector< std::array< FF, 3 > > round_evaluations_list
std::array< FF, TranslatorFlavor::NUM_SUBRELATIONS - 1 > TransSubrelationSeparators
void execute_mega_zk_oink()
Run the MegaZK circuit's Oink phase.
std::shared_ptr< MegaZKVK > mega_zk_vk
void execute_translator_oink()
Run the translator's Oink phase on the shared transcript.
HonkProof prove_mega_zk_oink()
ZKSumcheckData< MegaZKFlavor > ZKData
CommitmentKey object over a pairing group 𝔾₁.
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
static void compute_opening_proof(const CK &ck, const ProverOpeningClaim< Curve > &opening_claim, const std::shared_ptr< Transcript > &prover_trancript)
Computes the KZG commitment to an opening proof polynomial at a single evaluation point.
static constexpr size_t NUM_SUBRELATIONS
Executes the "Oink" phase of the Honk proving protocol: the initial rounds that commit to witness dat...
void prove(bool emit_alpha=true)
Commit to witnesses, compute relation parameters, and prepare for Sumcheck.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
A container for storing the partially evaluated multivariates produced by sumcheck.
Polynomial p and an opening pair (r,v) such that p(r) = v.
static OpeningClaim prove(size_t circuit_size, PolynomialBatcher &polynomial_batcher, std::span< FF > multilinear_challenge, const CommitmentKey< Curve > &commitment_key, const std::shared_ptr< Transcript > &transcript, const std::array< Polynomial, NUM_SMALL_IPA_EVALUATIONS > &libra_polynomials={}, const std::vector< Polynomial > &sumcheck_round_univariates={}, const std::vector< std::array< FF, 3 > > &sumcheck_round_evaluations={})
A Curve-agnostic ZK protocol to prove inner products of small vectors.
Flavor::CommitmentKey commitment_key
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
Imlementation of the Sumcheck prover round.
SumcheckRoundUnivariate compute_univariate(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas)
Return the evaluations of the univariate round polynomials. Toggles between chunked computation (desi...
static SumcheckRoundUnivariate compute_libra_univariate(const ZKData &zk_sumcheck_data, size_t round_idx)
Compute Libra round univariate expressed given by the formula.
size_t excluded_head_size
SumcheckRoundUnivariate compute_disabled_contribution(ProverPolynomialsOrPartiallyEvaluatedMultivariates &polynomials, const bb::RelationParameters< FF > &relation_parameters, const bb::GateSeparatorPolynomial< FF > &gate_separators, const SubrelationSeparators &alphas, const RowDisablingPolynomial< FF > row_disabling_polynomial)
Compute the disabled rows' contribution to the round univariate.
size_t round_size
In Round , equals .
static std::array< FFType, NUM_FULL_CIRCUIT_EVALUATIONS > get_full_circuit_evaluations(AllEntities< FFType > &evals)
Prover: extract the full-circuit evaluations via get_full_circuit_entities().
static constexpr size_t LOG_MINI_CIRCUIT_SIZE
static constexpr size_t NUM_SUBRELATIONS
static std::array< FF, NUM_MINICIRCUIT_EVALUATIONS > get_minicircuit_evaluations(PolyContainer &polys)
Prover: read the 154 minicircuit wire evaluations from partially-evaluated polynomials.
BB_PROFILE void execute_preamble_round()
Add circuit size and values used in the relations to the transcript.
BB_PROFILE void execute_grand_product_computation_round()
Compute permutation product polynomial and commitments.
bb::RelationParameters< FF > relation_parameters
BB_PROFILE void execute_wire_and_sorted_constraints_commitments_round()
Compute commitments to wires and ordered range constraints.
A univariate polynomial represented by its values on {0, 1,..., domain_end - 1}.
std::array< Fr, LENGTH > evaluations
static constexpr size_t SUBGROUP_SIZE
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
RefArray< T,(Ns+...)> constexpr concatenate(const RefArray< T, Ns > &... ref_arrays)
Concatenates multiple RefArray objects into a single RefArray.
CommitmentKey< Curve > ck
std::array< FF, N > initialize_relation_separator(const FF &alpha)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
Implementation of the methods for the -polynomials used in in Sumcheck.
void partially_evaluate(FF challenge)
Partially evaluate the -polynomial at the new challenge and update .
Handler for processing round univariates in sumcheck. Default implementation: send evaluations direct...
void finalize_last_round(size_t, const bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &, const FF &)
void process_round_univariate(size_t round_idx, bb::Univariate< FF, BATCHED_RELATION_PARTIAL_LENGTH > &round_univariate)
Polynomial for Sumcheck with disabled Rows.
void update_evaluations(FF round_challenge, size_t round_idx)
Compute the evaluations of L^{(i)} at 0 and 1.
ClaimedLibraEvaluations libra_evaluations
void update_zk_sumcheck_data(const FF &round_challenge, const size_t round_idx)
Upon receiving the challenge , the prover updates Libra data. If .