Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
translator_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
22
23namespace bb {
24
26 const std::shared_ptr<Transcript>& transcript)
27 : transcript(transcript)
28 , key(key)
29{
30 BB_BENCH();
31 key->proving_key->commitment_key = CommitmentKey(key->proving_key->circuit_size);
32}
33
39{
40 // Fiat-Shamir the vk hash
42 typename Flavor::FF vk_hash = vk.get_hash();
43 transcript->add_to_hash_buffer("vk_hash", vk_hash);
44 vinfo("Translator vk hash in prover: ", vk_hash);
45
46 const size_t RESULT_ROW = Flavor::RESULT_ROW;
47
48 // Set accumulated_result in relation parameters from the witness polynomials
49 // The verifier will receive this value from the ECCVM verifier instead of the transcript
50 relation_parameters.accumulated_result = { key->proving_key->polynomials.accumulators_binary_limbs_0[RESULT_ROW],
51 key->proving_key->polynomials.accumulators_binary_limbs_1[RESULT_ROW],
52 key->proving_key->polynomials.accumulators_binary_limbs_2[RESULT_ROW],
53 key->proving_key->polynomials.accumulators_binary_limbs_3[RESULT_ROW] };
54}
55
63 const std::string& label,
64 bool has_duplicates_hint)
65{
66 transcript->send_to_verifier(label, key->proving_key->commitment_key.commit(polynomial, has_duplicates_hint));
67}
68
74{
75 BB_BENCH_NAME("TranslatorProver::execute_wire_and_sorted_constraints_commitments_round");
76
77 // Sparse 2d-coefficient Gemini masking polynomial on the tail-halving support.
78 // See SHPLEMINI_ZK_MASKING.md for the rank / ZK argument.
79 const size_t circuit_size = key->proving_key->circuit_size;
80 const size_t d = numeric::get_msb(circuit_size);
81 key->proving_key->polynomials.gemini_masking_poly = build_gemini_masking_poly<FF>(d, circuit_size, circuit_size);
82 Flavor::Commitment masking_commitment;
83 {
84 BB_BENCH_NAME("Translator::commit_masking_poly_msm");
85 masking_commitment = key->proving_key->commitment_key.commit(key->proving_key->polynomials.gemini_masking_poly);
86 }
87 transcript->send_to_verifier("Gemini:masking_poly_comm", masking_commitment);
88
89 // Commit to non-op-queue wires and ordered range constraints
90 // Note: Op queue wires (op, x_lo_y_hi, x_hi_z_1, y_lo_z_2) are NOT committed to here
91 // They are provided by the merge protocol and passed to the verifier
92 auto batch = key->proving_key->commitment_key.start_batch();
93 for (const auto& [wire, label] :
94 zip_view(key->proving_key->polynomials.get_non_opqueue_wires_and_ordered_range_constraints(),
95 commitment_labels.get_non_opqueue_wires_and_ordered_range_constraints())) {
96 batch.add_to_batch(wire, label);
97 }
98 batch.commit_and_send_to_verifier(transcript);
99}
100
106{
107 // Compute and store parameters required by relations in Sumcheck
108 FF beta = transcript->template get_challenge<FF>("beta");
109 FF gamma = transcript->template get_challenge<FF>("gamma");
110 const size_t NUM_LIMB_BITS = Flavor::NUM_LIMB_BITS;
113 auto uint_evaluation_input = uint256_t(key->evaluation_input_x);
114 relation_parameters.evaluation_input_x = { uint_evaluation_input.slice(0, NUM_LIMB_BITS),
115 uint_evaluation_input.slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2),
116 uint_evaluation_input.slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3),
117 uint_evaluation_input.slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4),
118 uint_evaluation_input };
119
120 std::vector<uint256_t> uint_batching_challenge_powers;
121 auto batching_challenge_v = key->batching_challenge_v;
122 uint_batching_challenge_powers.emplace_back(batching_challenge_v);
123 auto running_power = batching_challenge_v * batching_challenge_v;
124 uint_batching_challenge_powers.emplace_back(running_power);
125 running_power *= batching_challenge_v;
126 uint_batching_challenge_powers.emplace_back(running_power);
127 running_power *= batching_challenge_v;
128 uint_batching_challenge_powers.emplace_back(running_power);
129
130 for (size_t i = 0; i < 4; i++) {
132 uint_batching_challenge_powers[i].slice(0, NUM_LIMB_BITS),
133 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2),
134 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3),
135 uint_batching_challenge_powers[i].slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4),
136 uint_batching_challenge_powers[i]
137 };
138 }
139 // Compute constraint permutation grand product
140 compute_grand_products<Flavor>(key->proving_key->polynomials, relation_parameters);
141
142 // set has_duplicates_hint for Z_PERM (empty row = duplicate Z value)
143 commit_to_witness_polynomial(key->proving_key->polynomials.z_perm, commitment_labels.z_perm, true);
144}
145
151{
152 using Sumcheck = SumcheckProver<Flavor>;
153
154 // Each linearly independent subrelation contribution is multiplied by `alpha^i`, where
155 // i = 0, ..., NUM_SUBRELATIONS- 1.
156 const FF alpha = transcript->template get_challenge<FF>("Sumcheck:alpha");
157
158 std::vector<FF> gate_challenges = transcript->template get_dyadic_powers_of_challenge<FF>(
159 "Sumcheck:gate_challenge", Flavor::CONST_TRANSLATOR_LOG_N);
160
161 const size_t circuit_size = key->proving_key->circuit_size;
162
163 Sumcheck sumcheck(circuit_size,
164 key->proving_key->polynomials,
166 alpha,
167 gate_challenges,
170
171 const size_t log_subgroup_size = static_cast<size_t>(numeric::get_msb(Flavor::Curve::SUBGROUP_SIZE));
172 // Create a temporary commitment key that is only used to initialize the ZKSumcheckData
173 // If proving in WASM, the commitment key that is part of the Translator proving key remains deallocated
174 // until we enter the PCS round
175 CommitmentKey ck(1 << (log_subgroup_size + 1));
176
177 zk_sumcheck_data = ZKData(key->proving_key->log_circuit_size, transcript, ck);
178
179 sumcheck_output = sumcheck.prove(zk_sumcheck_data);
180}
181
189{
190 using Curve = typename Flavor::Curve;
192 using SmallSubgroupIPA = SmallSubgroupIPAProver<Flavor>;
193 using PolynomialBatcher = GeminiProver_<Curve>::PolynomialBatcher;
194
195 auto& ck = key->proving_key->commitment_key;
196
197 SmallSubgroupIPA small_subgroup_ipa_prover(
198 zk_sumcheck_data, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation, transcript, ck);
199 small_subgroup_ipa_prover.prove();
200
201 PolynomialBatcher polynomial_batcher(key->proving_key->circuit_size);
202
203 // Unshifted for PCS (excludes computable precomputed — verifier computes them locally)
204 polynomial_batcher.set_unshifted(key->proving_key->polynomials.get_pcs_unshifted());
205 // Shifted for PCS (base to-be-shifted + concatenated)
206 polynomial_batcher.set_to_be_shifted_by_one(key->proving_key->polynomials.get_pcs_to_be_shifted());
207
208 const OpeningClaim prover_opening_claim =
209 ShpleminiProver_<Curve>::prove(key->proving_key->circuit_size,
210 polynomial_batcher,
211 sumcheck_output.challenge,
212 ck,
214 small_subgroup_ipa_prover.get_witness_polynomials());
215
216 PCS::compute_opening_proof(ck, prover_opening_claim, transcript);
217}
218
220{
221 return transcript->export_proof();
222}
223
225{
226 BB_BENCH_NAME("TranslatorProver::construct_proof");
227
228 // Add circuit size public input size and public inputs to transcript.
230
231 // Compute first three wire commitments
233
234 // Fiat-Shamir: gamma
235 // Compute grand product(s) and commitments.
237
238 // Fiat-Shamir: alpha
239 // Run sumcheck subprotocol.
241
242 // Fiat-Shamir: rho, y, x, z
243 // Execute Shplemini PCS
245 vinfo("computed opening proof");
246 return export_proof();
247}
248
255{
256 const size_t RESULT_ROW = Flavor::RESULT_ROW;
257 return uint256_t(key->proving_key->polynomials.accumulators_binary_limbs_0[RESULT_ROW]) +
258 (uint256_t(key->proving_key->polynomials.accumulators_binary_limbs_1[RESULT_ROW]) << 68) +
259 (uint256_t(key->proving_key->polynomials.accumulators_binary_limbs_2[RESULT_ROW]) << 136) +
260 (uint256_t(key->proving_key->polynomials.accumulators_binary_limbs_3[RESULT_ROW]) << 204);
261}
262
263} // namespace bb
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:264
#define BB_BENCH()
Definition bb_bench.hpp:268
Simple verification key class for fixed-size circuits (ECCVM, Translator, AVM).
Definition flavor.hpp:104
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
Definition gemini.hpp:129
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_COMMITMENTS > &libra_polynomials={}, const std::vector< Polynomial > &sumcheck_round_univariates={}, const std::vector< std::array< FF, 3 > > &sumcheck_round_evaluations={})
Definition shplemini.hpp:37
A Curve-agnostic ZK protocol to prove inner products of small vectors.
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:304
static constexpr size_t CONST_TRANSLATOR_LOG_N
Curve::AffineElement Commitment
static constexpr size_t NUM_LIMB_BITS
static constexpr size_t RESULT_ROW
CommitmentLabels commitment_labels
typename Flavor::CommitmentKey CommitmentKey
BB_PROFILE void execute_relation_check_rounds()
Run Sumcheck resulting in u = (u_1,...,u_d) challenges and all evaluations at u being calculated.
BB_PROFILE void execute_preamble_round()
Add circuit size and values used in the relations to the transcript.
uint256_t get_accumulated_result() const
Extract the accumulated result from the circuit.
TranslatorProver(const std::shared_ptr< TranslatorProvingKey > &key, const std::shared_ptr< Transcript > &transcript)
BB_PROFILE void execute_grand_product_computation_round()
Compute permutation product polynomial and commitments.
std::shared_ptr< TranslatorProvingKey > key
bb::RelationParameters< FF > relation_parameters
std::shared_ptr< Transcript > transcript
ZKSumcheckData< Flavor > ZKData
BB_PROFILE void execute_wire_and_sorted_constraints_commitments_round()
Compute commitments to wires and ordered range constraints.
SumcheckOutput< Flavor > sumcheck_output
typename Flavor::Polynomial Polynomial
BB_PROFILE void execute_pcs_rounds()
Produce a univariate opening claim for the sumcheck multivariate evalutions and a batched univariate ...
void commit_to_witness_polynomial(Polynomial &polynomial, const std::string &label, bool has_duplicates_hint=false)
Utility to commit to witness polynomial and send the commitment to verifier.
typename Flavor::FF FF
#define vinfo(...)
Definition log.hpp:94
std::string label
constexpr T get_msb(const T in)
Definition get_msb.hpp:50
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::array< std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR+NUM_NATIVE_LIMBS_IN_GOBLIN_TRANSLATOR >, NUM_CHALLENGE_POWERS_IN_GOBLIN_TRANSLATOR > batching_challenge_v
std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR > accumulated_result
std::array< T, NUM_BINARY_LIMBS_IN_GOBLIN_TRANSLATOR+NUM_NATIVE_LIMBS_IN_GOBLIN_TRANSLATOR > evaluation_input_x