diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp index d518e24aa6a1..ba38bae8827f 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_flavor.hpp @@ -598,9 +598,8 @@ class ECCVMFlavor { #endif { // compute rows for the three different sections of the ECCVM execution trace - // Note: the first operation (index 0) is always a hiding op with random Px, Py values - const auto transcript_rows = - ECCVMTranscriptBuilder::compute_rows(builder.op_queue->get_eccvm_ops(), builder.get_number_of_muls()); + const auto transcript_rows = ECCVMTranscriptBuilder::compute_rows( + builder.op_queue->get_eccvm_ops(), builder.get_number_of_muls(), builder.op_queue->get_is_zk()); const std::vector msms = builder.get_msms(); const auto point_table_rows = ECCVMPointTablePrecomputationBuilder::compute_rows(CircuitBuilder::get_flattened_scalar_muls(msms)); diff --git a/barretenberg/cpp/src/barretenberg/eccvm/transcript_builder.hpp b/barretenberg/cpp/src/barretenberg/eccvm/transcript_builder.hpp index 8964f5d08142..0accc8a2e67c 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/transcript_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/transcript_builder.hpp @@ -133,7 +133,8 @@ class ECCVMTranscriptBuilder { * @return A vector of TranscriptRows */ static std::vector compute_rows(const std::vector& vm_operations, - const uint32_t total_number_of_muls) + const uint32_t total_number_of_muls, + bool is_zk = true) { const size_t num_vm_entries = vm_operations.size(); // The transcript contains an extra zero row at the beginning and the accumulated state at the end @@ -173,7 +174,9 @@ class ECCVMTranscriptBuilder { // Handle hiding op (index 0) separately before the main loop. // The hiding op has random (non-curve) Px, Py values for ZK purposes - we skip EC computation // and just record the raw field elements. Uses opcode 3 (q_eq=1, q_reset=1). - { + // When is_zk=false, there is no hiding op and index 0 is a regular op processed by the main loop. + size_t main_loop_start = 0; + if (is_zk) { const ECCVMOperation& hiding_entry = vm_operations[0]; TranscriptRow& hiding_row = transcript_state[1]; @@ -189,12 +192,13 @@ class ECCVMTranscriptBuilder { msm_accumulator_trace[0] = Element::infinity(); intermediate_accumulator_trace[0] = Element::infinity(); msm_count_at_transition_inverse_trace[0] = 0; + main_loop_start = 1; } // during the first iteration over the ECCOpQueue, the operations are being performed using Jacobian (a.k.a. // projective) coordinates and the base point coordinates are recorded in the transcript. at the same time, the - // transcript logic is being populated (starting from index 1, since index 0 is the hiding op handled above) - for (size_t i = 1; i < num_vm_entries; i++) { + // transcript logic is being populated + for (size_t i = main_loop_start; i < num_vm_entries; i++) { TranscriptRow& row = transcript_state[i + 1]; const ECCVMOperation& entry = vm_operations[i]; diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp index 0bfa37ef6a86..bda0d945258e 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp @@ -11,7 +11,6 @@ #include "barretenberg/common/bb_bench.hpp" #include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp" #include "barretenberg/eccvm/eccvm_flavor.hpp" -#include "barretenberg/eccvm/eccvm_trace_checker.hpp" #include "barretenberg/eccvm/eccvm_verifier.hpp" #include "barretenberg/goblin/goblin_verifier.hpp" #include "barretenberg/goblin/merge_verifier.hpp" @@ -39,7 +38,6 @@ void Goblin::prove_eccvm() // Scope the builder so it (and any circuit data) is freed before proving ECCVMProver eccvm_prover = [&]() { ECCVMBuilder eccvm_builder(op_queue); - info("ECCVM STATUS: ", ECCVMTraceChecker::check(eccvm_builder)); return ECCVMProver(eccvm_builder, transcript); }(); auto [eccvm_proof, opening_claim] = eccvm_prover.construct_proof(); diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index 543e78266051..6cd85564cf55 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -30,6 +30,9 @@ class Goblin { bool avm_mode = false; public: + void set_avm_mode(bool mode) { avm_mode = mode; } + void set_op_queue_zk(bool is_zk) { op_queue->set_is_zk(is_zk); } + using MegaBuilder = MegaCircuitBuilder; using Fr = bb::fr; using Transcript = NativeTranscript; diff --git a/barretenberg/cpp/src/barretenberg/op_queue/ecc_op_queue.hpp b/barretenberg/cpp/src/barretenberg/op_queue/ecc_op_queue.hpp index cc65245fd48b..20282f55f542 100644 --- a/barretenberg/cpp/src/barretenberg/op_queue/ecc_op_queue.hpp +++ b/barretenberg/cpp/src/barretenberg/op_queue/ecc_op_queue.hpp @@ -60,10 +60,11 @@ class ECCOpQueue { // Tracks number of muls and size of eccvm in real time as the op queue is updated EccvmRowTracker eccvm_row_tracker; - bool is_zk = false; + bool is_zk = true; public: void set_is_zk(bool _is_zk) { is_zk = _is_zk; } + bool get_is_zk() const { return is_zk; } static const size_t OP_QUEUE_SIZE = 1 << CONST_OP_QUEUE_LOG_SIZE; /** @@ -157,15 +158,6 @@ class ECCOpQueue { throw_or_abort("Hiding op must be set before calling get_eccvm_ops()"); } eccvm_ops_reconstructed.insert(eccvm_ops_reconstructed.begin(), hiding_op_for_eccvm); - } else { - // Point base_point; - // base_point.x = Fq(0); - // base_point.y = Fq(0); - - // ECCVMOperation eccvm_ops = - // ECCVMOperation{ .op_code = { .eq = true, .reset = true }, .base_point = base_point }; - - // eccvm_ops_reconstructed.insert(eccvm_ops_reconstructed.begin(), eccvm_ops); } } return eccvm_ops_reconstructed; @@ -316,10 +308,6 @@ class ECCOpQueue { { auto expected = accumulator; accumulator.self_set_infinity(); - if (expected.is_point_at_infinity()) { - expected.x = Fq(0); - expected.y = Fq(0); - } EccOpCode op_code{ .eq = true, .reset = true }; // Store eccvm operation append_eccvm_op(ECCVMOperation{ .op_code = op_code, .base_point = expected });