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));
86 stdlib_proof.erase(stdlib_proof.begin());
89 throw_or_abort(
"AvmRecursiveVerifier::verify_proof: public inputs size mismatch");
96 info(
"AVM vk hash in recursive verifier: ",
vk_hash);
98 RelationParams relation_parameters;
102 for (
auto [comm, label] :
zip_view(commitments.get_wires(), commitments.get_wires_labels())) {
103 comm =
transcript->template receive_from_prover<Commitment>(label);
106 auto [beta, gamma] =
transcript->template get_challenges<FF>(
"beta",
"gamma");
107 relation_parameters.beta = beta;
108 relation_parameters.gamma = gamma;
111 for (
auto [label, commitment] :
zip_view(commitments.get_derived_labels(), commitments.get_derived())) {
112 commitment =
transcript->template receive_from_prover<Commitment>(label);
116 one.convert_constant_to_fixed_witness(&
builder);
118 std::vector<FF> padding_indicator_array(
key->log_fixed_circuit_size);
119 std::ranges::fill(padding_indicator_array, one);
122 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
124 SumcheckVerifier<Flavor> sumcheck(
transcript, alpha,
key->log_fixed_circuit_size);
126 std::vector<FF> gate_challenges =
127 transcript->template get_powers_of_challenge<FF>(
"Sumcheck:gate_challenge",
key->log_fixed_circuit_size);
131 SumcheckOutput<Flavor> output = sumcheck.verify(relation_parameters, gate_challenges, padding_indicator_array);
132 vinfo(
"verified sumcheck: ", (output.verified));
135 output.claimed_evaluations.public_inputs_cols_0_,
136 output.claimed_evaluations.public_inputs_cols_1_,
137 output.claimed_evaluations.public_inputs_cols_2_,
138 output.claimed_evaluations.public_inputs_cols_3_,
145 vinfo(
"public_input_evaluation failed, public inputs col ", i);
146 pi_validation.must_imply(public_input_evaluation == claimed_evaluations[i],
"public_input_evaluation failed");
150 ClaimBatcher claim_batcher{
151 .unshifted = ClaimBatch{ commitments.get_unshifted(), output.claimed_evaluations.get_unshifted() },
152 .shifted = ClaimBatch{ commitments.get_to_be_shifted(), output.claimed_evaluations.get_shifted() }
154 const BatchOpeningClaim<Curve> opening_claim = Shplemini::compute_batch_opening_claim(
155 padding_indicator_array, claim_batcher, output.challenge, Commitment::one(&
builder),
transcript);
157 auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim,
transcript);
158 return pairing_points;
#define AVM_NUM_PUBLIC_INPUT_COLUMNS
static std::shared_ptr< BackingMemory< Fr > > allocate(size_t size)
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.
constexpr 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_...
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)