34 const std::vector<FF>& challenges)
38 .end_ = points.size(),
44 static_cast<void*
>(coefficients.data()),
static_cast<const void*
>(points.data()),
sizeof(
FF) * points.size());
46 return generic_evaluate_mle<FF>(challenges, coefficients);
50 const HonkProof& proof,
const std::vector<std::vector<fr>>& public_inputs_vec_nt)
55 public_inputs_ct.reserve(public_inputs_vec_nt.size());
57 for (
const auto& vec : public_inputs_vec_nt) {
58 std::vector<FF> vec_ct;
59 vec_ct.reserve(vec.size());
60 for (
const auto& el : vec) {
63 public_inputs_ct.push_back(vec_ct);
72 const stdlib::Proof<Builder>& stdlib_proof_with_pi_flag,
const std::vector<std::vector<FF>>& public_inputs)
80 using ClaimBatch = ClaimBatcher::Batch;
84 StdlibProof stdlib_proof = stdlib_proof_with_pi_flag;
85 bool_t<Builder> pi_validation = !bool_t<Builder>(stdlib_proof.at(0));
89 pi_validation.unset_free_witness_tag();
90 stdlib_proof.erase(stdlib_proof.begin());
93 throw_or_abort(
"AvmRecursiveVerifier::verify_proof: public inputs size mismatch");
95 for (
const auto& public_input : public_inputs) {
97 throw_or_abort(
"AvmRecursiveVerifier::verify_proof: public input size mismatch");
107 for (
auto& comm :
key->get_all()) {
108 comm.unset_free_witness_tag();
111 info(
"AVM vk hash in recursive verifier: ",
vk_hash);
113 RelationParams relation_parameters;
126 for (
size_t j = 0; j < public_inputs[i].size(); j++) {
130 public_inputs[i][j].unset_free_witness_tag();
134 for (
auto [comm, label] :
zip_view(commitments.get_wires(), commitments.get_wires_labels())) {
135 comm =
transcript->template receive_from_prover<Commitment>(label);
138 auto [beta, gamma] =
transcript->template get_challenges<FF>(
"beta",
"gamma");
139 relation_parameters.beta = beta;
140 relation_parameters.gamma = gamma;
143 for (
auto [label, commitment] :
zip_view(commitments.get_derived_labels(), commitments.get_derived())) {
144 commitment =
transcript->template receive_from_prover<Commitment>(label);
148 one.convert_constant_to_fixed_witness(&
builder);
150 std::vector<FF> padding_indicator_array(
key->log_fixed_circuit_size);
151 std::ranges::fill(padding_indicator_array, one);
154 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
156 SumcheckVerifier<Flavor> sumcheck(
transcript, alpha,
key->log_fixed_circuit_size);
158 std::vector<FF> gate_challenges =
159 transcript->template get_powers_of_challenge<FF>(
"Sumcheck:gate_challenge",
key->log_fixed_circuit_size);
163 SumcheckOutput<Flavor> output = sumcheck.verify(relation_parameters, gate_challenges, padding_indicator_array);
164 vinfo(
"verified sumcheck: ", (output.verified));
168 output.claimed_evaluations.get(C::public_inputs_cols_0_),
169 output.claimed_evaluations.get(C::public_inputs_cols_1_),
170 output.claimed_evaluations.get(C::public_inputs_cols_2_),
171 output.claimed_evaluations.get(C::public_inputs_cols_3_),
178 pi_validation.must_imply(public_input_evaluation == claimed_evaluations[i],
179 format(
"public_input_evaluation failed at column ", i));
183 ClaimBatcher claim_batcher{
189 const BatchOpeningClaim<Curve> opening_claim = Shplemini::compute_batch_opening_claim(
190 padding_indicator_array, claim_batcher, output.challenge, Commitment::one(&
builder),
transcript);
192 auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim,
transcript);
195 info(
"AVM Recursive verifier builder failed with error: ",
builder.err());
198 return pairing_points;
#define AVM_NUM_PUBLIC_INPUT_COLUMNS
#define AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH
static RefVector from_span(const std::span< T > &span)
An efficient verifier for the evaluation proofs of multilinear polynomials and their shifts.
NativeFlavor::VerifierCommitments_< Commitment, VerificationKey > VerifierCommitments
AvmRecursiveFlavorSettings::Curve Curve
AvmRecursiveFlavorSettings::PCS PCS
std::shared_ptr< Transcript > transcript
typename Flavor::VerifierCommitments VerifierCommitments
stdlib::Proof< Builder > StdlibProof
std::shared_ptr< VerificationKey > key
FF evaluate_public_input_column(const std::vector< FF > &points, const std::vector< FF > &challenges)
PairingPoints verify_proof(const HonkProof &proof, const std::vector< std::vector< fr > > &public_inputs_vec_nt)
typename Flavor::CircuitBuilder Builder
AvmRecursiveVerifier(Builder &builder, const std::shared_ptr< VerificationKey > &vkey)
A simple wrapper around a vector of stdlib field elements representing a proof.
Implements boolean logic in-circuit.
std::string format(Args... args)
constexpr std::size_t MAX_AVM_TRACE_SIZE
std::vector< fr > HonkProof
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
For a small integer N = virtual_log_n and a given witness x = log_n, compute in-circuit an indicator_...
static BackingMemory allocate(size_t size)
A shared pointer array template that represents a virtual array filled with zeros up to virtual_size_...
size_t start_
The starting index of the memory-backed range.
Logic to support batching opening claims for unshifted and shifted polynomials in Shplemini.
Container for parameters used by the grand product (permutation, lookup) Honk relations.
void throw_or_abort(std::string const &err)