16#include <gtest/gtest.h>
20#ifdef STARKNET_GARAGA_FLAVORS
24 UltraStarknetZKFlavor,
31 ::testing::Types<UltraFlavor, UltraKeccakFlavor, UltraZKFlavor, UltraKeccakZKFlavor, MegaFlavor, MegaZKFlavor>;
68 size_t data_types_per_Frs = [] {
69 if constexpr (IsKeccakFlavor<Flavor>) {
70 return U256Codec::calc_num_fields<FF>();
72 return FrCodec::calc_num_fields<FF>();
75 size_t data_types_per_G = [] {
76 if constexpr (IsKeccakFlavor<Flavor>) {
77 return U256Codec::calc_num_fields<Commitment>();
79 return FrCodec::calc_num_fields<Commitment>();
82 size_t frs_per_uni = MAX_PARTIAL_RELATION_LENGTH * data_types_per_Frs;
86 manifest_expected.
add_entry(round,
"vk_hash", data_types_per_Frs);
88 manifest_expected.
add_entry(round,
"public_input_0", data_types_per_Frs);
90 for (
size_t i = 0; i < PUBLIC_INPUTS_SIZE; i++) {
96 manifest_expected.
add_entry(round,
"Gemini:masking_poly_comm", data_types_per_G);
98 manifest_expected.
add_entry(round,
"W_L", data_types_per_G);
99 manifest_expected.
add_entry(round,
"W_R", data_types_per_G);
100 manifest_expected.
add_entry(round,
"W_O", data_types_per_G);
103 if constexpr (IsMegaFlavor<Flavor>) {
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);
108 manifest_expected.
add_entry(round,
"CALLDATA", data_types_per_G);
109 manifest_expected.
add_entry(round,
"CALLDATA_READ_COUNTS", data_types_per_G);
110 manifest_expected.
add_entry(round,
"CALLDATA_READ_TAGS", data_types_per_G);
111 manifest_expected.
add_entry(round,
"SECONDARY_CALLDATA", data_types_per_G);
112 manifest_expected.
add_entry(round,
"SECONDARY_CALLDATA_READ_COUNTS", data_types_per_G);
113 manifest_expected.
add_entry(round,
"SECONDARY_CALLDATA_READ_TAGS", data_types_per_G);
114 manifest_expected.
add_entry(round,
"RETURN_DATA", data_types_per_G);
115 manifest_expected.
add_entry(round,
"RETURN_DATA_READ_COUNTS", data_types_per_G);
116 manifest_expected.
add_entry(round,
"RETURN_DATA_READ_TAGS", data_types_per_G);
122 manifest_expected.
add_entry(round,
"LOOKUP_READ_COUNTS", data_types_per_G);
123 manifest_expected.
add_entry(round,
"LOOKUP_READ_TAGS", data_types_per_G);
124 manifest_expected.
add_entry(round,
"W_4", data_types_per_G);
125 manifest_expected.
add_challenge(round, std::array{
"beta",
"gamma" });
128 manifest_expected.
add_entry(round,
"LOOKUP_INVERSES", data_types_per_G);
130 if constexpr (IsMegaFlavor<Flavor>) {
131 manifest_expected.
add_entry(round,
"CALLDATA_INVERSES", data_types_per_G);
132 manifest_expected.
add_entry(round,
"SECONDARY_CALLDATA_INVERSES", data_types_per_G);
133 manifest_expected.
add_entry(round,
"RETURN_DATA_INVERSES", data_types_per_G);
135 manifest_expected.
add_entry(round,
"Z_PERM", data_types_per_G);
138 manifest_expected.
add_challenge(round,
"Sumcheck:gate_challenge");
142 manifest_expected.
add_entry(round,
"Libra:concatenation_commitment", data_types_per_G);
143 manifest_expected.
add_entry(round,
"Libra:Sum", data_types_per_Frs);
148 for (
size_t i = 0; i < virtual_log_n; ++i) {
150 manifest_expected.
add_entry(round,
"Sumcheck:univariate_" + idx, frs_per_uni);
151 std::string label =
"Sumcheck:u_" + idx;
156 manifest_expected.
add_entry(round,
"Sumcheck:evaluations", frs_per_evals);
159 manifest_expected.
add_entry(round,
"Libra:claimed_evaluation", data_types_per_Frs);
160 manifest_expected.
add_entry(round,
"Libra:grand_sum_commitment", data_types_per_G);
161 manifest_expected.
add_entry(round,
"Libra:quotient_commitment", data_types_per_G);
167 for (
size_t i = 1; i < virtual_log_n; ++i) {
169 manifest_expected.
add_entry(round,
"Gemini:FOLD_" + idx, data_types_per_G);
173 for (
size_t i = 1; i <= virtual_log_n; ++i) {
175 manifest_expected.
add_entry(round,
"Gemini:a_" + idx, data_types_per_Frs);
179 manifest_expected.
add_entry(round,
"Libra:concatenation_eval", data_types_per_Frs);
180 manifest_expected.
add_entry(round,
"Libra:shifted_grand_sum_eval", data_types_per_Frs);
181 manifest_expected.
add_entry(round,
"Libra:grand_sum_eval", data_types_per_Frs);
182 manifest_expected.
add_entry(round,
"Libra:quotient_eval", data_types_per_Frs);
187 manifest_expected.
add_entry(round,
"Shplonk:Q", data_types_per_G);
191 manifest_expected.
add_entry(round,
"KZG:W", data_types_per_G);
193 return manifest_expected;
209 prover.
get_transcript()->test_set_proof_parsing_state(0, proof_length);
223 auto builder =
typename TestFixture::Builder();
224 TestFixture::generate_test_circuit(
builder);
229 typename TestFixture::Prover prover(prover_instance, verification_key);
230 prover.get_transcript()->enable_manifest();
231 auto proof = prover.construct_proof();
234 auto manifest_expected = TestFixture::construct_honk_manifest(prover.log_dyadic_size());
235 auto prover_manifest = prover.get_transcript()->get_manifest();
237 manifest_expected.print();
238 prover_manifest.print();
239 ASSERT_GT(manifest_expected.size(), 0);
240 for (
size_t round = 0; round < manifest_expected.size(); ++round) {
241 if (prover_manifest[round] != manifest_expected[round]) {
242 info(
"Prover manifest discrepency in round ", round);
243 info(
"Prover manifest:");
244 prover_manifest[round].print();
245 info(
"Expected manifest:");
246 manifest_expected[round].print();
259 auto builder =
typename TestFixture::Builder();
260 TestFixture::generate_test_circuit(
builder);
266 typename TestFixture::Prover prover(prover_instance, verification_key);
267 prover.get_transcript()->enable_manifest();
268 auto proof = prover.construct_proof();
272 verifier_transcript->enable_manifest();
273 typename TestFixture::Verifier verifier(vk_and_hash, verifier_transcript);
274 [[maybe_unused]]
auto _ = verifier.verify_proof(proof);
277 auto prover_manifest = prover.get_transcript()->get_manifest();
278 auto verifier_manifest = verifier.get_transcript()->get_manifest();
281 ASSERT_GT(prover_manifest.size(), 0);
282 for (
size_t round = 0; round < prover_manifest.size(); ++round) {
283 ASSERT_EQ(prover_manifest[round], verifier_manifest[round])
284 <<
"Prover/Verifier manifest discrepency in round " << round;
297 auto transcript = TypeParam::Transcript::test_prover_init_empty();
299 std::vector<std::string> challenge_labels{
"a",
"b",
"c",
"d",
"e",
"f" };
300 auto challenges = transcript->template get_challenges<FF>(challenge_labels);
302 for (
size_t i = 0; i < challenges.size(); ++i) {
303 ASSERT_NE(challenges[i], 0) <<
"Challenge " << i <<
" is 0";
305 constexpr uint32_t random_val{ 17 };
306 transcript->send_to_verifier(
"random val", random_val);
308 challenge_labels = {
"a",
"b",
"c" };
309 challenges = transcript->template get_challenges<FF>(challenge_labels);
310 ASSERT_NE(challenges[0], 0) <<
"Challenge a is 0";
311 ASSERT_NE(challenges[1], 0) <<
"Challenge b is 0";
312 ASSERT_NE(challenges[2], 0) <<
"Challenge c is 0";
321 auto builder =
typename TestFixture::Builder();
322 TestFixture::generate_test_circuit(
builder);
328 typename TestFixture::Prover prover(prover_instance, verification_key);
329 auto proof = prover.construct_proof();
330 typename TestFixture::Verifier verifier(vk_and_hash);
331 EXPECT_TRUE(verifier.verify_proof(proof).result);
333 const size_t virtual_log_n =
Flavor::USE_PADDING ? Flavor::VIRTUAL_LOG_N : prover_instance->log_dyadic_size();
339 proof_structure.deserialize(
340 prover.get_transcript()->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
341 proof_structure.serialize(prover.get_transcript()->test_get_proof_data(), virtual_log_n);
343 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
345 typename TestFixture::Verifier verifier2(vk_and_hash);
346 EXPECT_TRUE(verifier2.verify_proof(proof).result);
348 Commitment one_group_val = Commitment::one();
350 proof_structure.z_perm_comm = one_group_val * rand_val;
351 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
353 typename TestFixture::Verifier verifier3(vk_and_hash);
354 EXPECT_TRUE(verifier3.verify_proof(proof).result);
356 proof_structure.serialize(prover.get_transcript()->test_get_proof_data(), virtual_log_n);
357 proof = TestFixture::export_serialized_proof(prover, prover_instance->num_public_inputs(), virtual_log_n);
359 typename TestFixture::Verifier verifier4(vk_and_hash);
360 EXPECT_FALSE(verifier4.verify_proof(proof).result);
362 proof_structure.deserialize(
363 prover.get_transcript()->test_get_proof_data(), verification_key->num_public_inputs, virtual_log_n);
364 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).
Child class of MegaFlavor that runs with ZK Sumcheck.
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