52 using ClaimBatch = ClaimBatcher::Batch;
59 FF vk_hash =
key->hash();
60 transcript->add_to_hash_buffer(
"avm_vk_hash", vk_hash);
61 vinfo(
"AVM vk hash in verifier: ", vk_hash);
65 vinfo(
"Public inputs size mismatch");
71 vinfo(
"Public input size mismatch");
74 for (
size_t j = 0; j < public_inputs[i].size(); j++) {
82 comm =
transcript->template receive_from_prover<Commitment>(label);
86 relation_parameters.
beta = beta;
87 relation_parameters.
gamma = gamma;
91 commitment =
transcript->template receive_from_prover<Commitment>(label);
95 std::vector<FF> padding_indicator_array(
key->log_circuit_size, 1);
98 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
103 std::vector<FF> gate_challenges =
104 transcript->template get_dyadic_powers_of_challenge<FF>(
"Sumcheck:gate_challenge",
key->log_circuit_size);
110 vinfo(
"Sumcheck verification failed");
123 if (public_input_evaluation != claimed_evaluations[i]) {
124 vinfo(
"public_input_evaluation failed, public inputs col ", i);
137 std::vector<std::string> unshifted_batching_challenge_labels;
138 unshifted_batching_challenge_labels.reserve(unshifted_comms.size() - 1);
139 for (
size_t idx = 0; idx < unshifted_comms.size() - 1; idx++) {
140 unshifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(idx));
142 std::vector<std::string> shifted_batching_challenge_labels;
143 shifted_batching_challenge_labels.reserve(shifted_comms.size());
144 for (
size_t idx = 0; idx < shifted_comms.size(); idx++) {
145 shifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(unshifted_comms.size() - 1 + idx));
149 auto unshifted_challenges =
transcript->template get_challenges<FF>(unshifted_batching_challenge_labels);
150 auto shifted_challenges =
transcript->template get_challenges<FF>(shifted_batching_challenge_labels);
154 unshifted_comms[0] + batch_mul_native<Curve>(unshifted_comms.subspan(1), unshifted_challenges);
156 Commitment squashed_shifted = batch_mul_native<Curve>(shifted_comms, shifted_challenges);
160 unshifted_challenges.begin(), unshifted_challenges.end(), unshifted_evals.begin() + 1, unshifted_evals[0]);
162 FF squashed_shifted_eval =
163 std::inner_product(shifted_challenges.begin(), shifted_challenges.end(), shifted_evals.begin(),
FF(0));
166 ClaimBatcher squashed_claim_batcher{ .unshifted = ClaimBatch{ .commitments =
RefVector(squashed_unshifted),
167 .evaluations =
RefVector(squashed_unshifted_eval) },
168 .shifted = ClaimBatch{ .commitments =
RefVector(squashed_shifted),
169 .evaluations =
RefVector(squashed_shifted_eval) } };
171 Shplemini::compute_batch_opening_claim(
172 padding_indicator_array, squashed_claim_batcher, output.
challenge, Commitment::one(),
transcript)
173 .batch_opening_claim;
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...