18 const std::shared_ptr<Transcript>& transcript)
19 : transcript(transcript)
23 if (!
key->proving_key->commitment_key.initialized()) {
37 transcript->add_to_hash_buffer(
"vk_hash", vk_hash);
38 vinfo(
"Translator vk hash in prover: ", vk_hash);
45 key->proving_key->polynomials.accumulators_binary_limbs_1[RESULT_ROW],
46 key->proving_key->polynomials.accumulators_binary_limbs_2[RESULT_ROW],
47 key->proving_key->polynomials.accumulators_binary_limbs_3[RESULT_ROW] };
58 transcript->send_to_verifier(label,
key->proving_key->commitment_key.commit(polynomial));
67 BB_BENCH_NAME(
"TranslatorProver::execute_wire_and_sorted_constraints_commitments_round");
70 const size_t circuit_size =
key->proving_key->circuit_size;
72 auto masking_commitment =
73 key->proving_key->commitment_key.commit(
key->proving_key->polynomials.gemini_masking_poly);
74 transcript->send_to_verifier(
"Gemini:masking_poly_comm", masking_commitment);
79 auto batch =
key->proving_key->commitment_key.start_batch();
80 for (
const auto& [wire, label] :
81 zip_view(
key->proving_key->polynomials.get_non_opqueue_wires_and_ordered_range_constraints(),
83 batch.add_to_batch(wire, label,
false);
95 FF beta =
transcript->template get_challenge<FF>(
"beta");
96 FF gamma =
transcript->template get_challenge<FF>(
"gamma");
100 auto uint_evaluation_input =
uint256_t(
key->evaluation_input_x);
102 uint_evaluation_input.slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2),
103 uint_evaluation_input.slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3),
104 uint_evaluation_input.slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4),
105 uint_evaluation_input };
108 auto batching_challenge_v =
key->batching_challenge_v;
109 uint_batching_challenge_powers.emplace_back(batching_challenge_v);
110 auto running_power = batching_challenge_v * batching_challenge_v;
111 uint_batching_challenge_powers.emplace_back(running_power);
112 running_power *= batching_challenge_v;
113 uint_batching_challenge_powers.emplace_back(running_power);
114 running_power *= batching_challenge_v;
115 uint_batching_challenge_powers.emplace_back(running_power);
117 for (
size_t i = 0; i < 4; i++) {
119 uint_batching_challenge_powers[i].slice(0, NUM_LIMB_BITS),
120 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2),
121 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3),
122 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4),
123 uint_batching_challenge_powers[i]
142 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
145 for (
size_t idx = 0; idx < gate_challenges.size(); idx++) {
149 const size_t circuit_size =
key->proving_key->circuit_size;
151 Sumcheck sumcheck(circuit_size,
152 key->proving_key->polynomials,
159 const size_t log_subgroup_size =
static_cast<size_t>(
numeric::get_msb(Flavor::Curve::SUBGROUP_SIZE));
184 auto&
ck =
key->proving_key->commitment_key;
185 if (!
ck.initialized()) {
189 SmallSubgroupIPA small_subgroup_ipa_prover(
191 small_subgroup_ipa_prover.prove();
193 PolynomialBatcher polynomial_batcher(
key->proving_key->circuit_size);
194 polynomial_batcher.set_unshifted(
key->proving_key->polynomials.get_unshifted_without_interleaved());
195 polynomial_batcher.set_to_be_shifted_by_one(
key->proving_key->polynomials.get_to_be_shifted());
196 polynomial_batcher.set_interleaved(
key->proving_key->polynomials.get_interleaved(),
197 key->proving_key->polynomials.get_groups_to_be_interleaved());
205 small_subgroup_ipa_prover.get_witness_polynomials());
207 PCS::compute_opening_proof(
ck, prover_opening_claim,
transcript);
241 vinfo(
"computed opening proof");
253 return uint256_t(
key->proving_key->polynomials.accumulators_binary_limbs_0[RESULT_ROW]) +
254 (
uint256_t(
key->proving_key->polynomials.accumulators_binary_limbs_1[RESULT_ROW]) << 68) +
255 (
uint256_t(
key->proving_key->polynomials.accumulators_binary_limbs_2[RESULT_ROW]) << 136) +
256 (
uint256_t(
key->proving_key->polynomials.accumulators_binary_limbs_3[RESULT_ROW]) << 204);
#define BB_BENCH_NAME(name)
Simple verification key class for fixed-size circuits (ECCVM, Translator).
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
static Polynomial random(size_t size, size_t start_index=0)
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.
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
static constexpr size_t CONST_TRANSLATOR_LOG_N
static constexpr size_t NUM_LIMB_BITS
static constexpr size_t RESULT_ROW
CommitmentLabels commitment_labels
typename Flavor::CommitmentKey CommitmentKey
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_preamble_round()
Add circuit size and values used in the relations to the transcript.
void commit_to_witness_polynomial(Polynomial &polynomial, const std::string &label)
Utility to commit to witness polynomial and send the commitment to verifier.
uint256_t get_accumulated_result() const
Extract the accumulated result from the circuit.
TranslatorProver(const std::shared_ptr< TranslatorProvingKey > &key, const std::shared_ptr< Transcript > &transcript)
BB_PROFILE void execute_grand_product_computation_round()
Compute permutation product polynomial and commitments.
std::shared_ptr< TranslatorProvingKey > key
bb::RelationParameters< FF > relation_parameters
std::shared_ptr< Transcript > transcript
HonkProof construct_proof()
ZKSumcheckData< Flavor > ZKData
BB_PROFILE void execute_wire_and_sorted_constraints_commitments_round()
Compute commitments to wires and ordered range constraints.
SumcheckOutput< Flavor > sumcheck_output
typename Flavor::Polynomial Polynomial
BB_PROFILE void execute_pcs_rounds()
Produce a univariate opening claim for the sumcheck multivariate evalutions and a batched univariate ...
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
std::array< std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR+NUM_NATIVE_LIMBS_IN_GOBLIN_TRANSLATOR >, NUM_CHALLENGE_POWERS_IN_GOBLIN_TRANSLATOR > batching_challenge_v
std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR > accumulated_result
std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR+NUM_NATIVE_LIMBS_IN_GOBLIN_TRANSLATOR > evaluation_input_x