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 exporting batch claim from Shplonk verifier and verification
50TYPED_TEST(ShplonkTest, ExportBatchClaimAndVerify)
51{
52 using ClaimData = UnivariateClaimData<TypeParam>;
53 using ShplonkProver = ShplonkProver_<TypeParam>;
54 using ShplonkVerifier = ShplonkVerifier_<TypeParam>;
55
56 auto prover_transcript = NativeTranscript::prover_init_empty();
57
58 // Generate two random (unrelated) polynomials of two different sizes and a random linear combinations
59 auto setup = this->generate_claim_data({ MAX_POLY_DEGREE, MAX_POLY_DEGREE / 2 });
60
61 // Execute the shplonk prover functionality
62 auto prover_opening_claims = ClaimData::prover_opening_claims(setup);
63 const auto batched_opening_claim = ShplonkProver::prove(this->ck(), prover_opening_claims, prover_transcript);
64 // An intermediate check to confirm the opening of the shplonk prover witness Q
65 this->verify_opening_pair(batched_opening_claim.opening_pair, batched_opening_claim.polynomial);
67 // Compute KZG proof
68 KZG<curve::BN254>::compute_opening_proof(this->ck(), batched_opening_claim, prover_transcript);
69 } else {
70 // Compute IPA proof
71 IPA<curve::Grumpkin, LOG_DEGREE>::compute_opening_proof(this->ck(), batched_opening_claim, prover_transcript);
72 }
73
74 // Shplonk verification
75 auto verifier_transcript = NativeTranscript::verifier_init_empty(prover_transcript);
76
77 // Execute the shplonk verifier functionality
78 auto verifier_opening_claims = ClaimData::verifier_opening_claims(setup);
79 auto verifier = ShplonkVerifier::reduce_verification_no_finalize(verifier_opening_claims, verifier_transcript);
80
81 // Export batch opening claim
82 auto batched_verifier_claim = verifier.export_batch_opening_claim(this->vk().get_g1_identity());
83
85 // KZG verifier
87 std::move(batched_verifier_claim), verifier_transcript);
88 ASSERT_TRUE(this->vk().pairing_check(final_proof_points[0], final_proof_points[1]));
89 } else {
90 // Verify IPA proof
91 auto vk = create_verifier_commitment_key<VerifierCommitmentKey<curve::Grumpkin>>();
93 batched_verifier_claim, vk, verifier_transcript);
94 EXPECT_TRUE(result);
95 }
96}
97} // namespace bb
static std::shared_ptr< BaseTranscript > prover_init_empty()
For testing: initializes transcript with some arbitrary data so that a challenge can be generated aft...
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...
IPA (inner product argument) commitment scheme class.
Definition ipa.hpp:93
static PairingPointsType reduce_verify_batch_opening_claim(BatchOpeningClaim< Curve > &&batch_opening_claim, const std::shared_ptr< Transcript > &transcript, const size_t expected_final_msm_size=0)
Computes the input points for the pairing check needed to verify a KZG opening claim obtained from a ...
Definition kzg.hpp:131
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:43
Shplonk Prover.
Definition shplonk.hpp:36
Shplonk Verifier.
Definition shplonk.hpp:343
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
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