22 const std::shared_ptr<Transcript>& transcript,
23 const std::shared_ptr<Transcript>& ipa_transcript)
24 : transcript(transcript)
25 , ipa_transcript(ipa_transcript)
49 transcript->add_to_hash_buffer(
"vk_hash", vk_hash);
50 vinfo(
"ECCVM vk hash in prover: ", vk_hash);
62 const size_t circuit_size =
key->circuit_size;
69 for (
const auto& [wire, label] :
zip_view(
key->polynomials.get_wires_without_accumulators(),
73 const size_t start = circuit_size == wire.size() ? 0 : 1;
80 for (
const auto& [wire, label] :
94 auto [beta, gamma] =
transcript->template get_challenges<FF>(
"beta",
"gamma");
97 auto beta_sqr = beta * beta;
103 gamma * (gamma + beta_sqr) * (gamma + beta_sqr + beta_sqr) * (gamma + beta_sqr + beta_sqr + beta_sqr);
135 FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
137 std::vector<FF> gate_challenges(CONST_ECCVM_LOG_N);
138 for (
size_t idx = 0; idx < gate_challenges.size(); idx++) {
142 Sumcheck sumcheck(
key->circuit_size,
173 key->commitment_key);
174 small_subgroup_ipa_prover.
prove();
178 PolynomialBatcher polynomial_batcher(
key->circuit_size);
179 polynomial_batcher.set_unshifted(
key->polynomials.get_unshifted());
180 polynomial_batcher.set_to_be_shifted_by_one(
key->polynomials.get_to_be_shifted());
183 Shplemini::prove(
key->circuit_size,
200 PCS::compute_opening_proof(
key->commitment_key, batch_opening_claim,
ipa_transcript);
276 RefArray translation_polynomials{
key->polynomials.transcript_op,
277 key->polynomials.transcript_Px,
278 key->polynomials.transcript_Py,
279 key->polynomials.transcript_z1,
280 key->polynomials.transcript_z2 };
290 for (
auto [eval, poly, label] :
299 SmallIPA translation_masking_term_prover(
301 translation_masking_term_prover.prove();
304 FF small_ipa_evaluation_challenge =
305 transcript->template get_challenge<FF>(
"Translation:small_ipa_evaluation_challenge");
309 evaluation_points = translation_masking_term_prover.evaluation_points(small_ipa_evaluation_challenge);
310 evaluation_labels = translation_masking_term_prover.evaluation_labels();
313 for (
size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) {
314 auto witness_poly = translation_masking_term_prover.get_witness_polynomials()[idx];
315 const FF evaluation = witness_poly.evaluate(evaluation_points[idx]);
316 transcript->send_to_verifier(evaluation_labels[idx], evaluation);
317 opening_claims[idx] = { .polynomial = witness_poly, .opening_pair = { evaluation_points[idx], evaluation } };
322 Polynomial batched_translation_univariate{
key->circuit_size };
323 FF batched_translation_evaluation{ 0 };
324 FF batching_scalar =
FF(1);
326 batched_translation_univariate.add_scaled(polynomial, batching_scalar);
327 batched_translation_evaluation += eval * batching_scalar;
332 opening_claims[NUM_SMALL_IPA_EVALUATIONS] = { batched_translation_univariate,
343 const std::string& label,
350 transcript->send_to_verifier(label,
key->commitment_key.commit_with_type(polynomial, commit_type, active_ranges));
A container for the prover polynomials.
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
auto get_wires_without_accumulators()
typename Curve::ScalarField FF
typename Curve::BaseField BF
ECCVMLookupRelation< FF > LookupRelation
ECCVMProof construct_proof()
ECCVMProver(CircuitBuilder &builder, const std::shared_ptr< Transcript > &transcript, const std::shared_ptr< Transcript > &ipa_transcript=std::make_shared< Transcript >())
SumcheckOutput< Flavor > sumcheck_output
BB_PROFILE void execute_log_derivative_commitments_round()
Compute sorted witness-table accumulator.
size_t unmasked_witness_size
std::shared_ptr< Transcript > ipa_transcript
FF evaluation_challenge_x
ZKSumcheckData< Flavor > ZKData
std::shared_ptr< Transcript > transcript
ECCVMProof export_proof()
CommitmentLabels commitment_labels
TranslationEvaluations translation_evaluations
std::shared_ptr< ProvingKey > key
void commit_to_witness_polynomial(Polynomial &polynomial, const std::string &label, CommitmentKey::CommitType commit_type=CommitmentKey::CommitType::Default, const std::vector< std::pair< size_t, size_t > > &active_ranges={})
Utility to mask and commit to a witness polynomial and send the commitment to verifier.
BB_PROFILE void execute_preamble_round()
Fiat-Shamir the VK.
BB_PROFILE void execute_wire_commitments_round()
Compute commitments to the first three wires.
Flavor::CommitmentKey CommitmentKey
std::array< OpeningClaim, NUM_OPENING_CLAIMS > opening_claims
BB_PROFILE void execute_grand_product_computation_round()
Compute permutation and lookup grand product polynomials and commitments.
BB_PROFILE void execute_relation_check_rounds()
Run Sumcheck resulting in u = (u_1,...,u_d) challenges and all evaluations at u being calculated.
BB_PROFILE void execute_pcs_rounds()
Produce a univariate opening claim for the sumcheck multivariate evalutions and a batched univariate ...
void compute_translation_opening_claims()
To link the ECCVM Transcript wires op, Px, Py, z1, and z2 to the accumulator computed by the translat...
bb::RelationParameters< FF > relation_parameters
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
void mask()
Add random values to the coefficients of a polynomial. In practice, this is used for ensuring the com...
Polynomial p and an opening pair (r,v) such that p(r) = v.
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
A Curve-agnostic ZK protocol to prove inner products of small vectors.
std::array< bb::Polynomial< FF >, NUM_SMALL_IPA_EVALUATIONS > get_witness_polynomials() const
void prove()
Compute the derived witnesses and and commit to them.
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
A class designed to accept the ECCVM Transcript Polynomials, concatenate their masking terms in Lagra...
UltraKeccakFlavor::VerificationKey VerificationKey
Entry point for Barretenberg command-line interface.
void compute_logderivative_inverse(Polynomials &polynomials, auto &relation_parameters, const size_t circuit_size)
Compute the inverse polynomial I(X) required for logderivative lookupsdetails Inverse may be defined ...
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
#define PROFILE_THIS_NAME(name)
T eccvm_set_permutation_delta
RefArray< BF, NUM_TRANSLATION_EVALUATIONS > get_all()
std::array< std::string, NUM_TRANSLATION_EVALUATIONS > labels