Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
decider_prover.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#include "decider_prover.hpp"
11
12namespace bb {
13
22template <IsUltraOrMegaHonk Flavor>
23DeciderProver_<Flavor>::DeciderProver_(const std::shared_ptr<DeciderPK>& proving_key,
24 const std::shared_ptr<Transcript>& transcript)
25 : proving_key(std::move(proving_key))
26 , transcript(transcript)
27{}
28
34template <IsUltraOrMegaHonk Flavor> void DeciderProver_<Flavor>::execute_relation_check_rounds()
35{
36 const size_t virtual_log_n = Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : proving_key->log_dyadic_size();
37
38 using Sumcheck = SumcheckProver<Flavor>;
39 size_t polynomial_size = proving_key->dyadic_size();
40 Sumcheck sumcheck(polynomial_size,
41 proving_key->polynomials,
42 transcript,
43 proving_key->alphas,
44 proving_key->gate_challenges,
45 proving_key->relation_parameters,
46 virtual_log_n);
47 {
48
49 PROFILE_THIS_NAME("sumcheck.prove");
50
51 if constexpr (Flavor::HasZK) {
52 const size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Curve::SUBGROUP_SIZE));
53 CommitmentKey commitment_key(1 << (log_subgroup_size + 1));
54 zk_sumcheck_data = ZKData(numeric::get_msb(polynomial_size), transcript, commitment_key);
55 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
56 } else {
57 sumcheck_output = sumcheck.prove();
58 }
59 }
60}
61
68template <IsUltraOrMegaHonk Flavor> void DeciderProver_<Flavor>::execute_pcs_rounds()
69{
71 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
72
73 auto& ck = proving_key->commitment_key;
74 if (!ck.initialized()) {
75 ck = CommitmentKey(proving_key->dyadic_size());
76 }
77
78 PolynomialBatcher polynomial_batcher(proving_key->dyadic_size());
79 polynomial_batcher.set_unshifted(proving_key->polynomials.get_unshifted());
80 polynomial_batcher.set_to_be_shifted_by_one(proving_key->polynomials.get_to_be_shifted());
81
82 OpeningClaim prover_opening_claim;
83 if constexpr (!Flavor::HasZK) {
84 prover_opening_claim = ShpleminiProver_<Curve>::prove(
85 proving_key->dyadic_size(), polynomial_batcher, sumcheck_output.challenge, ck, transcript);
86 } else {
87
88 SmallSubgroupIPA small_subgroup_ipa_prover(
89 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
90 small_subgroup_ipa_prover.prove();
91
92 prover_opening_claim = ShpleminiProver_<Curve>::prove(proving_key->dyadic_size(),
93 polynomial_batcher,
94 sumcheck_output.challenge,
95 ck,
96 transcript,
97 small_subgroup_ipa_prover.get_witness_polynomials());
98 }
99 vinfo("executed multivariate-to-univariate reduction");
100 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
101 vinfo("computed opening proof");
102}
103
105{
106 return transcript->export_proof();
107}
108
109template <IsUltraOrMegaHonk Flavor> void DeciderProver_<Flavor>::construct_proof()
110{
111 PROFILE_THIS_NAME("Decider::construct_proof");
112
113 // Run sumcheck subprotocol.
114 execute_relation_check_rounds();
115
116 // Fiat-Shamir: rho, y, x, z
117 // Execute Shplemini PCS
118 execute_pcs_rounds();
119 vinfo("finished decider proving.");
120}
121
122template class DeciderProver_<UltraFlavor>;
123template class DeciderProver_<UltraZKFlavor>;
126#ifdef STARKNET_GARAGA_FLAVORS
129#endif
131template class DeciderProver_<MegaFlavor>;
132template class DeciderProver_<MegaZKFlavor>;
133
134} // namespace bb
typename Flavor::Transcript::Proof Proof
DeciderProver_(const std::shared_ptr< DeciderPK > &, const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
typename Flavor::CommitmentKey CommitmentKey
BB_PROFILE void execute_pcs_rounds()
Produce a univariate opening claim for the sumcheck multivariate evalutions and a batched univariate ...
BB_PROFILE void execute_relation_check_rounds()
Run Sumcheck to establish that ∑_i pow(\vec{β*})f_i(ω) = e*. This results in u = (u_1,...
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
Definition gemini.hpp:123
static constexpr bool HasZK
static constexpr size_t VIRTUAL_LOG_N
static constexpr bool USE_PADDING
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:53
Polynomial p and an opening pair (r,v) such that p(r) = v.
Definition claim.hpp:34
static OpeningClaim prove(const FF 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:35
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:123
static constexpr size_t SUBGROUP_SIZE
Definition grumpkin.hpp:67
void vinfo(Args... args)
Definition log.hpp:76
constexpr T get_msb(const T in)
Definition get_msb.hpp:47
Entry point for Barretenberg command-line interface.
CommitmentKey< Curve > ck
STL namespace.
#define PROFILE_THIS_NAME(name)
Definition op_count.hpp:16
This structure is created to contain various polynomials and constants required by ZK Sumcheck.