52 using ClaimBatch = ClaimBatcher::Batch;
60 FF vk_hash =
key->hash();
62 vinfo(
"AVM vk hash in verifier: ", vk_hash);
66 vinfo(
"Public inputs size mismatch");
72 vinfo(
"Public input size mismatch");
84 comm =
transcript->template receive_from_prover<Commitment>(label);
88 relation_parameters.
beta = beta;
89 relation_parameters.
gamma = gamma;
93 commitment =
transcript->template receive_from_prover<Commitment>(label);
97 std::vector<FF> padding_indicator_array(
key->log_circuit_size, 1);
100 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
105 std::vector<FF> gate_challenges =
106 transcript->template get_dyadic_powers_of_challenge<FF>(
"Sumcheck:gate_challenge",
key->log_circuit_size);
112 vinfo(
"Sumcheck verification failed");
125 if (public_input_evaluation != claimed_evaluations[i]) {
126 vinfo(
"public_input_evaluation failed, public inputs col ", i);
139 std::vector<std::string> unshifted_batching_challenge_labels;
140 unshifted_batching_challenge_labels.reserve(unshifted_comms.size() - 1);
141 for (
size_t idx = 0; idx < unshifted_comms.size() - 1; idx++) {
142 unshifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(idx));
144 std::vector<std::string> shifted_batching_challenge_labels;
145 shifted_batching_challenge_labels.reserve(shifted_comms.size());
146 for (
size_t idx = 0; idx < shifted_comms.size(); idx++) {
147 shifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(unshifted_comms.size() - 1 + idx));
151 auto unshifted_challenges =
transcript->template get_challenges<FF>(unshifted_batching_challenge_labels);
152 auto shifted_challenges =
transcript->template get_challenges<FF>(shifted_batching_challenge_labels);
156 unshifted_comms[0] + batch_mul_native<Curve>(unshifted_comms.subspan(1), unshifted_challenges);
158 Commitment squashed_shifted = batch_mul_native<Curve>(shifted_comms, shifted_challenges);
162 unshifted_challenges.begin(), unshifted_challenges.end(), unshifted_evals.begin() + 1, unshifted_evals[0]);
164 FF squashed_shifted_eval =
165 std::inner_product(shifted_challenges.begin(), shifted_challenges.end(), shifted_evals.begin(),
FF(0));
168 ClaimBatcher squashed_claim_batcher{ .unshifted = ClaimBatch{ .commitments =
RefVector(squashed_unshifted),
169 .evaluations =
RefVector(squashed_unshifted_eval) },
170 .shifted = ClaimBatch{ .commitments =
RefVector(squashed_shifted),
171 .evaluations =
RefVector(squashed_shifted_eval) } };
172 auto opening_claim = Shplemini::compute_batch_opening_claim(
173 padding_indicator_array, squashed_claim_batcher, output.
challenge, Commitment::one(),
transcript);
175 const auto pairing_points = PCS::reduce_verify_batch_opening_claim(
std::move(opening_claim),
transcript);
177 const auto shplemini_verified = pcs_vkey.pairing_check(pairing_points[0], pairing_points[1]);
179 if (!shplemini_verified) {
180 vinfo(
"Shplemini verification failed");
Fr evaluate_mle(std::span< const Fr > evaluation_points, bool shift=false) const
evaluate multi-linear extension p(X_0,…,X_{n-1}) = \sum_i a_i*L_i(X_0,…,X_{n-1}) at u = (u_0,...
SumcheckOutput< Flavor > verify(const bb::RelationParameters< FF > &relation_parameters, const std::vector< FF > &gate_challenges, const std::vector< FF > &padding_indicator_array)
The Sumcheck verification method. First it extracts round univariate, checks sum (the sumcheck univar...