barretenberg
Loading...
Searching...
No Matches
kate_verification.hpp
1#pragma once
2
3#include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp"
4#include <map>
5
6namespace proof_system::plonk {
7
8template <typename Field, typename Transcript, typename program_settings>
9Field compute_kate_batch_evaluation(typename Transcript::Key* key, const Transcript& transcript)
10{
11 // In this method, we compute the scalar multiplicand of the batch evaluation commitment
12 // described in step 11 of verifier's algorithm.
13 //
14 // Step 11: Compute batch evaluation commitment [E]_1
15 // [E]_1 := (t_eval
16 // + \nu_{a}.a_eval + \nu_{b}.b_eval + \nu_{c}.c_eval
17 // + \nu_{\sigma1}.sigma1_eval + \nu_{\sigma2}.sigma2_eval + \nu_{\sigma3}.sigma3_eval
18 // + \nu_q_l.separator.q_l_eval + \nu_q_r.separator.q_r_eval + \nu_q_o.separator.q_o_eval
19 // + \nu_q_c.separator.q_c_eval + \nu_q_m.separator.q_m_eval
20 // + nu_z_omega.separator.z_eval_omega) . [1]_1
21 //
22 // The challenges nu_{string} depend on the scalar they are being multiplied to.
23 //
24 Field batch_eval(0);
25
26 const auto separator_challenge = transcript.get_challenge_field_element("separator", 0);
27 const auto& polynomial_manifest = key->polynomial_manifest;
28 for (size_t i = 0; i < key->polynomial_manifest.size(); ++i) {
29 const auto& item = polynomial_manifest[i];
30
31 const std::string poly_label(item.polynomial_label);
32
33 bool has_shifted_evaluation = item.requires_shifted_evaluation;
34
35 const auto nu_challenge = transcript.get_challenge_field_element_from_map("nu", poly_label);
36 const auto poly_at_zeta = transcript.get_field_element(poly_label);
37 batch_eval += nu_challenge * poly_at_zeta;
38
39 if (has_shifted_evaluation) {
40 const auto nu_challenge = transcript.get_challenge_field_element_from_map("nu", poly_label + "_omega");
41 const auto poly_at_zeta_omega = transcript.get_field_element(poly_label + "_omega");
42 batch_eval += separator_challenge * nu_challenge * poly_at_zeta_omega;
43 }
44 }
45
46 const auto quotient_eval = transcript.get_field_element("t");
47 const auto quotient_challenge = transcript.get_challenge_field_element_from_map("nu", "t");
48
49 batch_eval += (quotient_eval * quotient_challenge);
50 return batch_eval;
51}
52
53template <typename Field, typename Group, typename Transcript, typename program_settings>
54void populate_kate_element_map(verification_key* key,
55 const Transcript& transcript,
56 std::map<std::string, Group>& kate_g1_elements,
57 std::map<std::string, Field>& kate_fr_elements)
58{
59 const auto separator_challenge = transcript.get_challenge_field_element("separator", 0);
60
61 const auto& polynomial_manifest = key->polynomial_manifest;
62 for (size_t i = 0; i < key->polynomial_manifest.size(); ++i) {
63 const auto& item = polynomial_manifest[i];
64 const std::string label(item.commitment_label);
65 const std::string poly_label(item.polynomial_label);
66 switch (item.source) {
67 case PolynomialSource::WITNESS: {
68 const auto element = transcript.get_group_element(label);
69 kate_g1_elements.insert({ label, element });
70 break;
71 }
72 case PolynomialSource::SELECTOR:
73 case PolynomialSource::PERMUTATION: {
74 const auto element = key->commitments.at(label);
75 kate_g1_elements.insert({ label, element });
76 break;
77 }
78 case PolynomialSource::OTHER: {
79 break;
80 }
81 }
82 Field kate_fr_scalar(0);
83 if (item.requires_shifted_evaluation) {
84 const auto challenge = transcript.get_challenge_field_element_from_map("nu", poly_label + "_omega");
85 kate_fr_scalar += (separator_challenge * challenge);
86 }
87
88 const auto challenge = transcript.get_challenge_field_element_from_map("nu", poly_label);
89 kate_fr_scalar += challenge;
90
91 kate_fr_elements.insert({ label, kate_fr_scalar });
92 }
93
94 const auto zeta = transcript.get_challenge_field_element("z", 0);
95 const auto quotient_nu = transcript.get_challenge_field_element_from_map("nu", "t");
96
97 Field z_pow_n = zeta.pow(key->circuit_size);
98 Field z_power = 1;
99 for (size_t i = 0; i < program_settings::program_width; ++i) {
100 std::string quotient_label = "T_" + std::to_string(i + 1);
101 const auto element = transcript.get_group_element(quotient_label);
102
103 kate_g1_elements.insert({ quotient_label, element });
104 kate_fr_elements.insert({ quotient_label, quotient_nu * z_power });
105 z_power *= z_pow_n;
106 }
107}
108
109} // namespace proof_system::plonk
Definition: widget.bench.cpp:13