Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_prover.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#include "ultra_prover.hpp"
13namespace bb {
14
15template <typename Flavor>
17 const std::shared_ptr<HonkVK>& honk_vk,
18 const std::shared_ptr<Transcript>& transcript)
19 : prover_instance(std::move(prover_instance))
20 , transcript(transcript)
21 , honk_vk(honk_vk)
22{}
23
40{
41 auto proof = transcript->export_proof();
42
43 // Append IPA proof if present
44 if (!prover_instance->ipa_proof.empty()) {
45 BB_ASSERT_EQ(prover_instance->ipa_proof.size(), static_cast<size_t>(IPA_PROOF_LENGTH));
46 proof.insert(proof.end(), prover_instance->ipa_proof.begin(), prover_instance->ipa_proof.end());
47 }
48
49 return proof;
50}
51
52template <typename Flavor> void UltraProver_<Flavor>::generate_gate_challenges()
53{
54 virtual_log_n =
55 Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : static_cast<size_t>(prover_instance->log_dyadic_size());
56
57 prover_instance->gate_challenges =
58 transcript->template get_dyadic_powers_of_challenge<FF>("Sumcheck:gate_challenge", virtual_log_n);
59}
60
62{
63 // The CRS only needs to accommodate the actual data extent (max_end_index) rather than the
64 // full dyadic_size. All committed polynomials fit within this bound: witness/selector polys
65 // have backing ≤ max_end_index, Gemini fold polys have size ≤ dyadic_size/2 < max_end_index,
66 // Shplonk quotient Q is sized at max(claim sizes), and KZG opening proof is sized at Q.size().
67 // For ZK, the gemini_masking_poly (at dyadic_size) is already reflected in max_end_index.
68 size_t key_size = prover_instance->polynomials.max_end_index();
69 if constexpr (Flavor::HasZK) {
70 // SmallSubgroupIPA commits fixed-size polynomials (up to SUBGROUP_SIZE + 3). Ensure the
71 // CRS is large enough for tiny test circuits where max_end_index may be smaller.
72 constexpr size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Curve::SUBGROUP_SIZE));
73 key_size = std::max(key_size, size_t{ 1 } << (log_subgroup_size + 1));
74 }
75 commitment_key = CommitmentKey(key_size);
76
77 OinkProver<Flavor> oink_prover(prover_instance, honk_vk, transcript);
78 oink_prover.prove();
79 vinfo("created oink proof");
80
81 generate_gate_challenges();
82
83 // Run sumcheck
84 execute_sumcheck_iop();
85 vinfo("finished relation check rounds");
86 // Execute Shplemini PCS
87 execute_pcs();
88 vinfo("finished PCS rounds");
89
90 return export_proof();
91}
92
97template <typename Flavor> void UltraProver_<Flavor>::execute_sumcheck_iop()
98{
99 BB_BENCH_NAME("sumcheck.prove");
100
101 using Sumcheck = SumcheckProver<Flavor>;
102 size_t polynomial_size = prover_instance->dyadic_size();
103 Sumcheck sumcheck(polynomial_size,
104 prover_instance->polynomials,
105 transcript,
106 prover_instance->alpha,
107 prover_instance->gate_challenges,
108 prover_instance->relation_parameters,
109 virtual_log_n);
110
111 if constexpr (Flavor::HasZK) {
112 zk_sumcheck_data = ZKData(numeric::get_msb(polynomial_size), transcript, commitment_key);
113 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
114 } else {
115 sumcheck_output = sumcheck.prove();
116 }
117}
118
123template <typename Flavor> void UltraProver_<Flavor>::execute_pcs()
124{
126 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
127
128 auto& ck = commitment_key;
129
130 PolynomialBatcher polynomial_batcher(prover_instance->dyadic_size(), prover_instance->polynomials.max_end_index());
131 polynomial_batcher.set_unshifted(prover_instance->polynomials.get_unshifted());
132 polynomial_batcher.set_to_be_shifted_by_one(prover_instance->polynomials.get_to_be_shifted());
133
134 OpeningClaim prover_opening_claim;
135 if constexpr (!Flavor::HasZK) {
136 prover_opening_claim = ShpleminiProver_<Curve>::prove(
137 prover_instance->dyadic_size(), polynomial_batcher, sumcheck_output.challenge, ck, transcript);
138 } else {
139
140 SmallSubgroupIPA small_subgroup_ipa_prover(
141 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
142 small_subgroup_ipa_prover.prove();
143
144 prover_opening_claim = ShpleminiProver_<Curve>::prove(prover_instance->dyadic_size(),
145 polynomial_batcher,
146 sumcheck_output.challenge,
147 ck,
148 transcript,
149 small_subgroup_ipa_prover.get_witness_polynomials());
150 }
151 vinfo("executed multivariate-to-univariate reduction");
152 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
153 vinfo("computed opening proof");
154}
155
156template class UltraProver_<UltraFlavor>;
157template class UltraProver_<UltraZKFlavor>;
159#ifdef STARKNET_GARAGA_FLAVORS
162#endif
164template class UltraProver_<MegaFlavor>;
165template class UltraProver_<MegaZKFlavor>;
166template class UltraProver_<MegaAvmFlavor>;
167
168} // namespace bb
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:83
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:225
static constexpr bool HasZK
static constexpr bool USE_PADDING
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
Definition gemini.hpp:125
Executes the "Oink" phase of the Honk proving protocol: the initial rounds that commit to witness dat...
void prove(bool emit_alpha=true)
Commit to witnesses, compute relation parameters, and prepare for Sumcheck.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:55
Polynomial p and an opening pair (r,v) such that p(r) = v.
Definition claim.hpp:36
static OpeningClaim prove(size_t circuit_size, PolynomialBatcher &polynomial_batcher, std::span< FF > multilinear_challenge, const CommitmentKey< Curve > &commitment_key, const std::shared_ptr< Transcript > &transcript, const std::array< Polynomial, NUM_SMALL_IPA_EVALUATIONS > &libra_polynomials={}, const std::vector< Polynomial > &sumcheck_round_univariates={}, const std::vector< std::array< FF, 3 > > &sumcheck_round_evaluations={})
Definition shplemini.hpp:36
A Curve-agnostic ZK protocol to prove inner products of small vectors.
std::array< bb::Polynomial< FF >, NUM_SMALL_IPA_EVALUATIONS > get_witness_polynomials() const
void prove()
Compute the derived witnesses and and commit to them.
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:298
UltraProver_(std::shared_ptr< ProverInstance >, const std::shared_ptr< HonkVK > &, const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
BB_PROFILE void generate_gate_challenges()
BB_PROFILE void execute_pcs()
Reduce the sumcheck multivariate evaluations to a single univariate opening claim via Shplemini,...
typename Transcript::Proof Proof
BB_PROFILE void execute_sumcheck_iop()
Run Sumcheck to establish that ∑_i pow(\vec{β*})f_i(ω) = 0, producing sumcheck round challenges u = (...
typename Flavor::CommitmentKey CommitmentKey
Proof export_proof()
Export the complete proof, including IPA proof for rollup circuits.
static constexpr size_t SUBGROUP_SIZE
Definition grumpkin.hpp:73
#define vinfo(...)
Definition log.hpp:94
constexpr T get_msb(const T in)
Definition get_msb.hpp:49
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
CommitmentKey< Curve > ck
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
This structure is created to contain various polynomials and constants required by ZK Sumcheck.