25 commitment_key =
CommitmentKey(prover_instance->polynomials.max_end_index());
26 send_vk_hash_and_public_inputs();
27 commit_to_masking_poly();
29 commit_to_lookup_counts_and_w4();
30 commit_to_logderiv_inverses();
32 prover_instance->alpha = transcript->template get_challenge<FF>(
"alpha");
41 return transcript->export_proof();
50 fr vk_hash = honk_vk->hash_with_origin_tagging(*transcript);
51 transcript->add_to_hash_buffer(
"vk_hash", vk_hash);
52 vinfo(
"vk hash in Oink prover: ", vk_hash);
54 for (
size_t i = 0; i < prover_instance->num_public_inputs(); ++i) {
55 auto public_input_i = prover_instance->public_inputs[i];
56 transcript->send_to_verifier(
"public_input_" +
std::to_string(i), public_input_i);
67 auto batch = commitment_key.start_batch();
70 batch.add_to_batch(prover_instance->polynomials.w_l, commitment_labels.w_l,
Flavor::HasZK);
71 batch.add_to_batch(prover_instance->polynomials.w_r, commitment_labels.w_r,
Flavor::HasZK);
72 batch.add_to_batch(prover_instance->polynomials.w_o, commitment_labels.w_o,
Flavor::HasZK);
76 for (
auto [polynomial, label] :
77 zip_view(prover_instance->polynomials.get_ecc_op_wires(), commitment_labels.get_ecc_op_wires())) {
78 batch.add_to_batch(polynomial, label,
false);
82 for (
auto [polynomial, label] :
83 zip_view(prover_instance->polynomials.get_databus_entities(), commitment_labels.get_databus_entities())) {
84 bool mask =
Flavor::HasZK && (label != commitment_labels.calldata);
85 batch.add_to_batch(polynomial, label, mask);
89 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
90 prover_instance->commitments.w_l = computed_commitments[0];
91 prover_instance->commitments.w_r = computed_commitments[1];
92 prover_instance->commitments.w_o = computed_commitments[2];
95 size_t commitment_idx = 3;
96 for (
auto& commitment : prover_instance->commitments.get_ecc_op_wires()) {
97 commitment = computed_commitments[commitment_idx++];
99 for (
auto& commitment : prover_instance->commitments.get_databus_entities()) {
100 commitment = computed_commitments[commitment_idx++];
113 prover_instance->relation_parameters.compute_eta_powers(transcript->template get_challenge<FF>(
"eta"));
115 add_ram_rom_memory_records_to_wire_4(*prover_instance);
118 auto batch = commitment_key.start_batch();
119 batch.add_to_batch(prover_instance->polynomials.lookup_read_counts,
120 commitment_labels.lookup_read_counts,
123 prover_instance->polynomials.lookup_read_tags, commitment_labels.lookup_read_tags,
Flavor::HasZK);
124 batch.add_to_batch(prover_instance->polynomials.w_4, commitment_labels.w_4,
Flavor::HasZK);
125 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
127 prover_instance->commitments.lookup_read_counts = computed_commitments[0];
128 prover_instance->commitments.lookup_read_tags = computed_commitments[1];
129 prover_instance->commitments.w_4 = computed_commitments[2];
140 prover_instance->relation_parameters.compute_beta_powers(beta);
141 prover_instance->relation_parameters.gamma = gamma;
144 compute_logderivative_inverses(*prover_instance);
146 auto batch = commitment_key.start_batch();
147 batch.add_to_batch(prover_instance->polynomials.lookup_inverses,
148 commitment_labels.lookup_inverses,
153 for (
auto [polynomial, label] :
154 zip_view(prover_instance->polynomials.get_databus_inverses(), commitment_labels.get_databus_inverses())) {
158 auto computed_commitments = batch.commit_and_send_to_verifier(transcript);
160 prover_instance->commitments.lookup_inverses = computed_commitments[0];
162 size_t commitment_idx = 1;
163 for (
auto& commitment : prover_instance->commitments.get_databus_inverses()) {
164 commitment = computed_commitments[commitment_idx];
177 compute_grand_product_polynomial(*prover_instance);
179 auto& z_perm = prover_instance->polynomials.z_perm;
185 prover_instance->commitments.z_perm = commitment_key.commit(z_perm);
187 transcript->send_to_verifier(commitment_labels.z_perm, prover_instance->commitments.z_perm);
194 const size_t polynomial_size = prover_instance->dyadic_size();
198 auto masking_commitment = commitment_key.commit(prover_instance->polynomials.gemini_masking_poly);
199 transcript->send_to_verifier(
"Gemini:masking_poly_comm", masking_commitment);
217 auto wires =
instance.polynomials.get_wires();
218 const auto& eta =
instance.relation_parameters.eta;
219 const auto& eta_two =
instance.relation_parameters.eta_two;
220 const auto& eta_three =
instance.relation_parameters.eta_three;
223 for (
const auto& gate_idx :
instance.memory_read_records) {
224 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
225 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
226 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
230 for (
const auto& gate_idx :
instance.memory_write_records) {
231 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
232 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
233 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
234 wires[3].at(gate_idx) += 1;
248 auto& polynomials =
instance.polynomials;
249 auto& relation_parameters =
instance.relation_parameters;
250 const size_t circuit_size =
instance.dyadic_size();
258 polynomials, relation_parameters, circuit_size);
262 polynomials, relation_parameters, circuit_size);
266 polynomials, relation_parameters, circuit_size);
277 auto& relation_parameters =
instance.relation_parameters;
278 relation_parameters.public_input_delta = compute_public_input_delta<Flavor>(
279 instance.public_inputs, relation_parameters.beta, relation_parameters.gamma,
instance.pub_inputs_offset());
282 compute_grand_product<Flavor, UltraPermutationRelation<FF>>(
283 instance.polynomials, relation_parameters,
instance.get_final_active_wire_idx() + 1);
289#ifdef STARKNET_GARAGA_FLAVORS
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define BB_BENCH_NAME(name)
static constexpr bool HasZK
Executes the "Oink" phase of the Honk proving protocol: the initial rounds that commit to witness dat...
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.
void prove()
Commit to witnesses, compute relation parameters, and prepare for Sumcheck.
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
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.
static void compute_grand_product_polynomial(ProverInstance &instance)
Computes public_input_delta and the permutation grand product polynomial.
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
static Polynomial random(size_t size, size_t start_index=0)
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
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 lookups.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)