60 using ClaimBatch = ClaimBatcher::Batch;
65 if (proof.size() !=
static_cast<size_t>(AVM_V2_PROOF_LENGTH_IN_FIELDS)) {
66 vinfo(
"Proof length mismatch: got ",
69 static_cast<size_t>(AVM_V2_PROOF_LENGTH_IN_FIELDS));
78 FF vk_hash =
key->get_hash();
79 transcript->add_to_hash_buffer(
"avm_vk_hash", vk_hash);
80 vinfo(
"AVM vk hash in verifier: ", vk_hash);
85 if (public_inputs.size() != AVM_NUM_PUBLIC_INPUT_COLUMNS) {
86 vinfo(
"Public inputs size mismatch");
92 for (
size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; i++) {
95 vinfo(
"Public input size mismatch");
98 for (
size_t j = 0; j < public_inputs[i].size(); j++) {
100 public_inputs[i][j]);
107 VerifierCommitments commitments{
key };
108 for (
auto [comm,
label] :
zip_view(commitments.get_wires(), commitments.get_wires_labels())) {
116 relation_parameters.
beta = beta;
117 relation_parameters.
gamma = gamma;
120 for (
auto [commitment,
label] :
zip_view(commitments.get_derived(), commitments.get_derived_labels())) {
121 commitment =
transcript->template receive_from_prover<Commitment>(
label);
127 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
132 std::vector<FF> gate_challenges =
138 vinfo(
"Sumcheck verification failed");
152 const auto& [public_input_column, claimed_evaluation] :
zip_view(public_inputs, claimed_evaluations)) {
154 if (public_input_evaluation != claimed_evaluation) {
155 vinfo(
"public_input_evaluation failed, public inputs col ", idx);
170 Challenges challenges;
171 auto unshifted_challenges_vec =
transcript->template get_short_challenges<FF>(challenges.get_unshifted_labels());
172 std::ranges::move(unshifted_challenges_vec, challenges.get_unshifted().begin());
173 auto unshifted_challenges = challenges.get_unshifted();
174 auto shifted_challenges = challenges.get_to_be_shifted();
177 Commitment batched_shifted = Commitment::batch_mul(shifted_comms, shifted_challenges);
188 FF batched_unshifted_eval =
189 std::inner_product(unshifted_challenges.begin(), unshifted_challenges.end(), unshifted_evals.begin(),
FF(0));
191 FF batched_shifted_eval =
192 std::inner_product(shifted_challenges.begin(), shifted_challenges.end(), shifted_evals.begin(),
FF(0));
195 ClaimBatcher batched_claim_batcher{ .unshifted = ClaimBatch{ .commitments =
RefVector(batched_unshifted),
196 .evaluations =
RefVector(batched_unshifted_eval) },
197 .shifted = ClaimBatch{ .commitments =
RefVector(batched_shifted),
198 .evaluations =
RefVector(batched_shifted_eval) } };
200 Shplemini::compute_batch_opening_claim(batched_claim_batcher, output.
challenge, Commitment::one(),
transcript)
201 .batch_opening_claim;
203 const auto pairing_points = PCS::reduce_verify_batch_opening_claim(
std::move(opening_claim),
transcript);
204 const auto shplemini_verified = pairing_points.check();
206 if (!shplemini_verified) {
207 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,...