13#include <gtest/gtest.h>
21template <
typename Flavor>
class ProtogalaxyTests :
public testing::Test {
54 static void test_full_honk_evaluations_valid_circuit()
63 for (
auto& alpha : prover_inst->alphas) {
64 alpha = FF::random_element();
66 PGInternal pg_internal;
67 auto full_honk_evals = pg_internal.compute_row_evaluations(
68 prover_inst->polynomials, prover_inst->alphas, prover_inst->relation_parameters);
71 for (
const auto& eval : full_honk_evals.coeffs()) {
72 EXPECT_EQ(eval,
FF(0));
81 static void test_pertubator_coefficients()
83 std::vector<FF> betas = {
FF(5),
FF(8),
FF(11) };
84 std::vector<FF> deltas = {
FF(2),
FF(4),
FF(8) };
85 std::vector<FF> full_honk_evaluations = {
FF(1),
FF(1),
FF(1),
FF(1),
FF(1),
FF(1),
FF(1),
FF(1) };
86 Polynomial honk_evaluations_poly(full_honk_evaluations.size());
87 for (
auto [poly_val, val] :
zip_view(honk_evaluations_poly.coeffs(), full_honk_evaluations)) {
91 std::vector<FF> expected_values = {
FF(648),
FF(936),
FF(432),
FF(64) };
92 EXPECT_EQ(perturbator.size(), 4);
93 for (
size_t i = 0; i < perturbator.size(); i++) {
94 EXPECT_EQ(perturbator[i], expected_values[i]);
103 static void test_pertubator_polynomial()
106 const size_t log_size(3);
107 const size_t size(1 << log_size);
110 for (
auto& poly : full_polynomials.get_all()) {
115 SubrelationSeparators alphas;
116 for (
auto& alpha : alphas) {
117 alpha = FF::random_element();
120 PGInternal pg_internal;
121 auto full_honk_evals = pg_internal.compute_row_evaluations(full_polynomials, alphas, relation_parameters);
122 std::vector<FF> betas(log_size);
123 for (
size_t idx = 0; idx < log_size; idx++) {
124 betas[idx] = FF::random_element();
131 auto target_sum =
FF(0);
132 for (
size_t i = 0; i < size; i++) {
133 target_sum += full_honk_evals[i] * gate_separators[i];
137 accumulator->polynomials =
std::move(full_polynomials);
138 accumulator->set_dyadic_size(1 << log_size);
139 accumulator->gate_challenges = betas;
140 accumulator->target_sum = target_sum;
141 accumulator->relation_parameters = relation_parameters;
142 accumulator->alphas = alphas;
144 std::vector<FF> deltas(log_size);
145 for (
size_t idx = 0; idx < log_size; idx++) {
146 deltas[idx] = FF::random_element();
148 auto perturbator = pg_internal.compute_perturbator(accumulator, deltas);
151 EXPECT_EQ(perturbator[0], target_sum);
159 static void test_combiner_quotient()
161 auto perturbator_evaluation =
FF(2);
162 auto combiner =
bb::Univariate<FF, 12>(
std::array<FF, 12>{ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 });
168 (
FF(22) - (
FF(1) -
FF(2)) * perturbator_evaluation) / (
FF(2) *
FF(2 - 1)),
169 (
FF(23) - (
FF(1) -
FF(3)) * perturbator_evaluation) / (
FF(3) *
FF(3 - 1)),
170 (
FF(24) - (
FF(1) -
FF(4)) * perturbator_evaluation) / (
FF(4) *
FF(4 - 1)),
171 (
FF(25) - (
FF(1) -
FF(5)) * perturbator_evaluation) / (
FF(5) *
FF(5 - 1)),
172 (
FF(26) - (
FF(1) -
FF(6)) * perturbator_evaluation) / (
FF(6) *
FF(6 - 1)),
173 (
FF(27) - (
FF(1) -
FF(7)) * perturbator_evaluation) / (
FF(7) *
FF(7 - 1)),
174 (
FF(28) - (
FF(1) -
FF(8)) * perturbator_evaluation) / (
FF(8) *
FF(8 - 1)),
175 (
FF(29) - (
FF(1) -
FF(9)) * perturbator_evaluation) / (
FF(9) *
FF(9 - 1)),
176 (
FF(30) - (
FF(1) -
FF(10)) * perturbator_evaluation) / (
FF(10) *
FF(10 - 1)),
177 (
FF(31) - (
FF(1) -
FF(11)) * perturbator_evaluation) / (
FF(11) *
FF(11 - 1)),
180 for (
size_t idx = 2; idx < 7; idx++) {
181 EXPECT_EQ(combiner_quotient.
value_at(idx), expected_evals.value_at(idx));
190 static void test_compute_extended_relation_parameters()
195 pk_1->relation_parameters.eta = 1;
198 builder2.add_variable(3);
201 pk_2->relation_parameters.eta = 3;
203 ProverInstances pks{ { pk_1, pk_2 } };
204 auto relation_parameters_no_optimistic_skipping = PGInternal::template compute_extended_relation_parameters<
206 auto relation_parameters = PGInternal::template compute_extended_relation_parameters<
209 bb::Univariate<FF, 11> expected_eta{ { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 } };
210 EXPECT_EQ(relation_parameters_no_optimistic_skipping.eta, expected_eta);
213 for (
size_t i = 0; i < 11; i++) {
214 EXPECT_EQ(relation_parameters.eta.evaluations[i], expected_eta.evaluations[i]);
222 static void test_compute_and_extend_alphas()
227 pk_1->alphas.fill(2);
230 builder2.add_variable(3);
233 pk_2->alphas.fill(4);
235 ProverInstances pks{ { pk_1, pk_2 } };
238 bb::Univariate<FF, 12> expected_alphas{ { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 } };
239 for (
const auto& alpha : alphas) {
240 EXPECT_EQ(alpha, expected_alphas);
249 static void test_protogalaxy_inhomogeneous()
251 auto check_fold_and_decide = [](
Builder& circuit_1,
Builder& circuit_2) {
258 auto [prover_accumulator, verifier_accumulator] =
260 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
277 check_fold_and_decide(builder1, builder2);
292 check_fold_and_decide(builder1, builder2);
307 check_fold_and_decide(builder1, builder2);
315 static void test_protogalaxy_bad_lookup_failure()
328 for (
auto& wire_3_witness_idx : builder1.blocks.lookup.w_o()) {
329 if (wire_3_witness_idx != builder1.zero_idx()) {
330 wire_3_witness_idx = builder1.zero_idx();
341 auto [prover_accumulator, verifier_accumulator] =
345 EXPECT_FALSE(check_accumulator_target_sum_manual(prover_accumulator));
353 static void test_full_protogalaxy()
356 auto [prover_accumulator, verifier_accumulator] =
358 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
361 auto [prover_accumulator_2, verifier_accumulator_2] =
363 VerifierInstances{ verifier_accumulator, get<1>(insts_2)[0] });
364 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator_2));
373 static void test_full_protogalaxy_structured_trace()
375 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS };
378 auto [prover_accumulator, verifier_accumulator] =
380 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
384 auto [prover_accumulator_2, verifier_accumulator_2] =
386 VerifierInstances{ verifier_accumulator, get<1>(keys_2)[0] });
387 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator_2));
388 info(prover_accumulator_2->dyadic_size());
399 static void test_fold_with_virtual_size_expansion()
401 uint32_t overflow_capacity = 0;
402 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS, overflow_capacity };
405 ProverInstances prover_insts;
406 VerifierInstances verifier_insts;
409 const std::vector<size_t> log2_num_gates = { 14, 18 };
410 for (
size_t i = 0; i < 2; ++i) {
420 prover_insts[i] = prover_instance;
421 verifier_insts[i] = verifier_instance;
425 EXPECT_TRUE(prover_insts[0]->dyadic_size() < prover_insts[1]->dyadic_size());
428 const auto [prover_accumulator, verifier_accumulator] =
430 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
440 static void test_full_protogalaxy_structured_trace_inhomogeneous_circuits()
458 auto [prover_accumulator, verifier_accumulator] =
460 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
467 auto [prover_accumulator_2, verifier_accumulator_2] =
469 VerifierInstances{ verifier_accumulator, get<1>(keys_2)[0] });
470 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator_2));
471 info(prover_accumulator_2->dyadic_size());
481 static void test_tampered_commitment()
484 auto [prover_accumulator, verifier_accumulator] =
486 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
489 verifier_accumulator->witness_commitments.w_l = Projective(Affine::random_element());
492 auto [prover_accumulator_2, verifier_accumulator_2] =
494 VerifierInstances{ verifier_accumulator, get<1>(insts_2)[0] });
495 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator_2));
505 static void test_tampered_accumulator_polynomial()
508 auto [prover_accumulator, verifier_accumulator] =
510 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
513 prover_accumulator->polynomials.w_l.at(1) = FF::random_element();
514 EXPECT_FALSE(check_accumulator_target_sum_manual(prover_accumulator));
517 auto [prover_accumulator_2, verifier_accumulator_2] =
519 VerifierInstances{ verifier_accumulator, get<1>(insts_2)[0] });
521 EXPECT_EQ(prover_accumulator_2->target_sum == verifier_accumulator_2->target_sum,
false);
525 template <
size_t k>
static void test_fold_k_key_pairs()
527 constexpr size_t total_insts = k + 1;
533 auto [prover_accumulator, folding_proof] = folding_prover.prove();
534 auto verifier_accumulator = folding_verifier.verify_folding_proof(folding_proof);
535 EXPECT_TRUE(check_accumulator_target_sum_manual(prover_accumulator));
546 TestFixture::test_pertubator_coefficients();
551 TestFixture::test_full_honk_evaluations_valid_circuit();
556 TestFixture::test_pertubator_polynomial();
561 TestFixture::test_combiner_quotient();
566 TestFixture::test_compute_extended_relation_parameters();
571 TestFixture::test_compute_and_extend_alphas();
576 TestFixture::test_protogalaxy_inhomogeneous();
581 TestFixture::test_full_protogalaxy();
586 TestFixture::test_full_protogalaxy_structured_trace();
591 TestFixture::test_fold_with_virtual_size_expansion();
594TYPED_TEST(ProtogalaxyTests, FullProtogalaxyStructuredTraceInhomogeneous)
596 TestFixture::test_full_protogalaxy_structured_trace_inhomogeneous_circuits();
601 TestFixture::test_tampered_commitment();
607 TestFixture::test_tampered_accumulator_polynomial();
612 TestFixture::test_protogalaxy_bad_lookup_failure();
619 TestFixture::template test_fold_k_key_pairs<1>();
#define BB_DISABLE_ASSERTS()
CommitmentKey object over a pairing group 𝔾₁.
A container for the prover polynomials.
WitnessEntities< Commitment > WitnessCommitments
A container for the witness commitments.
bb::CommitmentKey< Curve > CommitmentKey
std::array< FF, NUM_SUBRELATIONS - 1 > SubrelationSeparators
Curve::Element GroupElement
bb::Polynomial< FF > Polynomial
Curve::AffineElement Commitment
static void add_arithmetic_gates_with_public_inputs(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates (with public inputs) to the provided circuit.
static void add_lookup_gates(Builder &builder, size_t num_iterations=1)
Add lookup gates using the uint32 XOR lookup table (table size 4096)
static void add_arithmetic_gates(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates to the provided circuit.
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
bb::RelationParameters< Univariate< FF, EXTENDED_LENGTH, 0, SKIP_COUNT > > UnivariateRelationParameters
A purely static class (never add state to this!) consisting of functions used by the Protogalaxy prov...
static UnivariateSubrelationSeparators compute_and_extend_alphas(const ProverInstances &instances)
Combine the relation batching parameters (alphas) from each prover instance into a univariate for the...
static std::vector< FF > construct_perturbator_coefficients(std::span< const FF > betas, std::span< const FF > deltas, const Polynomial< FF > &full_honk_evaluations)
Construct the perturbator polynomial F(X) coefficients in O(n) time using binary tree reduction.
static Univariate< FF, BATCHED_EXTENDED_LENGTH, NUM_INSTANCES > compute_combiner_quotient(FF perturbator_evaluation, ExtendedUnivariateWithRandomization combiner)
Compute the combiner quotient defined as $K$ polynomial in the paper specialised for only folding two...
bb::RelationParameters< Univariate< FF, EXTENDED_LENGTH > > UnivariateRelationParametersNoOptimisticSkipping
std::array< std::shared_ptr< VerifierInstance >, NUM_INSTANCES > VerifierInstances
typename Flavor::VerificationKey VerificationKey
static void create_function_circuit(Builder &builder, const size_t &log_num_gates=9, const size_t &log_num_gates_with_public_inputs=9)
Create a circuit with the specified number of arithmetic gates and arithmetic gates with public input...
DeciderProver_< Flavor > DeciderProver
ProtogalaxyVerifier_< VerifierInstance > FoldingVerifier
static FoldingData fold_and_verify(const ProverInstances &prover_instances, const VerifierInstances &verification_keys, ExecutionTraceUsageTracker trace_usage_tracker=ExecutionTraceUsageTracker{}, bool hash_accumulator=false)
Fold two prover instances and generate folded verifier by running the PG verifier.
ProtogalaxyProver_< Flavor > FoldingProver
std::array< std::shared_ptr< ProverInstance >, NUM_INSTANCES > ProverInstances
DeciderVerifier_< Flavor > DeciderVerifier
std::tuple< ProverInstances, VerifierInstances > TupleOfKeys
static bool run_decider(const std::shared_ptr< ProverInstance > &prover_accumulator, const std::shared_ptr< VerifierInstance > &verifier_accumulator)
Run the decider on the given accumulator.
static void construct_instances_and_add_to_tuple(TupleOfKeys &keys, Builder &builder, size_t idx=0, TraceSettings trace_settings=TraceSettings{})
Construct Prover and Verifier instances for a provided circuit and add to tuple.
Flavor::CircuitBuilder Builder
VerifierInstance_< Flavor > VerifierInstance
static TupleOfKeys construct_instances(size_t num_keys, TraceSettings trace_settings=TraceSettings{}, bool circuits_of_different_size=false)
Construct a given number of Prover and Verifier instances.
ProverInstance_< Flavor > ProverInstance
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
A univariate polynomial represented by its values on {domain_start, domain_start + 1,...
static void complete_prover_instance_for_test(const std::shared_ptr< ProverInstance_< Flavor > > &prover_inst)
TEST only method for completing computation of the prover polynomials using random challenges.
typename ECCVMFlavor::ProverPolynomials ProverPolynomials
UltraKeccakFlavor::VerificationKey VerificationKey
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
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(ShpleminiTest, TestSettings)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Tracks the cumulative usage of the execution trace across a series of circuits.
void update(const Builder &circuit)
Implementation of the methods for the -polynomials used in in Sumcheck.
Container for parameters used by the grand product (permutation, lookup) Honk relations.
static RelationParameters get_random()
static void add_default_to_public_inputs(Builder &builder)
Adds default public inputs to the builder.