29template <
typename Flavor,
class IO>
35 auto vk_ptr = verifier_instance->get_vk();
38 const size_t log_n = [&]() {
40 return static_cast<size_t>(Flavor::VIRTUAL_LOG_N);
41 }
else if constexpr (!IsRecursive) {
42 return static_cast<size_t>(vk_ptr->log_circuit_size);
50 std::vector<FF> padding_indicator_array(log_n,
FF{ 1 });
52 if constexpr (IsRecursive) {
54 padding_indicator_array =
55 stdlib::compute_padding_indicator_array<Curve, Flavor::VIRTUAL_LOG_N>(vk_ptr->log_circuit_size);
58 const size_t log_circuit_size =
static_cast<size_t>(vk_ptr->log_circuit_size);
59 for (
size_t idx = 0; idx < log_n; idx++) {
60 padding_indicator_array[idx] = (idx < log_circuit_size) ?
FF{ 1 } :
FF{ 0 };
71template <
typename Flavor,
class IO>
74 IO>::split_rollup_proof(
const Proof& combined_proof)
const
78 auto vk_ptr = verifier_instance->get_vk();
79 const size_t num_public_inputs = [&]() {
80 if constexpr (IsRecursive) {
81 return static_cast<size_t>(uint32_t(vk_ptr->num_public_inputs.get_value()));
83 return static_cast<size_t>(vk_ptr->num_public_inputs);
90 static_cast<std::ptrdiff_t>(HONK_PROOF_LENGTH + num_public_inputs);
93 Proof honk_proof(combined_proof.begin(), combined_proof.begin() + honk_proof_with_pub_inputs_length);
94 Proof ipa_proof(combined_proof.begin() + honk_proof_with_pub_inputs_length, combined_proof.end());
102template <
typename Flavor,
class IO>
107 ipa_transcript->load_proof(ipa_proof);
109 vinfo(
"UltraVerifier: IPA check: ", ipa_verified ?
"true" :
"false");
112 info(
"UltraVerifier: verification failed at IPA check");
123template <
typename Flavor,
class IO>
128 using PCS =
typename Flavor::PCS;
133 using ClaimBatch = ClaimBatcher::Batch;
135 transcript->load_proof(proof);
140 auto [log_n, padding_indicator_array] = process_padding();
141 verifier_instance->gate_challenges =
142 transcript->template get_dyadic_powers_of_challenge<FF>(
"Sumcheck:gate_challenge", log_n);
145 VerifierCommitments commitments{ verifier_instance->get_vk(), verifier_instance->witness_commitments };
148 commitments.gemini_masking_poly = verifier_instance->gemini_masking_commitment;
157 libra_commitments[0] = transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
161 verifier_instance->relation_parameters, verifier_instance->gate_challenges, padding_indicator_array);
164 libra_commitments[1] = transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
165 libra_commitments[2] = transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
168 ClaimBatcher claim_batcher{
169 .unshifted = ClaimBatch{ commitments.get_unshifted(), sumcheck_output.
claimed_evaluations.get_unshifted() },
170 .shifted = ClaimBatch{ commitments.get_to_be_shifted(), sumcheck_output.
claimed_evaluations.get_shifted() }
174 if constexpr (IsRecursive) {
175 return Commitment::one(
builder);
177 return Commitment::one();
181 auto shplemini_output = Shplemini::compute_batch_opening_claim(padding_indicator_array,
193 std::move(shplemini_output.batch_opening_claim), transcript, Flavor::FINAL_PCS_MSM_SIZE(log_n));
195 bool consistency_checked =
true;
197 consistency_checked = shplemini_output.consistency_checked;
198 vinfo(
"Ultra Verifier (with ZK): Libra evals consistency checked ", consistency_checked ?
"true" :
"false");
200 vinfo(
"Ultra Verifier sumcheck_verified: ", sumcheck_output.
verified ?
"true" :
"false");
213template <
typename Flavor,
class IO>
221 std::tie(honk_proof, ipa_proof) = split_rollup_proof(proof);
227 auto [pcs_pairing_points, reduction_succeeded] = reduce_to_pairing_check(honk_proof);
228 vinfo(
"UltraVerifier: reduced to pairing check: ", reduction_succeeded ?
"true" :
"false");
230 if constexpr (!IsRecursive) {
231 if (!reduction_succeeded) {
232 info(
"UltraVerifier: verification failed at reduction step");
239 inputs.reconstruct_from_public(verifier_instance->public_inputs);
243 pi_pairing_points.aggregate(pcs_pairing_points);
248 if constexpr (IsRecursive) {
250 output.points_accumulator =
std::move(pi_pairing_points);
252 output.ipa_proof = ipa_proof;
256 bool pairing_verified = pi_pairing_points.check();
257 vinfo(
"UltraVerifier: pairing check: ", pairing_verified ?
"true" :
"false");
259 if (!pairing_verified) {
260 info(
"UltraVerifier: verification failed at pairing check");
266 if (!verify_ipa(ipa_proof,
inputs.ipa_claim)) {
271 output.result =
true;
288#ifdef STARKNET_GARAGA_FLAVORS
static constexpr bool HasZK
typename Curve::ScalarField FF
VerifierCommitments_< Commitment, VerificationKey > VerifierCommitments
static constexpr bool USE_PADDING
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
IPA (inner product argument) commitment scheme class.
Verifier class for all the presumcheck rounds, which are shared between the folding verifier and ultr...
void verify()
Oink Verifier function that runs all the rounds of the verifier.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Implementation of the sumcheck Verifier for statements of the form for multilinear polynomials .
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...
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS(size_t virtual_log_n=VIRTUAL_LOG_N)
ReductionResult reduce_to_pairing_check(const Proof &proof)
Reduce ultra proof to verification claims (works for both native and recursive)
typename Transcript::Proof Proof
std::conditional_t< IsRecursive, stdlib::recursion::PairingPoints< Curve >, bb::PairingPoints< Curve > > PairingPoints
bool verify_ipa(const Proof &ipa_proof, const IPAClaim &ipa_claim)
Verify IPA proof for rollup circuits (native verifier only)
std::conditional_t< IsRecursive, stdlib::recursion::honk::UltraRecursiveVerifierOutput< Builder >, UltraVerifierOutput< Flavor > > Output
PaddingData process_padding() const
Compute log_n and padding indicator array based on flavor configuration.
typename Flavor::Curve Curve
typename Flavor::Commitment Commitment
Output verify_proof(const Proof &proof)
Perform ultra verification.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
Manages the data that is propagated on the public inputs of an application/function circuit.
The data that is propagated on the public inputs of the inner GoblinAvmRecursiveVerifier circuit.
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
The data that is propagated on the public inputs of a rollup circuit.
Entry point for Barretenberg command-line interface.
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_...
Logic to support batching opening claims for unshifted, shifted and interleaved polynomials in Shplem...
Contains the evaluations of multilinear polynomials at the challenge point . These are computed by S...
FF claimed_libra_evaluation
ClaimedEvaluations claimed_evaluations
std::vector< FF > challenge
Result of padding computation.
Result of reducing ultra proof to pairing points check. Contains pairing points and the aggrefate res...
PairingPoints pairing_points