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);
101 for (
size_t i = 0; i < NUM_SUMCHECK_ROUNDS; ++i) {
106 manifest.
add_entry(2,
"Libra:concatenation_commitment", frs_per_G);
112 for (
size_t i = 0; i < LOG_MINI; ++i) {
123 for (
size_t i = LOG_MINI + 1; i < NUM_SUMCHECK_ROUNDS; ++i) {
130 const size_t eval_round = 3 + NUM_SUMCHECK_ROUNDS;
132 manifest.
add_entry(eval_round,
"Libra:claimed_evaluation", 1);
133 manifest.
add_entry(eval_round,
"Libra:grand_sum_commitment", frs_per_G);
134 manifest.
add_entry(eval_round,
"Libra:quotient_commitment", frs_per_G);
138 const size_t gemini_fold_round = eval_round + 1;
139 for (
size_t i = 1; i < NUM_SUMCHECK_ROUNDS; ++i) {
145 const size_t gemini_eval_round = gemini_fold_round + 1;
146 for (
size_t i = 1; i <= NUM_SUMCHECK_ROUNDS; ++i) {
150 manifest.
add_entry(gemini_eval_round,
"Libra:concatenation_eval", 1);
151 manifest.
add_entry(gemini_eval_round,
"Libra:shifted_grand_sum_eval", 1);
152 manifest.
add_entry(gemini_eval_round,
"Libra:grand_sum_eval", 1);
153 manifest.
add_entry(gemini_eval_round,
"Libra:quotient_eval", 1);
157 const size_t shplonk_round = gemini_eval_round + 1;
158 manifest.
add_entry(shplonk_round,
"Shplonk:Q", frs_per_G);
162 const size_t kzg_round = shplonk_round + 1;
163 manifest.
add_entry(kzg_round,
"KZG:W", frs_per_G);
170 static void add_random_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 1)
172 for (
size_t i = 0; i < count; i++) {
173 op_queue->random_op_ultra_only();
177 static void add_mixed_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 100)
182 for (
size_t i = 0; i < count; i++) {
183 op_queue->add_accumulate(P1);
184 op_queue->mul_accumulate(P2, z);
186 op_queue->eq_and_reset();
191 const Fq& evaluation_challenge_x,
192 const size_t circuit_size_parameter = 500)
197 op_queue->no_op_ultra_only();
205 return CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue };
209 const Fq& evaluation_challenge_x,
210 const Fq& batching_challenge_v)
215 auto initial_transcript = prover_transcript->export_proof();
219 verifier_transcript->template receive_from_prover<Fq>(
"init");
230 op_queue_commitments[0] =
231 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
232 op_queue_commitments[1] =
233 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
234 op_queue_commitments[2] =
235 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
236 op_queue_commitments[3] =
237 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
240 uint256_t accumulated_result = prover.get_accumulated_result();
245 evaluation_challenge_x,
246 batching_challenge_v,
248 op_queue_commitments);
252 return result.
pairing_points.check() && result.reduction_succeeded;
271 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
276 prover_transcript->export_proof();
298 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
301 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
302 EXPECT_TRUE(verified);
319 op_queue->no_op_ultra_only();
321 add_mixed_ops(op_queue, 100);
323 auto circuit_builder =
CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue,
true };
326 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
327 EXPECT_TRUE(verified);
344 prover_transcript->export_proof();
352 auto compare_computed_vk_against_fixed = [&](
size_t circuit_size_parameter) {
354 generate_test_circuit(batching_challenge_v, evaluation_challenge_x, circuit_size_parameter);
358 auto labels = TranslatorFlavor::VerificationKey::get_labels();
361 for (
auto [vk_commitment, fixed_commitment] :
zip_view(computed_vk.get_all(), fixed_vk.get_all())) {
362 if (vk_commitment != fixed_commitment) {
364 info(
"Commitment(uint256_t(\"0x", vk_commitment.x,
"\"),");
365 info(
" uint256_t(\"0x", vk_commitment.y,
"\")),");
367 EXPECT_EQ(vk_commitment, fixed_commitment) <<
"Mismatch at label: " << labels[
index];
371 EXPECT_EQ(computed_vk, fixed_vk);
375 const size_t circuit_size_parameter_1 = 1 << 2;
376 const size_t circuit_size_parameter_2 = 1 << 3;
378 compare_computed_vk_against_fixed(circuit_size_parameter_1);
379 compare_computed_vk_against_fixed(circuit_size_parameter_2);
384 if (computed_hash != hardcoded_hash) {
385 info(
"VK hash mismatch! Update TranslatorHardcodedVKAndHash::vk_hash() with:");
386 info(
"0x", computed_hash);
388 EXPECT_EQ(computed_hash, hardcoded_hash) <<
"Hardcoded VK hash does not match computed hash";
403 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
415 verifier_transcript->enable_manifest();
418 uint256_t accumulated_result = prover.get_accumulated_result();
422 op_queue_commitments[0] = proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
423 op_queue_commitments[1] =
424 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
425 op_queue_commitments[2] =
426 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
427 op_queue_commitments[3] =
428 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
433 evaluation_challenge_x,
434 batching_challenge_v,
436 op_queue_commitments);
442 auto expected_manifest = build_expected_translator_manifest();
443 auto verifier_manifest = verifier_transcript->get_manifest();
445 EXPECT_EQ(verifier_manifest, expected_manifest);
473 for (
auto& e : evals.get_all()) {
481 for (
auto& e : evals.get_minicircuit_wires()) {
482 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire overlaps with a previous entity";
484 EXPECT_EQ(covered.size(), Flavor::NUM_MINICIRCUIT_WIRES);
486 for (
auto& e : evals.get_minicircuit_wires_shifted()) {
487 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire shift overlaps with a previous entity";
489 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES);
491 for (
auto& e : evals.get_full_circuit_entities()) {
492 EXPECT_TRUE(covered.insert(&e).second) <<
"full-circuit entity overlaps with a previous entity";
494 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS);
497 for (
auto& e : evals.get_concatenated()) {
498 EXPECT_TRUE(covered.insert(&e).second) <<
"concatenated poly overlaps with a previous entity";
500 EXPECT_EQ(covered.size(),
501 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS +
502 Flavor::NUM_CONCATENATED_POLYS);
506 EXPECT_EQ(remaining, Flavor::NUM_COMPUTABLE_PRECOMPUTED);
509 for (
auto& e : evals.get_all()) {
510 if (covered.find(&e) == covered.end()) {
515 EXPECT_EQ(remaining, 0UL);
530 for (
auto& v : mid) {
536 for (
auto& v : full_circuit) {
541 std::vector<FF> challenge(Flavor::CONST_TRANSLATOR_LOG_N);
542 for (
auto& u : challenge) {
548 Flavor::set_minicircuit_evaluations(evals, mid);
549 Flavor::complete_full_circuit_evaluations(evals, full_circuit,
std::span<const FF>(challenge));
552 auto all = evals.get_all();
554 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.
static const size_t OP_QUEUE_SIZE
A base class labelling all entities (for instance, all of the polynomials used by the prover during s...
typename Curve::ScalarField FF
static constexpr size_t NUM_ALL_ENTITIES
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
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()