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 size_t key_size = prover_instance->dyadic_size();
64 if constexpr (Flavor::HasZK) {
65 constexpr size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Curve::SUBGROUP_SIZE));
66 key_size = std::max(key_size, size_t{ 1 } << (log_subgroup_size + 1));
67 }
68 commitment_key = CommitmentKey(key_size);
69
70 OinkProver<Flavor> oink_prover(prover_instance, honk_vk, transcript);
71 oink_prover.prove();
72 vinfo("created oink proof");
73
74 generate_gate_challenges();
75
76 // Run sumcheck
77 execute_sumcheck_iop();
78 vinfo("finished relation check rounds");
79 // Execute Shplemini PCS
80 execute_pcs();
81 vinfo("finished PCS rounds");
82
83 return export_proof();
84}
85
90template <typename Flavor> void UltraProver_<Flavor>::execute_sumcheck_iop()
91{
92 BB_BENCH_NAME("sumcheck.prove");
93
94 using Sumcheck = SumcheckProver<Flavor>;
95 size_t polynomial_size = prover_instance->dyadic_size();
96 Sumcheck sumcheck(polynomial_size,
97 prover_instance->polynomials,
98 transcript,
99 prover_instance->alpha,
100 prover_instance->gate_challenges,
101 prover_instance->relation_parameters,
102 virtual_log_n);
103
104 if constexpr (Flavor::HasZK) {
105 zk_sumcheck_data = ZKData(numeric::get_msb(polynomial_size), transcript, commitment_key);
106 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
107 } else {
108 sumcheck_output = sumcheck.prove();
109 }
110}
111
116template <typename Flavor> void UltraProver_<Flavor>::execute_pcs()
117{
119 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
120
121 auto& ck = commitment_key;
122
123 PolynomialBatcher polynomial_batcher(prover_instance->dyadic_size());
124 polynomial_batcher.set_unshifted(prover_instance->polynomials.get_unshifted());
125 polynomial_batcher.set_to_be_shifted_by_one(prover_instance->polynomials.get_to_be_shifted());
126
127 OpeningClaim prover_opening_claim;
128 if constexpr (!Flavor::HasZK) {
129 prover_opening_claim = ShpleminiProver_<Curve>::prove(
130 prover_instance->dyadic_size(), polynomial_batcher, sumcheck_output.challenge, ck, transcript);
131 } else {
132
133 SmallSubgroupIPA small_subgroup_ipa_prover(
134 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
135 small_subgroup_ipa_prover.prove();
136
137 prover_opening_claim = ShpleminiProver_<Curve>::prove(prover_instance->dyadic_size(),
138 polynomial_batcher,
139 sumcheck_output.challenge,
140 ck,
141 transcript,
142 small_subgroup_ipa_prover.get_witness_polynomials());
143 }
144 vinfo("executed multivariate-to-univariate reduction");
145 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
146 vinfo("computed opening proof");
147}
148
149template class UltraProver_<UltraFlavor>;
150template class UltraProver_<UltraZKFlavor>;
152#ifdef STARKNET_GARAGA_FLAVORS
155#endif
157template class UltraProver_<MegaFlavor>;
158template class UltraProver_<MegaZKFlavor>;
159template class UltraProver_<MegaAvmFlavor>;
160
161} // 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()
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:74
#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.