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);
169 static void add_random_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 1)
171 for (
size_t i = 0; i < count; i++) {
172 op_queue->random_op_ultra_only();
176 static void add_mixed_ops(std::shared_ptr<bb::ECCOpQueue>& op_queue,
size_t count = 100)
181 for (
size_t i = 0; i < count; i++) {
182 op_queue->add_accumulate(P1);
183 op_queue->mul_accumulate(P2, z);
185 op_queue->eq_and_reset();
190 const Fq& evaluation_challenge_x,
191 const size_t circuit_size_parameter = 500)
196 op_queue->no_op_ultra_only();
204 return CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue };
208 const Fq& evaluation_challenge_x,
209 const Fq& batching_challenge_v)
214 auto initial_transcript = prover_transcript->export_proof();
218 verifier_transcript->template receive_from_prover<Fq>(
"init");
229 op_queue_commitments[0] =
230 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
231 op_queue_commitments[1] =
232 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
233 op_queue_commitments[2] =
234 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
235 op_queue_commitments[3] =
236 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
239 uint256_t accumulated_result = prover.get_accumulated_result();
244 evaluation_challenge_x,
245 batching_challenge_v,
247 op_queue_commitments);
251 return result.
pairing_points.check() && result.reduction_succeeded;
270 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
275 prover_transcript->export_proof();
297 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
300 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
301 EXPECT_TRUE(verified);
318 op_queue->no_op_ultra_only();
320 add_mixed_ops(op_queue, 100);
322 auto circuit_builder =
CircuitBuilder{ batching_challenge_v, evaluation_challenge_x, op_queue,
true };
325 bool verified = prove_and_verify(circuit_builder, evaluation_challenge_x, batching_challenge_v);
326 EXPECT_TRUE(verified);
343 prover_transcript->export_proof();
351 auto compare_computed_vk_against_fixed = [&](
size_t circuit_size_parameter) {
353 generate_test_circuit(batching_challenge_v, evaluation_challenge_x, circuit_size_parameter);
357 auto labels = TranslatorFlavor::VerificationKey::get_labels();
360 for (
auto [vk_commitment, fixed_commitment] :
zip_view(computed_vk.get_all(), fixed_vk.get_all())) {
361 if (vk_commitment != fixed_commitment) {
363 info(
"Commitment(uint256_t(\"0x", vk_commitment.x,
"\"),");
364 info(
" uint256_t(\"0x", vk_commitment.y,
"\")),");
366 EXPECT_EQ(vk_commitment, fixed_commitment) <<
"Mismatch at label: " << labels[
index];
370 EXPECT_EQ(computed_vk, fixed_vk);
374 const size_t circuit_size_parameter_1 = 1 << 2;
375 const size_t circuit_size_parameter_2 = 1 << 3;
377 compare_computed_vk_against_fixed(circuit_size_parameter_1);
378 compare_computed_vk_against_fixed(circuit_size_parameter_2);
383 if (computed_hash != hardcoded_hash) {
384 info(
"VK hash mismatch! Update TranslatorHardcodedVKAndHash::vk_hash() with:");
385 info(
"0x", computed_hash);
387 EXPECT_EQ(computed_hash, hardcoded_hash) <<
"Hardcoded VK hash does not match computed hash";
402 CircuitBuilder circuit_builder = generate_test_circuit(batching_challenge_v, evaluation_challenge_x);
414 verifier_transcript->enable_manifest();
417 uint256_t accumulated_result = prover.get_accumulated_result();
421 op_queue_commitments[0] = proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.op);
422 op_queue_commitments[1] =
423 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_lo_y_hi);
424 op_queue_commitments[2] =
425 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.x_hi_z_1);
426 op_queue_commitments[3] =
427 proving_key->proving_key->commitment_key.commit(proving_key->proving_key->polynomials.y_lo_z_2);
432 evaluation_challenge_x,
433 batching_challenge_v,
435 op_queue_commitments);
441 auto expected_manifest = build_expected_translator_manifest();
442 auto verifier_manifest = verifier_transcript->get_manifest();
444 EXPECT_EQ(verifier_manifest, expected_manifest);
472 for (
auto& e : evals.get_all()) {
480 for (
auto& e : evals.get_minicircuit_wires()) {
481 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire overlaps with a previous entity";
483 EXPECT_EQ(covered.size(), Flavor::NUM_MINICIRCUIT_WIRES);
485 for (
auto& e : evals.get_minicircuit_wires_shifted()) {
486 EXPECT_TRUE(covered.insert(&e).second) <<
"minicircuit wire shift overlaps with a previous entity";
488 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES);
490 for (
auto& e : evals.get_full_circuit_entities()) {
491 EXPECT_TRUE(covered.insert(&e).second) <<
"full-circuit entity overlaps with a previous entity";
493 EXPECT_EQ(covered.size(), 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS);
496 for (
auto& e : evals.get_concatenated()) {
497 EXPECT_TRUE(covered.insert(&e).second) <<
"concatenated poly overlaps with a previous entity";
499 EXPECT_EQ(covered.size(),
500 2 * Flavor::NUM_MINICIRCUIT_WIRES + Flavor::NUM_FULL_CIRCUIT_EVALUATIONS +
501 Flavor::NUM_CONCATENATED_POLYS);
505 EXPECT_EQ(remaining, Flavor::NUM_COMPUTABLE_PRECOMPUTED);
508 for (
auto& e : evals.get_all()) {
509 if (covered.find(&e) == covered.end()) {
514 EXPECT_EQ(remaining, 0UL);
529 for (
auto& v : mid) {
535 for (
auto& v : full_circuit) {
540 std::vector<FF> challenge(Flavor::CONST_TRANSLATOR_LOG_N);
541 for (
auto& u : challenge) {
547 Flavor::set_minicircuit_evaluations(evals, mid);
548 Flavor::complete_full_circuit_evaluations(evals, full_circuit,
std::span<const FF>(challenge));
551 auto all = evals.get_all();
553 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()