Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
oink_verifier.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
23
24namespace bb {
25
29template <typename Flavor> void OinkVerifier<Flavor>::verify(bool emit_alpha)
30{
31 receive_vk_hash_and_public_inputs();
32 if constexpr (flavor_has_gemini_masking<Flavor>()) {
33 verifier_instance->gemini_masking_commitment =
34 transcript->template receive_from_prover<Commitment>("Gemini:masking_poly_comm");
35 }
36 receive_wire_commitments();
37 receive_lookup_counts_and_w4_commitments();
38 receive_logderiv_commitments();
39 complete_grand_product_round();
40
41 if (emit_alpha) {
42 verifier_instance->alpha = transcript->template get_challenge<FF>("alpha");
43 }
44}
45
50{
51 auto vk = verifier_instance->get_vk();
52
53 FF vk_hash = vk->hash_with_origin_tagging(*transcript);
54 transcript->add_to_hash_buffer("vk_hash", vk_hash);
55 vinfo("vk hash in Oink verifier: ", vk_hash);
56
57 // For recursive flavors, assert that the VK hash matches the expected hash provided in the VK
58 if constexpr (IsRecursiveFlavor<Flavor>) {
59 const bool is_write_vk_mode = vk_hash.get_context()->is_write_vk_mode();
60 const bool vk_hash_consistency = verifier_instance->vk_and_hash->hash.get_value() == vk_hash.get_value();
61 if (!vk_hash_consistency && !is_write_vk_mode) {
62 info("Recursive Ultra Verifier: VK Hash Mismatch");
63 }
64 verifier_instance->vk_and_hash->hash.assert_equal(vk_hash);
65
66 // Assert that the provided num_public_inputs matches VK's value (in-circuit constraint)
67 vk->num_public_inputs.assert_equal(FF(num_public_inputs), "OinkVerifier: num_public_inputs mismatch with VK");
68 } else {
69 BB_ASSERT_EQ(verifier_instance->vk_and_hash->hash, vk_hash, "Native Ultra Verifier: VK Hash Mismatch");
70 // Assert that the provided num_public_inputs matches VK's value
71 BB_ASSERT_EQ(num_public_inputs,
72 static_cast<size_t>(vk->num_public_inputs),
73 "OinkVerifier: num_public_inputs mismatch with VK");
74 };
75
76 std::vector<FF> public_inputs;
77 for (size_t i = 0; i < num_public_inputs; ++i) {
78 auto public_input_i = transcript->template receive_from_prover<FF>("public_input_" + std::to_string(i));
79 public_inputs.emplace_back(public_input_i);
80 }
81 verifier_instance->public_inputs = std::move(public_inputs);
82}
83
88template <typename Flavor> void OinkVerifier<Flavor>::receive_wire_commitments()
89{
90 // Get commitments to first three wire polynomials
91 verifier_instance->witness_commitments.w_l() =
92 transcript->template receive_from_prover<Commitment>(comm_labels.w_l());
93 verifier_instance->witness_commitments.w_r() =
94 transcript->template receive_from_prover<Commitment>(comm_labels.w_r());
95 verifier_instance->witness_commitments.w_o() =
96 transcript->template receive_from_prover<Commitment>(comm_labels.w_o());
97
98 if constexpr (Flavor::HasEccOpQueue) {
99 for (auto [commitment, label] :
100 zip_view(verifier_instance->witness_commitments.get_ecc_op_wires(), comm_labels.get_ecc_op_wires())) {
101 commitment = transcript->template receive_from_prover<Commitment>(label);
102 }
103 }
104 if constexpr (Flavor::HasDataBus) {
105 for (auto [commitment, label] : zip_view(verifier_instance->witness_commitments.get_databus_entities(),
106 comm_labels.get_databus_entities())) {
107 commitment = transcript->template receive_from_prover<Commitment>(label);
108 }
109 }
110}
111
117{
118 // The memory relation is the sole consumer of the eta powers and the ROM-LogUp offset
119 // `rom_logup_gamma`, so `Flavor::HasMemory` gates their FS samples and the power computation.
120 // When false, skip them — prover and verifier stay in lockstep on the FS state, and the
121 // in-circuit recursive verifier avoids dangling witnesses (eta_two/eta_three/rom_logup_gamma)
122 // that the static analyzer would flag.
123 if constexpr (Flavor::HasMemory) {
124 auto [eta, rom_logup_gamma] =
125 transcript->template get_challenges<FF>(std::array<std::string, 2>{ "eta", "rom_logup_gamma" });
126 verifier_instance->relation_parameters.eta = eta;
127 verifier_instance->relation_parameters.eta_two = eta * eta;
128 verifier_instance->relation_parameters.eta_three = verifier_instance->relation_parameters.eta_two * eta;
129 verifier_instance->relation_parameters.rom_logup_gamma = rom_logup_gamma;
130 }
131
132 // Get commitments to lookup argument polynomials and fourth wire
133 if constexpr (Flavor::HasLogDerivLookup) {
134 verifier_instance->witness_commitments.lookup_read_counts() =
135 transcript->template receive_from_prover<Commitment>(comm_labels.lookup_read_counts());
136 verifier_instance->witness_commitments.lookup_read_tags() =
137 transcript->template receive_from_prover<Commitment>(comm_labels.lookup_read_tags());
138 }
139 verifier_instance->witness_commitments.w_4() =
140 transcript->template receive_from_prover<Commitment>(comm_labels.w_4());
141}
142
147{
148 auto [beta, gamma] = transcript->template get_challenges<FF>(std::array<std::string, 2>{ "beta", "gamma" });
149 verifier_instance->relation_parameters.beta = beta;
150 verifier_instance->relation_parameters.gamma = gamma;
151 // The log-derivative lookup relation is the sole consumer of the squared/cubed beta powers, so
152 // `Flavor::HasLogDerivLookup` gates their computation. When false, skip the extra multiplications
153 // to avoid leaving the squared/cubed witnesses dangling in the in-circuit recursive verifier.
154 if constexpr (Flavor::HasLogDerivLookup) {
155 verifier_instance->relation_parameters.beta_sqr = beta * beta;
156 verifier_instance->relation_parameters.beta_cube = verifier_instance->relation_parameters.beta_sqr * beta;
157 }
158
159 if constexpr (Flavor::HasLogDerivLookup) {
160 verifier_instance->witness_commitments.lookup_inverses() =
161 transcript->template receive_from_prover<Commitment>(comm_labels.lookup_inverses());
162 }
163
164 if constexpr (Flavor::HasDataBus) {
165 for (auto [commitment, label] : zip_view(verifier_instance->witness_commitments.get_databus_inverses(),
166 comm_labels.get_databus_inverses())) {
167 commitment = transcript->template receive_from_prover<Commitment>(label);
168 }
169 }
170}
171
176{
177 auto vk = verifier_instance->get_vk();
178
179 verifier_instance->relation_parameters.public_input_delta =
180 compute_public_input_delta<Flavor>(verifier_instance->public_inputs,
181 verifier_instance->relation_parameters.beta,
182 verifier_instance->relation_parameters.gamma,
183 vk->pub_inputs_offset);
184
185 verifier_instance->witness_commitments.z_perm() =
186 transcript->template receive_from_prover<Commitment>(comm_labels.z_perm());
187}
188
189// Native flavor instantiations
190template class OinkVerifier<UltraFlavor>;
191template class OinkVerifier<UltraZKFlavor>;
193#ifdef STARKNET_GARAGA_FLAVORS
196#endif
198template class OinkVerifier<MegaFlavor>;
199template class OinkVerifier<MegaZKFlavor>;
200
201// Recursive flavor instantiations
211template class OinkVerifier<MegaAppFlavor>;
212template class OinkVerifier<MegaKernelFlavor>;
215
216} // namespace bb
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:83
bb::field< bb::Bn254FrParams > FF
Definition field.cpp:24
Verifier counterpart to OinkProver: receives witness commitments, computes relation parameters,...
void receive_wire_commitments()
Receive wire commitments (w_l, w_r, w_o). For Mega, also receive ECC op wire and DataBus commitments....
void receive_logderiv_commitments()
Receive beta/gamma challenges and log-derivative inverse commitments (plus databus inverses for Mega)...
typename Flavor::FF FF
void receive_vk_hash_and_public_inputs()
Hash the verification key, assert consistency, and receive public inputs from the transcript.
void receive_lookup_counts_and_w4_commitments()
Get sorted witness-table accumulator and fourth wire commitments.
void complete_grand_product_round()
Compute public_input_delta for the permutation argument and receive z_perm commitment.
void verify(bool emit_alpha=true)
Receive witness commitments, compute relation parameters, and prepare for Sumcheck.
#define info(...)
Definition log.hpp:93
#define vinfo(...)
Definition log.hpp:94
std::string label
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)