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
67template <IsUltraOrMegaHonk Flavor> typename UltraProver_<Flavor>::Proof UltraProver_<Flavor>::export_proof()
68{
69 auto proof = transcript->export_proof();
70
71 // Add the IPA proof
72 if constexpr (HasIPAAccumulator<Flavor>) {
73 // The extra calculation is for the IPA proof length.
74 BB_ASSERT_EQ(prover_instance->ipa_proof.size(), static_cast<size_t>(IPA_PROOF_LENGTH));
75 proof.insert(proof.end(), prover_instance->ipa_proof.begin(), prover_instance->ipa_proof.end());
76 }
77
78 return proof;
79}
80
81template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::generate_gate_challenges()
82{
83 // Determine the number of rounds in the sumcheck based on whether or not padding is employed
84 const size_t virtual_log_n =
85 Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : static_cast<size_t>(prover_instance->log_dyadic_size());
86
87 prover_instance->gate_challenges =
88 transcript->template get_dyadic_powers_of_challenge<FF>("Sumcheck:gate_challenge", virtual_log_n);
89}
90
91template <IsUltraOrMegaHonk Flavor> typename UltraProver_<Flavor>::Proof UltraProver_<Flavor>::construct_proof()
92{
93 OinkProver<Flavor> oink_prover(prover_instance, honk_vk, transcript);
94 oink_prover.prove();
95 vinfo("created oink proof");
96
97 generate_gate_challenges();
98
99 // Run sumcheck
100 execute_sumcheck_iop();
101 vinfo("finished relation check rounds");
102 // Execute Shplemini PCS
103 execute_pcs();
104 vinfo("finished PCS rounds");
105
106 return export_proof();
107}
108
114template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::execute_sumcheck_iop()
115{
116 const size_t virtual_log_n = Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : prover_instance->log_dyadic_size();
117
118 using Sumcheck = SumcheckProver<Flavor>;
119 size_t polynomial_size = prover_instance->dyadic_size();
120 Sumcheck sumcheck(polynomial_size,
121 prover_instance->polynomials,
122 transcript,
123 prover_instance->alpha,
124 prover_instance->gate_challenges,
125 prover_instance->relation_parameters,
126 virtual_log_n);
127 {
128
129 BB_BENCH_NAME("sumcheck.prove");
130
131 if constexpr (Flavor::HasZK) {
132 const size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Curve::SUBGROUP_SIZE));
133 CommitmentKey commitment_key(1 << (log_subgroup_size + 1));
134 zk_sumcheck_data = ZKData(numeric::get_msb(polynomial_size), transcript, commitment_key);
135 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
136 } else {
137 sumcheck_output = sumcheck.prove();
138 }
139 }
140}
141
148template <IsUltraOrMegaHonk Flavor> void UltraProver_<Flavor>::execute_pcs()
149{
151 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
152
153 auto& ck = prover_instance->commitment_key;
154 if (!ck.initialized()) {
155 ck = CommitmentKey(prover_instance->dyadic_size());
156 }
157
158 PolynomialBatcher polynomial_batcher(prover_instance->dyadic_size());
159 polynomial_batcher.set_unshifted(prover_instance->polynomials.get_unshifted());
160 polynomial_batcher.set_to_be_shifted_by_one(prover_instance->polynomials.get_to_be_shifted());
161
162 OpeningClaim prover_opening_claim;
163 if constexpr (!Flavor::HasZK) {
164 prover_opening_claim = ShpleminiProver_<Curve>::prove(
165 prover_instance->dyadic_size(), polynomial_batcher, sumcheck_output.challenge, ck, transcript);
166 } else {
167
168 SmallSubgroupIPA small_subgroup_ipa_prover(
169 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
170 small_subgroup_ipa_prover.prove();
171
172 prover_opening_claim = ShpleminiProver_<Curve>::prove(prover_instance->dyadic_size(),
173 polynomial_batcher,
174 sumcheck_output.challenge,
175 ck,
176 transcript,
177 small_subgroup_ipa_prover.get_witness_polynomials());
178 }
179 vinfo("executed multivariate-to-univariate reduction");
180 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
181 vinfo("computed opening proof");
182}
183
184template class UltraProver_<UltraFlavor>;
185template class UltraProver_<UltraZKFlavor>;
187#ifdef STARKNET_GARAGA_FLAVORS
190#endif
193template class UltraProver_<MegaFlavor>;
194template class UltraProver_<MegaZKFlavor>;
195template class UltraProver_<MegaAvmFlavor>;
196
197} // namespace bb
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:93
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:219
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:53
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:34
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
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.