Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
commitment_key.test.hpp
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#pragma once
8
14#include "claim.hpp"
15
16#include <gtest/gtest.h>
17
18namespace bb {
19
20constexpr size_t COMMITMENT_TEST_NUM_BN254_POINTS = 4096;
21constexpr size_t COMMITMENT_TEST_NUM_GRUMPKIN_POINTS = 1 << CONST_ECCVM_LOG_N;
22
23template <class Curve> class UnivariateClaimData {
24 using Fr = typename Curve::ScalarField;
28
29 public:
33
39
41
43
45
47 const std::vector<UnivariateClaimData>& claim_data)
48 {
50 for (const auto& claim : claim_data) {
51 prover_claims.emplace_back(claim.prover_opening_claim());
52 }
53
54 return prover_claims;
55 }
56
58 {
59 std::vector<OpeningClaim<Curve>> verifier_claims;
60 for (const auto& claim : claim_data) {
61 verifier_claims.emplace_back(claim.verifier_opening_claim());
62 }
63
64 return verifier_claims;
65 }
66
67 static std::vector<Commitment> polynomial_commitments(const std::vector<UnivariateClaimData>& claim_data)
68 {
69 std::vector<Commitment> commitments;
70 for (const auto& claim : claim_data) {
71 commitments.emplace_back(claim.polynomial_commiment());
72 }
73
74 return commitments;
75 }
76};
77
78template <class CK> CK create_commitment_key(const size_t num_points = 0);
79
80template <>
81inline CommitmentKey<curve::BN254> create_commitment_key<CommitmentKey<curve::BN254>>(const size_t num_points)
82{
84 if (num_points != 0) {
85 return CommitmentKey<curve::BN254>(num_points);
86 };
87 return CommitmentKey<curve::BN254>(COMMITMENT_TEST_NUM_BN254_POINTS);
88}
89// For IPA
90template <>
91inline CommitmentKey<curve::Grumpkin> create_commitment_key<CommitmentKey<curve::Grumpkin>>(const size_t num_points)
92{
94 if (num_points != 0) {
95 return CommitmentKey<curve::Grumpkin>(num_points);
96 }
97 return CommitmentKey<curve::Grumpkin>(COMMITMENT_TEST_NUM_GRUMPKIN_POINTS);
98}
99
100template <typename CK> inline CK create_commitment_key(size_t num_points)
101// requires std::default_initializable<CK>
102{
103 return CK(num_points);
104}
105
106template <class VK> inline VK create_verifier_commitment_key();
107
108template <>
109inline VerifierCommitmentKey<curve::BN254> create_verifier_commitment_key<VerifierCommitmentKey<curve::BN254>>()
110{
112}
113// For IPA
114template <>
115inline VerifierCommitmentKey<curve::Grumpkin> create_verifier_commitment_key<VerifierCommitmentKey<curve::Grumpkin>>()
116{
118 return VerifierCommitmentKey<curve::Grumpkin>(COMMITMENT_TEST_NUM_GRUMPKIN_POINTS, srs::get_grumpkin_crs_factory());
119}
120template <typename VK> VK create_verifier_commitment_key()
121// requires std::default_initializable<VK>
122{
123 return VK();
124}
125template <typename Curve> class CommitmentTest : public ::testing::Test {
128
129 using Fr = typename Curve::ScalarField;
132
133 public:
135 : engine{ &numeric::get_randomness() }
136 {}
137
138 const CK& ck() { return commitment_key; }
139 VK& vk() { return verification_key; }
140
141 Commitment commit(const Polynomial& polynomial) { return commitment_key.commit(polynomial); }
142
144
145 Polynomial random_polynomial(const size_t poly_size) { return Polynomial::random(poly_size); }
146
148 {
149 Fr x{ random_element() };
150 Fr y{ polynomial.evaluate(x) };
151 return { x, y };
152 }
153
154 std::vector<Fr> random_evaluation_point(const size_t num_variables)
155 {
156 std::vector<Fr> u(num_variables);
157 for (size_t l = 0; l < num_variables; ++l) {
158 u[l] = random_element();
159 }
160 return u;
161 }
162
164 const Polynomial& witness,
166 {
167 auto& commitment = claim.commitment;
168 auto& [x, y] = claim.opening_pair;
169 Fr y_expected = witness.evaluate(x);
170 EXPECT_EQ(y, y_expected) << "OpeningClaim: evaluations mismatch";
171 Commitment commitment_expected;
172
173 if (!ck.srs) {
174 commitment_expected = commit(witness);
175 } else {
176 commitment_expected = ck.commit(witness);
177 }
178
179 EXPECT_EQ(commitment, commitment_expected) << "OpeningClaim: commitment mismatch";
180 }
181
182 void verify_opening_pair(const OpeningPair<Curve>& opening_pair, const Polynomial& witness)
183 {
184 auto& [x, y] = opening_pair;
185 Fr y_expected = witness.evaluate(x);
186 EXPECT_EQ(y, y_expected) << "OpeningPair: evaluations mismatch";
187 }
188
196 void verify_batch_opening_claim(std::span<const OpeningClaim<Curve>> multi_claims,
198 {
199 const size_t num_claims = multi_claims.size();
200 ASSERT_EQ(witnesses.size(), num_claims);
201
202 for (size_t j = 0; j < num_claims; ++j) {
203 this->verify_opening_claim(multi_claims[j], witnesses[j]);
204 }
205 }
206
211 void verify_batch_opening_pair(std::vector<ProverOpeningClaim<Curve>> opening_claims)
212 {
213 for (auto claim : opening_claims) {
214 auto& [x, y] = claim.opening_pair;
215 Fr y_expected = claim.polynomial.evaluate(x);
216 EXPECT_EQ(y, y_expected) << "OpeningPair: evaluations mismatch";
217 }
218 }
219
220 // Generate random claim data
221 std::vector<UnivariateClaimData<Curve>> generate_claim_data(const std::vector<size_t>& poly_sizes)
222 {
223 const size_t num_claims = poly_sizes.size();
225 claims.reserve(num_claims);
226 for (const auto& poly_size : poly_sizes) {
227 auto r = this->random_element();
228 auto poly = this->random_polynomial(poly_size);
229 auto eval = poly.evaluate(r);
230 auto commitment = this->commit(poly);
231
232 OpeningPair<Curve> opening_pair(r, eval);
233 UnivariateClaimData<Curve> claim(poly, commitment, opening_pair);
234 claims.emplace_back(claim);
235 }
236
237 return claims;
238 }
239
240 // Linearly combine multiple claims and append new claim
242 {
243 const size_t num_claims = claims.size();
244 size_t max_poly_size = 0;
245
246 // Generate random coefficients and find max poly size
247 std::vector<Fr> coefficients;
248 coefficients.reserve(num_claims);
249 for (size_t idx = 0; idx < num_claims; idx++) {
250 coefficients.emplace_back(this->random_element());
251 max_poly_size = std::max(max_poly_size, claims[idx].poly.size());
252 }
253 // Generate random linear combination
254 auto challenge = this->random_element();
255 Polynomial linear_combination(max_poly_size);
256 Fr eval = 0;
257 std::vector<Fr> evals;
258 evals.reserve(num_claims);
259 for (const auto& [coeff, claim] : zip_view(coefficients, claims)) {
260 linear_combination.add_scaled(claim.poly, coeff);
261 // Compute evaluation
262 auto tmp = claim.poly.evaluate(challenge);
263 evals.emplace_back(tmp);
264 eval += coeff * tmp;
265 }
266
267 Commitment commitment = this->commit(linear_combination);
268 OpeningPair<Curve> opening_pair(challenge, eval);
269 UnivariateClaimData<Curve> new_claim(linear_combination, commitment, opening_pair);
270 claims.emplace_back(new_claim);
271
272 return std::make_pair(coefficients, evals);
273 }
274
276
277 // Per-test-suite set-up.
278 // Called before the first test in this test suite.
279 // Can be omitted if not needed.
280 static void SetUpTestSuite()
281 {
282 // Avoid reallocating static objects if called in subclasses of FooTest.
284 commitment_key = create_commitment_key<CK>();
285 }
286 if (!verification_key.initialized()) {
287 verification_key = create_verifier_commitment_key<VK>();
288 }
289 }
290
291 // Per-test-suite tear-down.
292 // Called after the last test in this test suite.
293 // Can be omitted if not needed.
294 static void TearDownTestSuite() {}
295
298};
299
302
303using CommitmentSchemeParams = ::testing::Types<curve::BN254>;
304using IpaCommitmentSchemeParams = ::testing::Types<curve::Grumpkin>;
305
306} // namespace bb
CommitmentKey object over a pairing group 𝔾₁.
Commitment commit(PolynomialSpan< const Fr > polynomial) const
Uses the ProverSRS to create a commitment to p(X)
bool initialized() const
Checks the commitment key is properly initialized.
std::shared_ptr< srs::factories::Crs< Curve > > srs
Commitment commit(const Polynomial &polynomial)
void verify_opening_pair(const OpeningPair< Curve > &opening_pair, const Polynomial &witness)
Polynomial random_polynomial(const size_t poly_size)
typename Curve::ScalarField Fr
void verify_batch_opening_pair(std::vector< ProverOpeningClaim< Curve > > opening_claims)
Ensures that a set of opening pairs is correct by checking that evaluations are correct by recomputin...
std::vector< Fr > random_evaluation_point(const size_t num_variables)
void verify_opening_claim(const OpeningClaim< Curve > &claim, const Polynomial &witness, CommitmentKey< Curve > ck=CommitmentKey< Curve >())
void verify_batch_opening_claim(std::span< const OpeningClaim< Curve > > multi_claims, std::span< const Polynomial > witnesses)
Ensures that a 'BatchOpeningClaim' is correct by checking that.
typename Curve::AffineElement Commitment
std::vector< UnivariateClaimData< Curve > > generate_claim_data(const std::vector< size_t > &poly_sizes)
std::pair< std::vector< Fr >, std::vector< Fr > > combine_claims(std::vector< UnivariateClaimData< Curve > > &claims)
OpeningPair< Curve > random_eval(const Polynomial &polynomial)
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:53
OpeningPair< Curve > opening_pair
Definition claim.hpp:62
Commitment commitment
Definition claim.hpp:64
Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v.
Definition claim.hpp:19
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
static Polynomial random(size_t size, size_t start_index=0)
Fr evaluate(const Fr &z, size_t target_size) const
void add_scaled(PolynomialSpan< const Fr > other, Fr scaling_factor) &
adds the polynomial q(X) 'other', multiplied by a scaling factor.
Polynomial p and an opening pair (r,v) such that p(r) = v.
Definition claim.hpp:34
ProverOpeningClaim< Curve > prover_opening_claim() const
typename Curve::ScalarField Fr
static std::vector< Commitment > polynomial_commitments(const std::vector< UnivariateClaimData > &claim_data)
static std::vector< OpeningClaim< Curve > > verifier_opening_claims(const std::vector< UnivariateClaimData > &claim_data)
static std::vector< ProverOpeningClaim< Curve > > prover_opening_claims(const std::vector< UnivariateClaimData > &claim_data)
typename Curve::AffineElement Commitment
OpeningPair< Curve > OpeningPair
Commitment polynomial_commiment() const
UnivariateClaimData(Polynomial &poly, Commitment &commitment, OpeningPair &opening_pair)
OpeningClaim< Curve > verifier_opening_claim() const
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::affine_element AffineElement
Definition grumpkin.hpp:56
RNG & get_randomness()
Definition engine.cpp:203
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
std::shared_ptr< factories::CrsFactory< curve::Grumpkin > > get_grumpkin_crs_factory()
Entry point for Barretenberg command-line interface.
CommitmentKey< Curve > create_commitment_key(const size_t num_points)
::testing::Types< curve::BN254 > CommitmentSchemeParams
constexpr size_t COMMITMENT_TEST_NUM_BN254_POINTS
constexpr size_t COMMITMENT_TEST_NUM_GRUMPKIN_POINTS
VK create_verifier_commitment_key()
::testing::Types< curve::Grumpkin > IpaCommitmentSchemeParams
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static field random_element(numeric::RNG *engine=nullptr) noexcept