Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
shplonk.test.cpp
Go to the documentation of this file.
1#include "shplonk.hpp"
2#include "../commitment_key.test.hpp"
6#include <algorithm>
7#include <gtest/internal/gtest-internal.h>
8#include <iterator>
9#include <random>
10#include <vector>
11namespace bb {
12template <class Params> class ShplonkTest : public CommitmentTest<Params> {};
13
14static constexpr size_t LOG_DEGREE = 4;
15static constexpr size_t MAX_POLY_DEGREE = 1UL << LOG_DEGREE;
16
17using CurveTypes = ::testing::Types<curve::BN254, curve::Grumpkin>;
19
20// Test of Shplonk prover/verifier for two polynomials of different sizes, each opened at a single (different) point
21TYPED_TEST(ShplonkTest, ShplonkSimple)
22{
23 using ClaimData = UnivariateClaimData<TypeParam>;
24 using ShplonkProver = ShplonkProver_<TypeParam>;
25 using ShplonkVerifier = ShplonkVerifier_<TypeParam>;
26
27 auto prover_transcript = NativeTranscript::prover_init_empty();
28
29 // Generate two random (unrelated) polynomials of two different sizes, as well as their evaluations at a (single
30 // but different) random point and their commitments.
31 auto setup = this->generate_claim_data({ MAX_POLY_DEGREE, MAX_POLY_DEGREE / 2 });
32
33 // Execute the shplonk prover functionality
34 auto prover_opening_claims = ClaimData::prover_opening_claims(setup);
35 const auto batched_opening_claim = ShplonkProver::prove(this->ck(), prover_opening_claims, prover_transcript);
36 // An intermediate check to confirm the opening of the shplonk prover witness Q
37 this->verify_opening_pair(batched_opening_claim.opening_pair, batched_opening_claim.polynomial);
38
39 // Initialize verifier transcript from prover transcript
40 auto verifier_transcript = NativeTranscript::verifier_init_empty(prover_transcript);
41
42 // Execute the shplonk verifier functionality
43 const auto batched_verifier_claim = ShplonkVerifier::reduce_verification(
44 this->vk().get_g1_identity(), ClaimData::verifier_opening_claims(setup), verifier_transcript);
45
46 this->verify_opening_claim(batched_verifier_claim, batched_opening_claim.polynomial);
47}
48
49// Test of Shplonk prover/verifier for polynomials that are linearly dependent
50TYPED_TEST(ShplonkTest, ShplonkLinearlyDependent)
51{
52 using ClaimData = UnivariateClaimData<TypeParam>;
53 using ShplonkProver = ShplonkProver_<TypeParam>;
54 using ShplonkVerifier = ShplonkVerifier_<TypeParam>;
55 using Fr = typename TypeParam::ScalarField;
56
57 auto prover_transcript = NativeTranscript::prover_init_empty();
58
59 // Generate two random (unrelated) polynomials of two different sizes and a random linear combinations
60 auto setup = this->generate_claim_data({ MAX_POLY_DEGREE, MAX_POLY_DEGREE / 2 });
61
62 // Extract the commitments to be used in the Shplonk verifier
63 auto commitments = ClaimData::polynomial_commitments(setup);
64
65 // Linearly combine the polynomials and evaluations
66 auto [coefficients, evals] = this->combine_claims(setup);
67
68 // Execute the shplonk prover functionality
69 auto prover_opening_claims = ClaimData::prover_opening_claims(setup);
70 const auto batched_opening_claim = ShplonkProver::prove(this->ck(), prover_opening_claims, prover_transcript);
71 // An intermediate check to confirm the opening of the shplonk prover witness Q
72 this->verify_opening_pair(batched_opening_claim.opening_pair, batched_opening_claim.polynomial);
73
74 // Shplonk verification
75 auto verifier_opening_claims = ClaimData::verifier_opening_claims(setup);
77 { { 0 }, { Fr(1) }, verifier_opening_claims[0].opening_pair },
78 { { 1 }, { Fr(1) }, verifier_opening_claims[1].opening_pair },
79 { { 0, 1 }, coefficients, verifier_opening_claims[2].opening_pair },
80 };
81 auto verifier_transcript = NativeTranscript::verifier_init_empty(prover_transcript);
82 ShplonkVerifier verifier(commitments, verifier_transcript, verifier_opening_claims.size());
83
84 // Execute the shplonk verifier functionality
85 const auto batched_verifier_claim =
86 verifier.reduce_verification_vector_claims(this->vk().get_g1_identity(), update_data);
87
88 this->verify_opening_claim(batched_verifier_claim, batched_opening_claim.polynomial);
89}
90
91// Test exporting batch claim from Shplonk verifier and verification
92TYPED_TEST(ShplonkTest, ExportBatchClaimAndVerify)
93{
94 using ClaimData = UnivariateClaimData<TypeParam>;
95 using ShplonkProver = ShplonkProver_<TypeParam>;
96 using ShplonkVerifier = ShplonkVerifier_<TypeParam>;
97
98 auto prover_transcript = NativeTranscript::prover_init_empty();
99
100 // Generate two random (unrelated) polynomials of two different sizes and a random linear combinations
101 auto setup = this->generate_claim_data({ MAX_POLY_DEGREE, MAX_POLY_DEGREE / 2 });
102
103 // Execute the shplonk prover functionality
104 auto prover_opening_claims = ClaimData::prover_opening_claims(setup);
105 const auto batched_opening_claim = ShplonkProver::prove(this->ck(), prover_opening_claims, prover_transcript);
106 // An intermediate check to confirm the opening of the shplonk prover witness Q
107 this->verify_opening_pair(batched_opening_claim.opening_pair, batched_opening_claim.polynomial);
109 // Compute KZG proof
110 KZG<curve::BN254>::compute_opening_proof(this->ck(), batched_opening_claim, prover_transcript);
111 } else {
112 // Compute IPA proof
113 IPA<curve::Grumpkin, LOG_DEGREE>::compute_opening_proof(this->ck(), batched_opening_claim, prover_transcript);
114 }
115
116 // Shplonk verification
117 auto verifier_transcript = NativeTranscript::verifier_init_empty(prover_transcript);
118
119 // Execute the shplonk verifier functionality
120 auto verifier_opening_claims = ClaimData::verifier_opening_claims(setup);
121 auto verifier = ShplonkVerifier::reduce_verification_no_finalize(verifier_opening_claims, verifier_transcript);
122
123 // Export batch opening claim
124 const auto batched_verifier_claim = verifier.export_batch_opening_claim(this->vk().get_g1_identity());
125
127 // KZG verifier
128 auto final_proof_points =
129 KZG<curve::BN254>::reduce_verify_batch_opening_claim(batched_verifier_claim, verifier_transcript);
130 ASSERT_TRUE(this->vk().pairing_check(final_proof_points[0], final_proof_points[1]));
131 } else {
132 // Verify IPA proof
133 auto vk = create_verifier_commitment_key<VerifierCommitmentKey<curve::Grumpkin>>();
135 batched_verifier_claim, vk, verifier_transcript);
136 EXPECT_TRUE(result);
137 }
138}
139} // namespace bb
static std::shared_ptr< BaseTranscript > verifier_init_empty(const std::shared_ptr< BaseTranscript > &transcript)
For testing: initializes transcript based on proof data then receives junk data produced by BaseTrans...
static std::shared_ptr< BaseTranscript > prover_init_empty()
For testing: initializes transcript with some arbitrary data so that a challenge can be generated aft...
IPA (inner product argument) commitment scheme class.
Definition ipa.hpp:95
static VerifierAccumulator reduce_verify_batch_opening_claim(BatchOpeningClaim< Curve > batch_opening_claim, const std::shared_ptr< Transcript > &transcript)
Computes the input points for the pairing check needed to verify a KZG opening claim obtained from a ...
Definition kzg.hpp:122
static void compute_opening_proof(const CK &ck, const ProverOpeningClaim< Curve > &opening_claim, const std::shared_ptr< Transcript > &prover_trancript)
Computes the KZG commitment to an opening proof polynomial at a single evaluation point.
Definition kzg.hpp:40
Shplonk Prover.
Definition shplonk.hpp:36
Shplonk Verifier.
Definition shplonk.hpp:343
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
::testing::Types< curve::BN254, curve::Grumpkin > CurveTypes
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Curve::ScalarField Fr