26 if constexpr (
requires { Relation::HAS_LOGDERIVATIVE_INVERSE_COMPUTATION; }) {
27 return Relation::HAS_LOGDERIVATIVE_INVERSE_COMPUTATION;
38 const size_t ck_size = prover_instance->polynomials.max_end_index();
41 send_vk_hash_and_public_inputs();
42 commit_to_masking_poly();
46 commit_to_lookup_counts_and_w4();
47 commit_to_logderiv_inverses();
50 prover_instance->alpha = transcript->template get_challenge<FF>(
"alpha");
60 return transcript->export_proof();
69 fr vk_hash = honk_vk->hash_with_origin_tagging(*transcript);
70 transcript->add_to_hash_buffer(
"vk_hash", vk_hash);
71 vinfo(
"vk hash in Oink prover: ", vk_hash);
73 for (
size_t i = 0; i < prover_instance->num_public_inputs(); ++i) {
74 auto public_input_i = prover_instance->public_inputs[i];
75 transcript->send_to_verifier(
"public_input_" +
std::to_string(i), public_input_i);
86 auto batch = commitment_key.start_batch();
90 batch.add_to_batch(prover_instance->polynomials.w_l(), commitment_labels.w_l(),
true);
91 batch.add_to_batch(prover_instance->polynomials.w_r(), commitment_labels.w_r(),
true);
92 batch.add_to_batch(prover_instance->polynomials.w_o(), commitment_labels.w_o(),
true);
94 if constexpr (Flavor::HasEccOpQueue) {
95 for (
auto [polynomial,
label] :
96 zip_view(prover_instance->polynomials.get_ecc_op_wires(), commitment_labels.get_ecc_op_wires())) {
97 batch.add_to_batch(polynomial,
label);
100 if constexpr (Flavor::HasDataBus) {
101 for (
auto [polynomial,
label] :
102 zip_view(prover_instance->polynomials.get_databus_entities(), commitment_labels.get_databus_entities())) {
103 batch.add_to_batch(polynomial,
label);
107 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
108 prover_instance->commitments.w_l() = computed_commitments[0];
109 prover_instance->commitments.w_r() = computed_commitments[1];
110 prover_instance->commitments.w_o() = computed_commitments[2];
112 size_t commitment_idx = 3;
113 if constexpr (Flavor::HasEccOpQueue) {
114 for (
auto& commitment : prover_instance->commitments.get_ecc_op_wires()) {
115 commitment = computed_commitments[commitment_idx++];
118 if constexpr (Flavor::HasDataBus) {
119 for (
auto& commitment : prover_instance->commitments.get_databus_entities()) {
120 commitment = computed_commitments[commitment_idx++];
136 if constexpr (Flavor::HasMemory) {
137 auto [eta, rom_logup_gamma] =
139 prover_instance->relation_parameters.eta = eta;
140 prover_instance->relation_parameters.eta_two = eta * eta;
141 prover_instance->relation_parameters.eta_three = prover_instance->relation_parameters.eta_two * eta;
142 prover_instance->relation_parameters.rom_logup_gamma = rom_logup_gamma;
147 add_ram_rom_memory_records_to_wire_4(*prover_instance);
148 add_rom_logup_inverses_to_wire_4(*prover_instance);
150 auto batch = commitment_key.start_batch();
151 if constexpr (Flavor::HasLogDerivLookup) {
152 batch.add_to_batch(prover_instance->polynomials.lookup_read_counts(), commitment_labels.lookup_read_counts());
153 batch.add_to_batch(prover_instance->polynomials.lookup_read_tags(), commitment_labels.lookup_read_tags());
155 batch.add_to_batch(prover_instance->polynomials.w_4(), commitment_labels.w_4(),
true);
156 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
159 if constexpr (Flavor::HasLogDerivLookup) {
160 prover_instance->commitments.lookup_read_counts() = computed_commitments[idx++];
161 prover_instance->commitments.lookup_read_tags() = computed_commitments[idx++];
163 prover_instance->commitments.w_4() = computed_commitments[idx++];
174 prover_instance->relation_parameters.beta = beta;
175 prover_instance->relation_parameters.gamma = gamma;
179 if constexpr (Flavor::HasLogDerivLookup) {
180 prover_instance->relation_parameters.beta_sqr = beta * beta;
181 prover_instance->relation_parameters.beta_cube = prover_instance->relation_parameters.beta_sqr * beta;
186 compute_logderivative_inverses(*prover_instance);
188 auto batch = commitment_key.start_batch();
189 if constexpr (Flavor::HasLogDerivLookup) {
190 batch.add_to_batch(prover_instance->polynomials.lookup_inverses(), commitment_labels.lookup_inverses());
193 if constexpr (Flavor::HasDataBus) {
194 for (
auto [polynomial,
label] :
195 zip_view(prover_instance->polynomials.get_databus_inverses(), commitment_labels.get_databus_inverses())) {
196 batch.add_to_batch(polynomial,
label);
199 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
201 size_t commitment_idx = 0;
202 if constexpr (Flavor::HasLogDerivLookup) {
203 prover_instance->commitments.lookup_inverses() = computed_commitments[commitment_idx++];
205 if constexpr (Flavor::HasDataBus) {
206 for (
auto& commitment : prover_instance->commitments.get_databus_inverses()) {
207 commitment = computed_commitments[commitment_idx];
223 uint32_t z_perm_dup_count = 0;
224 compute_grand_product_polynomial(*prover_instance, z_perm_dup_count);
226 auto& z_perm = prover_instance->polynomials.z_perm();
227 auto batch = commitment_key.start_batch();
228 batch.add_to_batch(z_perm, commitment_labels.z_perm(),
true, z_perm_dup_count);
229 auto commitments = batch.commit_and_send_to_verifier(transcript);
230 prover_instance->commitments.z_perm() = commitments[0];
235 if constexpr (flavor_has_gemini_masking<Flavor>()) {
238 const size_t dyadic_size = prover_instance->dyadic_size();
240 prover_instance->polynomials.gemini_masking_poly() =
241 build_gemini_masking_poly<FF>(d, prover_instance->polynomials.max_end_index(), dyadic_size);
246 masking_commitment = commitment_key.commit(prover_instance->polynomials.gemini_masking_poly());
248 transcript->send_to_verifier(
"Gemini:masking_poly_comm", masking_commitment);
263 BB_BENCH_NAME(
"OinkProver::add_ram_rom_memory_records_to_wire_4");
274 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
275 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
276 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
281 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
282 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
283 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
284 wires[3].at(gate_idx) += 1;
300 BB_BENCH_NAME(
"OinkProver::add_rom_logup_inverses_to_wire_4");
311 std::vector<FF> denominators;
314 const FF index_val = wires[0][gate_idx];
315 const FF value_val = wires[1][gate_idx];
316 const FF array_id = q_c[gate_idx];
317 denominators.emplace_back(rom_logup_gamma + index_val + eta * value_val + eta_two * array_id);
337 const size_t circuit_size = instance.
dyadic_size();
345 using Relations =
typename Flavor::template Relations_<FF>;
346 bb::constexpr_for<0, std::tuple_size_v<Relations>, 1>([&]<
size_t i>() {
348 if constexpr (relation_computes_logderivative_inverse<Relation>()) {
349 Relation::compute_logderivative_inverse(polynomials, relation_parameters, circuit_size, start);
359template <
typename Flavor>
362 BB_BENCH_NAME(
"OinkProver::compute_grand_product_polynomial");
370 compute_grand_product<Flavor, UltraPermutationRelation<FF>>(
377#ifdef STARKNET_GARAGA_FLAVORS
#define BB_BENCH_NAME(name)
typename G1::affine_element Commitment
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.
Proof export_proof()
Export the Oink proof.
static void compute_logderivative_inverses(ProverInstance &instance)
Compute the inverse polynomials used in the log derivative lookup relations.
void commit_to_logderiv_inverses()
Compute log derivative inverse polynomial and its commitment, if required.
void send_vk_hash_and_public_inputs()
Hash the verification key and send public inputs to the transcript.
static void add_rom_logup_inverses_to_wire_4(ProverInstance &instance)
Populate the inverse helper w_4 = 1 / (rom_logup_gamma + w_1 + eta * w_2 + eta_two * q_c) at every RO...
static void add_ram_rom_memory_records_to_wire_4(ProverInstance &instance)
Add RAM/ROM memory records to the fourth wire polynomial.
typename Flavor::CommitmentKey CommitmentKey
static void compute_grand_product_polynomial(ProverInstance &instance, uint32_t &z_perm_dup_count)
Computes public_input_delta and the permutation grand product polynomial.
void commit_to_lookup_counts_and_w4()
Compute sorted witness-table accumulator and commit to the resulting polynomials.
void commit_to_z_perm()
Compute the permutation grand product polynomial and commit to it.
void commit_to_masking_poly()
void commit_to_wires()
Commit to the wire polynomials (part of the witness), with the exception of the fourth wire,...
typename Transcript::Proof Proof
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
size_t pub_inputs_offset() const
std::vector< uint32_t > memory_write_records
static constexpr size_t TRACE_OFFSET
RelationParameters< FF > relation_parameters
size_t get_final_active_wire_idx() const
ProverPolynomials polynomials
size_t dyadic_size() const
std::vector< FF > public_inputs
std::vector< uint32_t > memory_read_records
std::vector< uint32_t > rom_logup_records
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
constexpr bool relation_computes_logderivative_inverse()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
static void batch_invert(C &coeffs) noexcept
Batch invert a collection of field elements using Montgomery's trick.