11#include <gtest/gtest.h>
25 vk.ordered_extra_range_constraints_numerator =
26 proving_key->commitment_key.commit(proving_key->polynomials.ordered_extra_range_constraints_numerator);
37 for (
const auto&
fr : frs) {
38 elements.push_back(
fr);
73 constexpr size_t frs_per_G = FrCodec::calc_num_fields<Flavor::Commitment>();
78 manifest.
add_entry(0,
"Gemini:masking_poly_comm", frs_per_G);
82 std::vector<std::string> wire_labels = {
83 "CONCATENATED_RANGE_CONSTRAINTS_0",
"CONCATENATED_RANGE_CONSTRAINTS_1",
84 "CONCATENATED_RANGE_CONSTRAINTS_2",
"CONCATENATED_RANGE_CONSTRAINTS_3",
85 "CONCATENATED_NON_RANGE",
86 "ORDERED_RANGE_CONSTRAINTS_0",
"ORDERED_RANGE_CONSTRAINTS_1",
87 "ORDERED_RANGE_CONSTRAINTS_2",
"ORDERED_RANGE_CONSTRAINTS_3",
88 "ORDERED_RANGE_CONSTRAINTS_4",
91 for (
const auto& label : wire_labels) {
99 manifest.
add_entry(1,
"Z_PERM", frs_per_G);
104 manifest.
add_entry(2,
"Libra:concatenation_commitment", frs_per_G);
110 for (
size_t i = 0; i < LOG_MINI; ++i) {
121 for (
size_t i = LOG_MINI + 1; i < NUM_SUMCHECK_ROUNDS; ++i) {
128 const size_t eval_round = 3 + NUM_SUMCHECK_ROUNDS;
130 manifest.
add_entry(eval_round,
"Libra:claimed_evaluation", 1);
131 manifest.
add_entry(eval_round,
"Libra:grand_sum_commitment", frs_per_G);
132 manifest.
add_entry(eval_round,
"Libra:quotient_commitment", frs_per_G);
136 const size_t gemini_fold_round = eval_round + 1;
137 for (
size_t i = 1; i < NUM_SUMCHECK_ROUNDS; ++i) {
143 const size_t gemini_eval_round = gemini_fold_round + 1;
144 for (
size_t i = 1; i <= NUM_SUMCHECK_ROUNDS; ++i) {
148 manifest.
add_entry(gemini_eval_round,
"Libra:concatenation_eval", 1);
149 manifest.
add_entry(gemini_eval_round,
"Libra:shifted_grand_sum_eval", 1);
150 manifest.
add_entry(gemini_eval_round,
"Libra:grand_sum_eval", 1);
151 manifest.
add_entry(gemini_eval_round,
"Libra:quotient_eval", 1);
155 const size_t shplonk_round = gemini_eval_round + 1;
156 manifest.
add_entry(shplonk_round,
"Shplonk:Q", frs_per_G);
160 const size_t kzg_round = shplonk_round + 1;
161 manifest.
add_entry(kzg_round,
"KZG:W", frs_per_G);
167 static void add_random_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 1)
169 for (
size_t i = 0; i < count; i++) {
170 op_queue->random_op_ultra_only();
174 static void add_mixed_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 100)
179 for (
size_t i = 0; i < count; i++) {
180 op_queue->add_accumulate(P1);
181 op_queue->mul_accumulate(P2, z);
183 op_queue->eq_and_reset();
188 const Fq& evaluation_challenge_x,
189 const size_t circuit_size_parameter = 500)
194 op_queue->construct_zk_columns();
199 op_queue->merge_fixed_append(op_queue->get_append_offset());
201 return CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue };
205 const Fq& evaluation_challenge_x,
206 const Fq& batching_challenge_v)
211 auto initial_transcript = prover_transcript->export_proof();
215 verifier_transcript->template receive_from_prover<Fq>(
"init");
226 op_queue_commitments[0] =
227 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
228 op_queue_commitments[1] =
229 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
230 op_queue_commitments[2] =
231 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
232 op_queue_commitments[3] =
233 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
236 uint256_t accumulated_result = prover.get_accumulated_result();
241 evaluation_challenge_x,
242 batching_challenge_v,
244 op_queue_commitments);
248 return result.
pairing_points.check() && result.reduction_succeeded;
267 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
272 prover_transcript->export_proof();
294 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
297 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
298 EXPECT_TRUE(verified);
316 op_queue->no_op_ultra_only();
318 add_mixed_ops(op_queue, 100);
320 auto circuit_builder =
CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue,
true };
323 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
324 EXPECT_TRUE(verified);
341 prover_transcript->export_proof();
349 auto compare_computed_vk_against_fixed = [&](
size_t circuit_size_parameter) {
351 generate_test_circuit(batching_challenge_v, evaluation_challenge_x, circuit_size_parameter);
355 auto labels = TranslatorFlavor::VerificationKey::get_labels();
358 for (
auto [vk_commitment, fixed_commitment] :
zip_view(computed_vk.get_all(), fixed_vk.get_all())) {
359 if (vk_commitment != fixed_commitment) {
361 info(
"Commitment(uint256_t(\"0x", vk_commitment.x,
"\"),");
362 info(
" uint256_t(\"0x", vk_commitment.y,
"\")),");
364 EXPECT_EQ(vk_commitment, fixed_commitment) <<
"Mismatch at label: " << labels[
index];
368 EXPECT_EQ(computed_vk, fixed_vk);
372 const size_t circuit_size_parameter_1 = 1 << 2;
373 const size_t circuit_size_parameter_2 = 1 << 3;
375 compare_computed_vk_against_fixed(circuit_size_parameter_1);
376 compare_computed_vk_against_fixed(circuit_size_parameter_2);
381 if (computed_hash != hardcoded_hash) {
382 info(
"VK hash mismatch! Update TranslatorHardcodedVKAndHash::vk_hash() with:");
383 info(
"0x", computed_hash);
385 EXPECT_EQ(computed_hash, hardcoded_hash) <<
"Hardcoded VK hash does not match computed hash";
400 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
412 verifier_transcript->enable_manifest();
415 uint256_t accumulated_result = prover.get_accumulated_result();
419 op_queue_commitments[0] = proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
420 op_queue_commitments[1] =
421 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
422 op_queue_commitments[2] =
423 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
424 op_queue_commitments[3] =
425 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
430 evaluation_challenge_x,
431 batching_challenge_v,
433 op_queue_commitments);
439 auto expected_manifest = build_expected_translator_manifest();
440 auto verifier_manifest = verifier_transcript->get_manifest();
442 EXPECT_EQ(verifier_manifest, expected_manifest);
470 for (
auto& e : evals.get_all()) {
478 for (
auto& e : evals.get_minicircuit_wires()) {
479 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire overlaps with a previous entity";
481 EXPECT_EQ(covered.size(), Flavor::NUM_MINICIRCUIT_WIRES);
483 for (
auto& e : evals.get_minicircuit_wires_shifted()) {
484 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire shift overlaps with a previous entity";
486 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES);
488 for (
auto& e : evals.get_full_circuit_entities()) {
489 EXPECT_TRUE(covered.insert(&e).second) <<
"full-circuit entity overlaps with a previous entity";
491 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS);
494 for (
auto& e : evals.get_concatenated()) {
495 EXPECT_TRUE(covered.insert(&e).second) <<
"concatenated poly overlaps with a previous entity";
497 EXPECT_EQ(covered.size(),
498 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS +
499 Flavor::NUM_CONCATENATED_POLYS);
503 EXPECT_EQ(remaining, Flavor::NUM_COMPUTABLE_PRECOMPUTED);
506 for (
auto& e : evals.get_all()) {
507 if (covered.find(&e) == covered.end()) {
512 EXPECT_EQ(remaining, 0UL);
533 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
538 auto pcs_unshifted = pk->proving_key->polynomials.get_pcs_unshifted();
539 auto pcs_to_be_shifted = pk->proving_key->polynomials.get_pcs_to_be_shifted();
542 const auto&
ck = pk->proving_key->commitment_key;
543 std::vector<Commitment> unshifted_comms;
544 for (
auto& poly : pcs_unshifted) {
545 unshifted_comms.push_back(
ck.commit(poly));
547 std::vector<Commitment> shifted_comms;
548 for (
auto& poly : pcs_to_be_shifted) {
549 shifted_comms.push_back(
ck.commit(poly));
553 std::vector<Commitment> commitments;
554 commitments.push_back(Commitment::one());
555 commitments.insert(commitments.end(), unshifted_comms.begin(), unshifted_comms.end());
556 commitments.insert(commitments.end(), shifted_comms.begin(), shifted_comms.end());
563 auto check_range = [&](
const auto& range,
const std::string& label) {
564 for (
size_t i = 0; i < range.count; i++) {
565 EXPECT_EQ(commitments[range.original_start +
offset + i], commitments[range.duplicate_start +
offset + i])
566 << label <<
" commitment mismatch at index " << i;
570 check_range(repeated.first,
"Range 1");
571 check_range(repeated.second,
"Range 2");
581 for (
auto& v : mid) {
587 for (
auto& v : full_circuit) {
592 std::vector<FF> challenge(Flavor::CONST_TRANSLATOR_LOG_N);
593 for (
auto& u : challenge) {
599 Flavor::set_minicircuit_evaluations(evals, mid);
600 Flavor::complete_full_circuit_evaluations(evals, full_circuit,
std::span<const FF>(challenge));
603 auto all = evals.get_all();
605 EXPECT_NE(all[i],
FF(0)) <<
"Entity " << i <<
" was not populated by verifier methods";
static bool prove_and_verify(const CircuitBuilder &circuit_builder, const Fq &evaluation_challenge_x, const Fq &batching_challenge_v)
static void add_random_ops(std::shared_ptr< bb::ECCOpQueue > &op_queue, size_t count=1)
Flavor::Commitment Commitment
static CircuitBuilder generate_test_circuit(const Fq &batching_challenge_v, const Fq &evaluation_challenge_x, const size_t circuit_size_parameter=500)
static void SetUpTestSuite()
static void add_mixed_ops(std::shared_ptr< bb::ECCOpQueue > &op_queue, size_t count=100)
static TranscriptManifest build_expected_translator_manifest()
Build the expected transcript manifest for Translator verification.
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
Manages ECC operations for the Goblin proving system.
A base class labelling all entities (for instance, all of the polynomials used by the prover during s...
static constexpr bool HasZK
typename Curve::ScalarField FF
static constexpr size_t NUM_ALL_ENTITIES
typename G1::affine_element Commitment
bb::CommitmentKey< Curve > CommitmentKey
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
Simple verification key class for fixed-size circuits (ECCVM, Translator, AVM).
static std::vector< fr > serialize_to_fields(const T &val)
Conversion from transcript values to bb::frs.
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.
TranslatorCircuitBuilder creates a circuit that evaluates the correctness of the evaluation of EccOpQ...
static constexpr size_t NUM_RANDOM_OPS_END
static constexpr size_t NUM_RANDOM_OPS_START
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static constexpr size_t NUM_FULL_CIRCUIT_EVALUATIONS
BaseTranscript< Codec, HashFunction > Transcript
static constexpr size_t CONST_TRANSLATOR_LOG_N
static constexpr size_t PROOF_LENGTH
TranslatorCircuitBuilder CircuitBuilder
Curve::AffineElement Commitment
static constexpr size_t NUM_MINICIRCUIT_EVALUATIONS
static constexpr size_t LOG_MINI_CIRCUIT_SIZE
HonkProof construct_proof()
Translator verifier class that verifies the proof of the Translator circuit.
ReductionResult reduce_to_pairing_check()
Reduce the translator proof to a pairing check.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
static affine_element random_element(numeric::RNG *engine=nullptr) noexcept
Samples a random point on the curve.
group_elements::affine_element< Fq, Fr, Params > affine_element
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.
field< Bn254FqParams > fq
TEST_F(IPATest, ChallengesAreZero)
field< Bn254FrParams > fr
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
static std::vector< Commitment > get_all()
PairingPoints pairing_points
static field random_element(numeric::RNG *engine=nullptr) noexcept
TranslatorFlavor::VerificationKey create_vk_from_proving_key(const std::shared_ptr< TranslatorFlavor::ProvingKey > &proving_key)
TranslatorFlavor::FF compute_translator_vk_hash()