15#include "gtest/gtest.h"
19#ifdef STARKNET_GARAGA_FLAVORS
23 UltraStarknetZKFlavor,
27using FlavorTypes = ::testing::Types<UltraFlavor, UltraKeccakFlavor, UltraZKFlavor, UltraKeccakZKFlavor>;
63 size_t data_types_per_Frs = [] {
64 if constexpr (IsKeccakFlavor<Flavor>) {
65 return U256Codec::calc_num_fields<FF>();
67 return FrCodec::calc_num_fields<FF>();
70 size_t data_types_per_G = [] {
71 if constexpr (IsKeccakFlavor<Flavor>) {
72 return U256Codec::calc_num_fields<Commitment>();
74 return FrCodec::calc_num_fields<Commitment>();
77 size_t frs_per_uni = MAX_PARTIAL_RELATION_LENGTH * data_types_per_Frs;
81 manifest_expected.
add_entry(round,
"vk_hash", data_types_per_Frs);
83 manifest_expected.
add_entry(round,
"public_input_0", data_types_per_Frs);
85 for (
size_t i = 0; i < PUBLIC_INPUTS_SIZE; i++) {
91 manifest_expected.
add_entry(round,
"Gemini:masking_poly_comm", data_types_per_G);
93 manifest_expected.
add_entry(round,
"W_L", data_types_per_G);
94 manifest_expected.
add_entry(round,
"W_R", data_types_per_G);
95 manifest_expected.
add_entry(round,
"W_O", data_types_per_G);
99 manifest_expected.
add_entry(round,
"LOOKUP_READ_COUNTS", data_types_per_G);
100 manifest_expected.
add_entry(round,
"LOOKUP_READ_TAGS", data_types_per_G);
101 manifest_expected.
add_entry(round,
"W_4", data_types_per_G);
102 manifest_expected.
add_challenge(round, std::array{
"beta",
"gamma" });
105 manifest_expected.
add_entry(round,
"LOOKUP_INVERSES", data_types_per_G);
106 manifest_expected.
add_entry(round,
"Z_PERM", data_types_per_G);
109 manifest_expected.
add_challenge(round,
"Sumcheck:gate_challenge");
113 manifest_expected.
add_entry(round,
"Libra:concatenation_commitment", data_types_per_G);
114 manifest_expected.
add_entry(round,
"Libra:Sum", data_types_per_Frs);
119 for (
size_t i = 0; i < virtual_log_n; ++i) {
121 manifest_expected.
add_entry(round,
"Sumcheck:univariate_" + idx, frs_per_uni);
122 std::string label =
"Sumcheck:u_" + idx;
127 manifest_expected.
add_entry(round,
"Sumcheck:evaluations", frs_per_evals);
130 manifest_expected.
add_entry(round,
"Libra:claimed_evaluation", data_types_per_Frs);
131 manifest_expected.
add_entry(round,
"Libra:grand_sum_commitment", data_types_per_G);
132 manifest_expected.
add_entry(round,
"Libra:quotient_commitment", data_types_per_G);
138 for (
size_t i = 1; i < virtual_log_n; ++i) {
140 manifest_expected.
add_entry(round,
"Gemini:FOLD_" + idx, data_types_per_G);
144 for (
size_t i = 1; i <= virtual_log_n; ++i) {
146 manifest_expected.
add_entry(round,
"Gemini:a_" + idx, data_types_per_Frs);
150 manifest_expected.
add_entry(round,
"Libra:concatenation_eval", data_types_per_Frs);
151 manifest_expected.
add_entry(round,
"Libra:shifted_grand_sum_eval", data_types_per_Frs);
152 manifest_expected.
add_entry(round,
"Libra:grand_sum_eval", data_types_per_Frs);
153 manifest_expected.
add_entry(round,
"Libra:quotient_eval", data_types_per_Frs);
158 manifest_expected.
add_entry(round,
"Shplonk:Q", data_types_per_G);
162 manifest_expected.
add_entry(round,
"KZG:W", data_types_per_G);
163 manifest_expected.
add_challenge(round,
"KZG:masking_challenge");
165 return manifest_expected;
185 auto [stdlib_opening_claim, ipa_proof] =
187 stdlib_opening_claim.set_public();
196 size_t proof_length = compute_proof_length_for_export<Flavor>(num_public_inputs, log_n);
197 prover.
transcript->test_set_proof_parsing_state(0, proof_length);
211 auto builder =
typename TestFixture::Builder();
212 TestFixture::generate_test_circuit(
builder);
217 typename TestFixture::Prover prover(prover_instance, verification_key);
218 prover.transcript->enable_manifest();
219 auto proof = prover.construct_proof();
222 auto manifest_expected = TestFixture::construct_ultra_honk_manifest(prover.prover_instance->log_dyadic_size());
223 auto prover_manifest = prover.transcript->get_manifest();
225 manifest_expected.print();
226 prover_manifest.print();
227 ASSERT_GT(manifest_expected.size(), 0);
228 for (
size_t round = 0; round < manifest_expected.size(); ++round) {
229 if (prover_manifest[round] != manifest_expected[round]) {
230 info(
"Prover manifest discrepency in round ", round);
231 info(
"Prover manifest:");
232 prover_manifest[round].print();
233 info(
"Expected manifest:");
234 manifest_expected[round].print();
248 auto builder =
typename TestFixture::Builder();
249 TestFixture::generate_test_circuit(
builder);
255 typename TestFixture::Prover prover(prover_instance, verification_key);
256 prover.transcript->enable_manifest();
257 auto proof = prover.construct_proof();
261 verifier_transcript->enable_manifest();
262 typename TestFixture::Verifier verifier(vk_and_hash, verifier_transcript);
263 [[maybe_unused]]
auto _ = verifier.verify_proof(proof);
266 auto prover_manifest = prover.transcript->get_manifest();
267 auto verifier_manifest = verifier.get_transcript()->get_manifest();
270 ASSERT_GT(prover_manifest.size(), 0);
271 for (
size_t round = 0; round < prover_manifest.size(); ++round) {
272 ASSERT_EQ(prover_manifest[round], verifier_manifest[round])
273 <<
"Prover/Verifier manifest discrepency in round " << round;
287 auto transcript = TypeParam::Transcript::test_prover_init_empty();
289 std::vector<std::string> challenge_labels{
"a",
"b",
"c",
"d",
"e",
"f" };
290 auto challenges = transcript->template get_challenges<FF>(challenge_labels);
292 for (
size_t i = 0; i < challenges.size(); ++i) {
293 ASSERT_NE(challenges[i], 0) <<
"Challenge " << i <<
" is 0";
295 constexpr uint32_t random_val{ 17 };
296 transcript->send_to_verifier(
"random val", random_val);
298 challenge_labels = {
"a",
"b",
"c" };
299 challenges = transcript->template get_challenges<FF>(challenge_labels);
300 ASSERT_NE(challenges[0], 0) <<
"Challenge a is 0";
301 ASSERT_NE(challenges[1], 0) <<
"Challenge b is 0";
302 ASSERT_NE(challenges[2], 0) <<
"Challenge c is 0";
311 auto builder =
typename TestFixture::Builder();
312 TestFixture::generate_test_circuit(
builder);
318 typename TestFixture::Prover prover(prover_instance, verification_key);
319 auto proof = prover.construct_proof();
320 typename TestFixture::Verifier verifier(vk_and_hash);
321 EXPECT_TRUE(verifier.verify_proof(proof).result);
323 const size_t virtual_log_n =
Flavor::USE_PADDING ? CONST_PROOF_SIZE_LOG_N : prover_instance->log_dyadic_size();
329 proof_structure.deserialize(
330 prover.transcript->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
331 proof_structure.serialize(prover.transcript->test_get_proof_data(), virtual_log_n);
333 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
335 typename TestFixture::Verifier verifier2(vk_and_hash);
336 EXPECT_TRUE(verifier2.verify_proof(proof).result);
338 Commitment one_group_val = Commitment::one();
340 proof_structure.z_perm_comm = one_group_val * rand_val;
341 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
343 typename TestFixture::Verifier verifier3(vk_and_hash);
344 EXPECT_TRUE(verifier3.verify_proof(proof).result);
346 proof_structure.serialize(prover.transcript->test_get_proof_data(), virtual_log_n);
347 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
349 typename TestFixture::Verifier verifier4(vk_and_hash);
350 EXPECT_FALSE(verifier4.verify_proof(proof).result);
352 proof_structure.deserialize(
353 prover.transcript->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
354 EXPECT_EQ(
static_cast<Commitment
>(proof_structure.z_perm_comm), one_group_val * rand_val);
void generate_random_test_circuit(Builder &builder)
Flavor::Commitment Commitment
typename Flavor::Transcript::Proof Proof
static void SetUpTestSuite()
TranscriptManifest construct_ultra_honk_manifest(const size_t &log_n)
Construct a manifest for a Ultra Honk proof.
Proof export_serialized_proof(Prover &prover, const size_t num_public_inputs, const size_t log_n)
void generate_test_circuit(Builder &builder)
Manages the data that is propagated on the public inputs of an application/function circuit.
static constexpr size_t PUBLIC_INPUTS_SIZE
static void add_default(Builder &builder)
Add default IO values to a circuit builder (for native tests)
static constexpr bool HasIPA
static constexpr bool HasZK
typename Curve::ScalarField FF
static constexpr size_t NUM_ALL_ENTITIES
ECCVMCircuitBuilder CircuitBuilder
typename G1::affine_element Commitment
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
static constexpr bool USE_PADDING
Simple verification key class for fixed-size circuits (ECCVM, Translator).
IPA (inner product argument) commitment scheme class.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
void add_entry(size_t round, const std::string &element_label, size_t element_size)
void add_challenge(size_t round, const std::string &label)
Add a single challenge label to the manifest for the given round.
std::shared_ptr< Transcript > transcript
Proof export_proof()
Export the complete proof, including IPA proof for rollup circuits.
Child class of UltraFlavor that runs with ZK Sumcheck.
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
testing::Types< UltraFlavor, UltraKeccakFlavor, MegaFlavor > FlavorTypes
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
Test utility for deserializing/serializing proof data into typed structures.
static field random_element(numeric::RNG *engine=nullptr) noexcept