Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
multilinear_batching_verifier.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
9
10namespace bb {
11
12template <typename Flavor_>
13MultilinearBatchingVerifier<Flavor_>::MultilinearBatchingVerifier(const std::shared_ptr<Transcript>& transcript)
14 : transcript(transcript)
15{}
16
17template <typename Flavor_>
19 Flavor_>::verify_proof()
20{
21 // Receive commitments
22 auto non_shifted_accumulator_commitment =
23 transcript->template receive_from_prover<Commitment>("non_shifted_accumulator_commitment");
24 auto shifted_accumulator_commitment =
25 transcript->template receive_from_prover<Commitment>("shifted_accumulator_commitment");
26 auto non_shifted_instance_commitment =
27 transcript->template receive_from_prover<Commitment>("non_shifted_instance_commitment");
28 auto shifted_instance_commitment =
29 transcript->template receive_from_prover<Commitment>("shifted_instance_commitment");
30 std::vector<FF> accumulator_challenges(Flavor::VIRTUAL_LOG_N);
31 std::vector<FF> instance_challenges(Flavor::VIRTUAL_LOG_N);
32 std::vector<FF> accumulator_evaluations(2);
33 std::vector<FF> instance_evaluations(2);
34 // Receive challenges and evaluations
35 for (size_t i = 0; i < Flavor::VIRTUAL_LOG_N; i++) {
36 accumulator_challenges[i] =
37 transcript->template receive_from_prover<FF>("accumulator_challenge_" + std::to_string(i));
38 instance_challenges[i] =
39 transcript->template receive_from_prover<FF>("instance_challenge_" + std::to_string(i));
40 }
41 for (size_t i = 0; i < 2; i++) {
42 accumulator_evaluations[i] =
43 transcript->template receive_from_prover<FF>("accumulator_evaluation_" + std::to_string(i));
44 instance_evaluations[i] =
45 transcript->template receive_from_prover<FF>("instance_evaluation_" + std::to_string(i));
46 }
47
48 auto accumulator_non_shifted_evaluation = accumulator_evaluations[0];
49 auto accumulator_shifted_evaluation = accumulator_evaluations[1];
50 auto instance_non_shifted_evaluation = instance_evaluations[0];
51 auto instance_shifted_evaluation = instance_evaluations[1];
52
53 const FF alpha = transcript->template get_challenge<FF>("Sumcheck:alpha");
54 std::vector<FF> gate_challenges(Flavor::VIRTUAL_LOG_N);
55 for (size_t idx = 0; idx < gate_challenges.size(); idx++) {
56 gate_challenges[idx] = FF(1);
57 }
58
59 std::vector<FF> padding_indicator(Flavor::VIRTUAL_LOG_N, FF{ 1 });
60
61 auto target_sum = (((instance_shifted_evaluation * alpha + instance_non_shifted_evaluation) * alpha +
62 accumulator_shifted_evaluation) *
63 alpha +
64 accumulator_non_shifted_evaluation);
65 Sumcheck sumcheck(transcript, alpha, Flavor::VIRTUAL_LOG_N, target_sum);
66 const auto sumcheck_result = sumcheck.verify(relation_parameters, gate_challenges, padding_indicator);
67
68 // Construct new claim
69 auto claim_batching_challenge = transcript->template get_challenge<FF>("claim_batching_challenge");
70 VerifierClaim verifier_claim;
71 verifier_claim.non_shifted_commitment =
72 non_shifted_accumulator_commitment + non_shifted_instance_commitment * claim_batching_challenge;
73 verifier_claim.shifted_commitment =
74 shifted_accumulator_commitment + shifted_instance_commitment * claim_batching_challenge;
75 verifier_claim.shifted_evaluation =
76 sumcheck_result.claimed_evaluations.w_shifted_accumulator +
77 sumcheck_result.claimed_evaluations.w_shifted_instance * claim_batching_challenge;
78 verifier_claim.non_shifted_evaluation =
79 sumcheck_result.claimed_evaluations.w_non_shifted_accumulator +
80 sumcheck_result.claimed_evaluations.w_non_shifted_instance * claim_batching_challenge;
81 verifier_claim.challenge = sumcheck_result.challenge;
82
83 // Verification
84 bool verified = true;
85 auto equality_verified = sumcheck_result.claimed_evaluations.w_evaluations_accumulator ==
86 VerifierEqPolynomial<FF>::eval(accumulator_challenges, sumcheck_result.challenge) &&
87 sumcheck_result.claimed_evaluations.w_evaluations_instance ==
88 VerifierEqPolynomial<FF>::eval(instance_challenges, sumcheck_result.challenge);
89
90 if constexpr (IsRecursiveFlavor<Flavor>) {
91 equality_verified.assert_equal(stdlib::bool_t(equality_verified.get_context(), true));
92 verified = sumcheck_result.verified && equality_verified.get_value();
93 } else {
94 verified = sumcheck_result.verified && equality_verified;
95 }
96
97 return { verified, verifier_claim };
98}
99
102
103} // namespace bb
static constexpr size_t VIRTUAL_LOG_N
MultilinearBatchingVerifier(const std::shared_ptr< Transcript > &transcript)
Implementation of the sumcheck Verifier for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:698
SumcheckOutput< Flavor > verify(const bb::RelationParameters< FF > &relation_parameters, std::vector< FF > &gate_challenges, const std::vector< FF > &padding_indicator_array)
Extract round univariate, check sum, generate challenge, compute next target sum.....
Definition sumcheck.hpp:771
Implements boolean logic in-circuit.
Definition bool.hpp:59
Entry point for Barretenberg command-line interface.
typename Flavor::FF FF
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
static FF eval(std::span< const FF > r_in, std::span< const FF > u)