17#include <gtest/gtest.h>
21#ifdef STARKNET_GARAGA_FLAVORS
25 UltraStarknetZKFlavor,
32 ::testing::Types<UltraFlavor, UltraKeccakFlavor, UltraZKFlavor, UltraKeccakZKFlavor, MegaFlavor, MegaZKFlavor>;
69 size_t data_types_per_Frs = [] {
70 if constexpr (IsKeccakFlavor<Flavor>) {
71 return U256Codec::calc_num_fields<FF>();
73 return FrCodec::calc_num_fields<FF>();
76 size_t data_types_per_G = [] {
77 if constexpr (IsKeccakFlavor<Flavor>) {
78 return U256Codec::calc_num_fields<Commitment>();
80 return FrCodec::calc_num_fields<Commitment>();
83 size_t frs_per_uni = MAX_PARTIAL_RELATION_LENGTH * data_types_per_Frs;
87 manifest_expected.
add_entry(round,
"vk_hash", data_types_per_Frs);
89 manifest_expected.
add_entry(round,
"public_input_0", data_types_per_Frs);
91 for (
size_t i = 0; i < PUBLIC_INPUTS_SIZE; i++) {
96 if constexpr (flavor_has_gemini_masking<Flavor>()) {
97 manifest_expected.
add_entry(round,
"Gemini:masking_poly_comm", data_types_per_G);
99 manifest_expected.
add_entry(round,
"W_L", data_types_per_G);
100 manifest_expected.
add_entry(round,
"W_R", data_types_per_G);
101 manifest_expected.
add_entry(round,
"W_O", data_types_per_G);
103 if constexpr (Flavor::HasEccOpQueue) {
104 manifest_expected.
add_entry(round,
"ECC_OP_WIRE_1", data_types_per_G);
105 manifest_expected.
add_entry(round,
"ECC_OP_WIRE_2", data_types_per_G);
106 manifest_expected.
add_entry(round,
"ECC_OP_WIRE_3", data_types_per_G);
107 manifest_expected.
add_entry(round,
"ECC_OP_WIRE_4", data_types_per_G);
112 "SECOND_APP_CALLDATA",
"THIRD_APP_CALLDATA",
113 "FOURTH_APP_CALLDATA",
"FIFTH_APP_CALLDATA",
115 if constexpr (Flavor::HasDataBus) {
116 for (
size_t i = 0; i < Flavor::NUM_BUS_COLUMNS; ++i) {
117 manifest_expected.
add_entry(round, ALL_BUSES[i], data_types_per_G);
118 manifest_expected.
add_entry(round, std::string(ALL_BUSES[i]) +
"_READ_COUNTS", data_types_per_G);
125 if constexpr (Flavor::HasMemory) {
126 manifest_expected.
add_challenge(round, std::array{
"eta",
"rom_logup_gamma" });
129 if constexpr (Flavor::HasLogDerivLookup) {
130 manifest_expected.
add_entry(round,
"LOOKUP_READ_COUNTS", data_types_per_G);
131 manifest_expected.
add_entry(round,
"LOOKUP_READ_TAGS", data_types_per_G);
133 manifest_expected.
add_entry(round,
"W_4", data_types_per_G);
134 manifest_expected.
add_challenge(round, std::array{
"beta",
"gamma" });
137 if constexpr (Flavor::HasLogDerivLookup) {
138 manifest_expected.
add_entry(round,
"LOOKUP_INVERSES", data_types_per_G);
140 if constexpr (Flavor::HasDataBus) {
141 for (
size_t i = 0; i < Flavor::NUM_BUS_COLUMNS; ++i) {
142 manifest_expected.
add_entry(round, std::string(ALL_BUSES[i]) +
"_INVERSES", data_types_per_G);
145 manifest_expected.
add_entry(round,
"Z_PERM", data_types_per_G);
148 manifest_expected.
add_challenge(round,
"Sumcheck:gate_challenge");
152 manifest_expected.
add_entry(round,
"Libra:concatenation_commitment", data_types_per_G);
153 manifest_expected.
add_entry(round,
"Libra:Sum", data_types_per_Frs);
158 for (
size_t i = 0; i < virtual_log_n; ++i) {
160 manifest_expected.
add_entry(round,
"Sumcheck:univariate_" + idx, frs_per_uni);
161 std::string
label =
"Sumcheck:u_" + idx;
166 manifest_expected.
add_entry(round,
"Sumcheck:evaluations", frs_per_evals);
169 manifest_expected.
add_entry(round,
"Libra:claimed_evaluation", data_types_per_Frs);
170 manifest_expected.
add_entry(round,
"Libra:grand_sum_commitment", data_types_per_G);
171 manifest_expected.
add_entry(round,
"Libra:quotient_commitment", data_types_per_G);
177 for (
size_t i = 1; i < virtual_log_n; ++i) {
179 manifest_expected.
add_entry(round,
"Gemini:FOLD_" + idx, data_types_per_G);
183 for (
size_t i = 1; i <= virtual_log_n; ++i) {
185 manifest_expected.
add_entry(round,
"Gemini:a_" + idx, data_types_per_Frs);
189 manifest_expected.
add_entry(round,
"Libra:concatenation_eval", data_types_per_Frs);
190 manifest_expected.
add_entry(round,
"Libra:shifted_grand_sum_eval", data_types_per_Frs);
191 manifest_expected.
add_entry(round,
"Libra:grand_sum_eval", data_types_per_Frs);
192 manifest_expected.
add_entry(round,
"Libra:quotient_eval", data_types_per_Frs);
197 manifest_expected.
add_entry(round,
"Shplonk:Q", data_types_per_G);
201 manifest_expected.
add_entry(round,
"KZG:W", data_types_per_G);
203 return manifest_expected;
219 prover.
get_transcript()->test_set_proof_parsing_state(0, proof_length);
233 auto builder =
typename TestFixture::Builder();
234 TestFixture::generate_test_circuit(
builder);
239 typename TestFixture::Prover prover(prover_instance, verification_key);
240 prover.get_transcript()->enable_manifest();
241 auto proof = prover.construct_proof();
244 auto manifest_expected = TestFixture::construct_honk_manifest(prover.log_dyadic_size());
245 auto prover_manifest = prover.get_transcript()->get_manifest();
247 manifest_expected.print();
248 prover_manifest.print();
249 ASSERT_GT(manifest_expected.size(), 0);
250 for (
size_t round = 0; round < manifest_expected.size(); ++round) {
251 if (prover_manifest[round] != manifest_expected[round]) {
252 info(
"Prover manifest discrepency in round ", round);
253 info(
"Prover manifest:");
254 prover_manifest[round].print();
255 info(
"Expected manifest:");
256 manifest_expected[round].print();
269 auto builder =
typename TestFixture::Builder();
270 TestFixture::generate_test_circuit(
builder);
276 typename TestFixture::Prover prover(prover_instance, verification_key);
277 prover.get_transcript()->enable_manifest();
278 auto proof = prover.construct_proof();
282 verifier_transcript->enable_manifest();
283 typename TestFixture::Verifier verifier(vk_and_hash, verifier_transcript);
284 [[maybe_unused]]
auto _ = verifier.verify_proof(proof);
287 auto prover_manifest = prover.get_transcript()->get_manifest();
288 auto verifier_manifest = verifier.get_transcript()->get_manifest();
291 ASSERT_GT(prover_manifest.size(), 0);
292 for (
size_t round = 0; round < prover_manifest.size(); ++round) {
293 ASSERT_EQ(prover_manifest[round], verifier_manifest[round])
294 <<
"Prover/Verifier manifest discrepency in round " << round;
307 auto transcript = TypeParam::Transcript::test_prover_init_empty();
309 std::vector<std::string> challenge_labels{
"a",
"b",
"c",
"d",
"e",
"f" };
310 auto challenges = transcript->template get_challenges<FF>(challenge_labels);
312 for (
size_t i = 0; i < challenges.size(); ++i) {
313 ASSERT_NE(challenges[i], 0) <<
"Challenge " << i <<
" is 0";
315 constexpr uint32_t random_val{ 17 };
316 transcript->send_to_verifier(
"random val", random_val);
318 challenge_labels = {
"a",
"b",
"c" };
319 challenges = transcript->template get_challenges<FF>(challenge_labels);
320 ASSERT_NE(challenges[0], 0) <<
"Challenge a is 0";
321 ASSERT_NE(challenges[1], 0) <<
"Challenge b is 0";
322 ASSERT_NE(challenges[2], 0) <<
"Challenge c is 0";
331 auto builder =
typename TestFixture::Builder();
332 TestFixture::generate_test_circuit(
builder);
338 typename TestFixture::Prover prover(prover_instance, verification_key);
339 auto proof = prover.construct_proof();
340 typename TestFixture::Verifier verifier(vk_and_hash);
341 EXPECT_TRUE(verifier.verify_proof(proof).result);
343 const size_t virtual_log_n =
Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : prover_instance->log_dyadic_size();
349 proof_structure.deserialize(
350 prover.get_transcript()->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
351 proof_structure.serialize(prover.get_transcript()->test_get_proof_data(), virtual_log_n);
353 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
355 typename TestFixture::Verifier verifier2(vk_and_hash);
356 EXPECT_TRUE(verifier2.verify_proof(proof).result);
358 Commitment one_group_val = Commitment::one();
360 proof_structure.z_perm_comm = one_group_val * rand_val;
361 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
363 typename TestFixture::Verifier verifier3(vk_and_hash);
364 EXPECT_TRUE(verifier3.verify_proof(proof).result);
366 proof_structure.serialize(prover.get_transcript()->test_get_proof_data(), virtual_log_n);
367 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
369 typename TestFixture::Verifier verifier4(vk_and_hash);
370 EXPECT_FALSE(verifier4.verify_proof(proof).result);
372 proof_structure.deserialize(
373 prover.get_transcript()->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
374 EXPECT_EQ(
static_cast<Commitment
>(proof_structure.z_perm_comm), one_group_val * rand_val);
typename Flavor::Transcript::Proof Proof
TranscriptManifest construct_honk_manifest(const size_t &log_n)
Construct a manifest for a Honk proof (Ultra or Mega)
void generate_test_circuit(Builder &builder)
static void SetUpTestSuite()
Proof export_serialized_proof(Prover &prover, const size_t num_public_inputs, const size_t log_n)
Flavor::Commitment Commitment
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 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, AVM).
Hiding-kernel-only Mega variant: runs with ZK Sumcheck and a reduced relation set.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
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.
const std::shared_ptr< Transcript > & get_transcript() const
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 shared across Honk flavors.
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)
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
Test utility for deserializing/serializing proof data into typed structures.
static field random_element(numeric::RNG *engine=nullptr) noexcept