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: Planned, auditors: [], 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 <IsUltraOrMegaHonk Flavor>
17 const std::shared_ptr<HonkVK>& honk_vk,
18 const CommitmentKey& commitment_key)
19 : prover_instance(std::move(prover_instance))
20 , honk_vk(honk_vk)
21 , transcript(std::make_shared<Transcript>())
22 , commitment_key(commitment_key)
23{}
24
32template <IsUltraOrMegaHonk Flavor>
34 const std::shared_ptr<HonkVK>& honk_vk,
35 const std::shared_ptr<Transcript>& transcript)
36 : prover_instance(std::move(prover_instance))
37 , honk_vk(honk_vk)
38 , transcript(transcript)
39 , commitment_key(prover_instance->commitment_key)
40{}
41
49template <IsUltraOrMegaHonk Flavor>
51 const std::shared_ptr<HonkVK>& honk_vk,
52 const std::shared_ptr<Transcript>& transcript)
53 : prover_instance(std::make_shared<ProverInstance>(circuit))
54 , honk_vk(honk_vk)
55 , transcript(transcript)
56 , commitment_key(prover_instance->commitment_key)
57{}
58
59template <IsUltraOrMegaHonk Flavor>
60UltraProver_<Flavor>::UltraProver_(Builder&& circuit, const std::shared_ptr<HonkVK>& honk_vk)
61 : prover_instance(std::make_shared<ProverInstance>(circuit))
62 , honk_vk(honk_vk)
63 , transcript(std::make_shared<Transcript>())
64 , commitment_key(prover_instance->commitment_key)
65{}
66
82template <IsUltraOrMegaHonk Flavor> typename UltraProver_<Flavor>::Proof UltraProver_<Flavor>::export_proof()
83{
84 auto proof = transcript->export_proof();
85
86 // Append IPA proof if present
87 if (!prover_instance->ipa_proof.empty()) {
88 BB_ASSERT_EQ(prover_instance->ipa_proof.size(), static_cast<size_t>(IPA_PROOF_LENGTH));
89 proof.insert(proof.end(), prover_instance->ipa_proof.begin(), prover_instance->ipa_proof.end());
90 }
91
92 return proof;
93}
94
95template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::generate_gate_challenges()
96{
97 // Determine the number of rounds in the sumcheck based on whether or not padding is employed
98 const size_t virtual_log_n =
99 Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : static_cast<size_t>(prover_instance->log_dyadic_size());
100
101 prover_instance->gate_challenges =
102 transcript->template get_dyadic_powers_of_challenge<FF>("Sumcheck:gate_challenge", virtual_log_n);
103}
104
105template <IsUltraOrMegaHonk Flavor> typename UltraProver_<Flavor>::Proof UltraProver_<Flavor>::construct_proof()
106{
107 OinkProver<Flavor> oink_prover(prover_instance, honk_vk, transcript);
108 oink_prover.prove();
109 vinfo("created oink proof");
110
111 generate_gate_challenges();
112
113 // Run sumcheck
114 execute_sumcheck_iop();
115 vinfo("finished relation check rounds");
116 // Execute Shplemini PCS
117 execute_pcs();
118 vinfo("finished PCS rounds");
119
120 return export_proof();
121}
122
128template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::execute_sumcheck_iop()
129{
130 const size_t virtual_log_n = Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : prover_instance->log_dyadic_size();
131
132 using Sumcheck = SumcheckProver<Flavor>;
133 size_t polynomial_size = prover_instance->dyadic_size();
134 Sumcheck sumcheck(polynomial_size,
135 prover_instance->polynomials,
136 transcript,
137 prover_instance->alpha,
138 prover_instance->gate_challenges,
139 prover_instance->relation_parameters,
140 virtual_log_n);
141 {
142
143 BB_BENCH_NAME("sumcheck.prove");
144
145 if constexpr (Flavor::HasZK) {
146 const size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Curve::SUBGROUP_SIZE));
147 CommitmentKey commitment_key(1 << (log_subgroup_size + 1));
148 zk_sumcheck_data = ZKData(numeric::get_msb(polynomial_size), transcript, commitment_key);
149 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
150 } else {
151 sumcheck_output = sumcheck.prove();
152 }
153 }
154}
155
162template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::execute_pcs()
163{
165 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
166
167 auto& ck = prover_instance->commitment_key;
168 if (!ck.initialized()) {
169 ck = CommitmentKey(prover_instance->dyadic_size());
170 }
171
172 PolynomialBatcher polynomial_batcher(prover_instance->dyadic_size());
173 polynomial_batcher.set_unshifted(prover_instance->polynomials.get_unshifted());
174 polynomial_batcher.set_to_be_shifted_by_one(prover_instance->polynomials.get_to_be_shifted());
175
176 OpeningClaim prover_opening_claim;
177 if constexpr (!Flavor::HasZK) {
178 prover_opening_claim = ShpleminiProver_<Curve>::prove(
179 prover_instance->dyadic_size(), polynomial_batcher, sumcheck_output.challenge, ck, transcript);
180 } else {
181
182 SmallSubgroupIPA small_subgroup_ipa_prover(
183 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
184 small_subgroup_ipa_prover.prove();
185
186 prover_opening_claim = ShpleminiProver_<Curve>::prove(prover_instance->dyadic_size(),
187 polynomial_batcher,
188 sumcheck_output.challenge,
189 ck,
190 transcript,
191 small_subgroup_ipa_prover.get_witness_polynomials());
192 }
193 vinfo("executed multivariate-to-univariate reduction");
194 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
195 vinfo("computed opening proof");
196}
197
198template class UltraProver_<UltraFlavor>;
199template class UltraProver_<UltraZKFlavor>;
201#ifdef STARKNET_GARAGA_FLAVORS
204#endif
206template class UltraProver_<MegaFlavor>;
207template class UltraProver_<MegaZKFlavor>;
208template class UltraProver_<MegaAvmFlavor>;
209
210} // 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:126
Class for all the oink rounds, which are shared between the folding prover and ultra prover.
void prove()
Oink Prover function that runs all the rounds of the verifier.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:55
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
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:289
BB_PROFILE void generate_gate_challenges()
BB_PROFILE void execute_pcs()
Produce a univariate opening claim for the sumcheck multivariate evalutions and a batched univariate ...
typename Transcript::Proof Proof
BB_PROFILE void execute_sumcheck_iop()
Run Sumcheck to establish that ∑_i pow(\vec{β*})f_i(ω) = 0. This results in u = (u_1,...
typename Flavor::CommitmentKey CommitmentKey
typename Flavor::Transcript Transcript
UltraProver_(const std::shared_ptr< ProverInstance > &, const std::shared_ptr< HonkVK > &, const CommitmentKey &)
typename Flavor::CircuitBuilder Builder
Proof export_proof()
Export the complete proof, including IPA proof for rollup circuits.
static constexpr size_t SUBGROUP_SIZE
Definition grumpkin.hpp:74
#define vinfo(...)
Definition log.hpp:94
constexpr T get_msb(const T in)
Definition get_msb.hpp:47
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.