From d9cbdc888d467ade8add5c3c03a1759dddbb398a Mon Sep 17 00:00:00 2001
From: maramihali <mara@aztecprotocol.com>
Date: Tue, 12 Mar 2024 20:15:31 +0000
Subject: [PATCH] refactor:  interaction for a mock first circuit handled
 inside the `EccOpQueue` (#4854)

Closes https://github.com/AztecProtocol/barretenberg/issues/723.

Because of issues with handling zero-commitments, we need to populate
the `EccOpQueue` with some mock ops from a first circuit in order for
the first merge prover to work without problems. This was done
client-side which required manually calling either
`GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit`
or `op_queue->populate_with_mock_initital_data` (two functions for the
same purpose) everywhere goblin and the merge protocol is used/tested.
This PR ensures only
`GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit`
is used across the codebase since it's the one updating both `ultra_ops`
and `raw_ops`, removing the other function, and isolates mocking inside
the Goblin class so it doesn't have to be done in benchmarks.

Note: tried to isolate it inside EccOpQueue, which is possible but then
requires us to have an op_offset (from which non-mocked operations
start) which complicates some code and tests unnecessarily.
---
 barretenberg/cpp/src/barretenberg/bb/main.cpp | 28 +++++-----
 .../benchmark/goblin_bench/goblin.bench.cpp   | 18 ++-----
 .../barretenberg/client_ivc/client_ivc.cpp    | 15 ++----
 .../barretenberg/client_ivc/client_ivc.hpp    |  2 -
 .../cpp/src/barretenberg/goblin/goblin.hpp    |  7 +++
 .../goblin/goblin_recursion.test.cpp          |  7 ++-
 .../src/barretenberg/goblin/mock_circuits.hpp | 13 ++---
 .../goblin/mock_circuits_pinning.test.cpp     |  6 ++-
 .../proof_system/op_queue/ecc_op_queue.hpp    | 24 ---------
 .../honk/verifier/goblin_verifier.test.cpp    |  6 ++-
 .../honk/verifier/merge_verifier.test.cpp     |  8 ++-
 .../ultra_honk/databus_composer.test.cpp      |  4 +-
 .../ultra_honk/goblin_ultra_composer.test.cpp | 52 ++++---------------
 13 files changed, 68 insertions(+), 122 deletions(-)

diff --git a/barretenberg/cpp/src/barretenberg/bb/main.cpp b/barretenberg/cpp/src/barretenberg/bb/main.cpp
index a08bf91a12b..6a0421da4b0 100644
--- a/barretenberg/cpp/src/barretenberg/bb/main.cpp
+++ b/barretenberg/cpp/src/barretenberg/bb/main.cpp
@@ -140,6 +140,13 @@ bool proveAndVerify(const std::string& bytecodePath, const std::string& witnessP
  */
 bool accumulateAndVerifyGoblin(const std::string& bytecodePath, const std::string& witnessPath)
 {
+    // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): Don't hardcode dyadic circuit size. Currently set
+    // to max circuit size present in acir tests suite.
+    size_t hardcoded_bn254_dyadic_size_hack = 1 << 19;
+    init_bn254_crs(hardcoded_bn254_dyadic_size_hack);
+    size_t hardcoded_grumpkin_dyadic_size_hack = 1 << 10; // For eccvm only
+    init_grumpkin_crs(hardcoded_grumpkin_dyadic_size_hack);
+
     // Populate the acir constraint system and witness from gzipped data
     auto constraint_system = get_constraint_system(bytecodePath);
     auto witness = get_witness(witnessPath);
@@ -148,13 +155,6 @@ bool accumulateAndVerifyGoblin(const std::string& bytecodePath, const std::strin
     acir_proofs::GoblinAcirComposer acir_composer;
     acir_composer.create_circuit(constraint_system, witness);
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): Don't hardcode dyadic circuit size. Currently set
-    // to max circuit size present in acir tests suite.
-    size_t hardcoded_bn254_dyadic_size_hack = 1 << 19;
-    init_bn254_crs(hardcoded_bn254_dyadic_size_hack);
-    size_t hardcoded_grumpkin_dyadic_size_hack = 1 << 10; // For eccvm only
-    init_grumpkin_crs(hardcoded_grumpkin_dyadic_size_hack);
-
     // Call accumulate to generate a GoblinUltraHonk proof
     auto proof = acir_composer.accumulate();
 
@@ -179,6 +179,13 @@ bool accumulateAndVerifyGoblin(const std::string& bytecodePath, const std::strin
  */
 bool proveAndVerifyGoblin(const std::string& bytecodePath, const std::string& witnessPath)
 {
+    // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): Don't hardcode dyadic circuit size. Currently set
+    // to max circuit size present in acir tests suite.
+    size_t hardcoded_bn254_dyadic_size_hack = 1 << 19;
+    init_bn254_crs(hardcoded_bn254_dyadic_size_hack);
+    size_t hardcoded_grumpkin_dyadic_size_hack = 1 << 10; // For eccvm only
+    init_grumpkin_crs(hardcoded_grumpkin_dyadic_size_hack);
+
     // Populate the acir constraint system and witness from gzipped data
     auto constraint_system = get_constraint_system(bytecodePath);
     auto witness = get_witness(witnessPath);
@@ -187,13 +194,6 @@ bool proveAndVerifyGoblin(const std::string& bytecodePath, const std::string& wi
     acir_proofs::GoblinAcirComposer acir_composer;
     acir_composer.create_circuit(constraint_system, witness);
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/811): Don't hardcode dyadic circuit size. Currently set
-    // to max circuit size present in acir tests suite.
-    size_t hardcoded_bn254_dyadic_size_hack = 1 << 19;
-    init_bn254_crs(hardcoded_bn254_dyadic_size_hack);
-    size_t hardcoded_grumpkin_dyadic_size_hack = 1 << 10; // For eccvm only
-    init_grumpkin_crs(hardcoded_grumpkin_dyadic_size_hack);
-
     // Generate a GoblinUltraHonk proof and a full Goblin proof
     auto proof = acir_composer.accumulate_and_prove();
 
diff --git a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp
index 92f36e885f0..0c9760933b9 100644
--- a/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp
+++ b/barretenberg/cpp/src/barretenberg/benchmark/goblin_bench/goblin.bench.cpp
@@ -48,7 +48,10 @@ class GoblinBench : public benchmark::Fixture {
             // Construct and accumulate the mock kernel circuit
             // Note: in first round, kernel_accum is empty since there is no previous kernel to recursively verify
             GoblinUltraCircuitBuilder circuit_builder{ goblin.op_queue };
-            GoblinMockCircuits::construct_mock_recursion_kernel_circuit(circuit_builder, function_accum, kernel_accum);
+            GoblinMockCircuits::construct_mock_recursion_kernel_circuit(
+                circuit_builder,
+                { function_accum.proof, function_accum.verification_key },
+                { kernel_accum.proof, kernel_accum.verification_key });
             kernel_accum = goblin.accumulate(circuit_builder);
         }
     }
@@ -62,10 +65,6 @@ BENCHMARK_DEFINE_F(GoblinBench, GoblinFull)(benchmark::State& state)
 {
     Goblin goblin;
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723): Simply populate the OpQueue with some data
-    // and corresponding commitments so the merge protocol has "prev" data into which it can accumulate
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-
     for (auto _ : state) {
         BB_REPORT_OP_COUNT_IN_BENCH(state);
         // Perform a specified number of iterations of function/kernel accumulation
@@ -84,9 +83,6 @@ BENCHMARK_DEFINE_F(GoblinBench, GoblinAccumulate)(benchmark::State& state)
 {
     Goblin goblin;
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723)
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-
     // Perform a specified number of iterations of function/kernel accumulation
     for (auto _ : state) {
         perform_goblin_accumulation_rounds(state, goblin);
@@ -101,9 +97,6 @@ BENCHMARK_DEFINE_F(GoblinBench, GoblinECCVMProve)(benchmark::State& state)
 {
     Goblin goblin;
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723)
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-
     // Perform a specified number of iterations of function/kernel accumulation
     perform_goblin_accumulation_rounds(state, goblin);
 
@@ -121,9 +114,6 @@ BENCHMARK_DEFINE_F(GoblinBench, GoblinTranslatorProve)(benchmark::State& state)
 {
     Goblin goblin;
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723)
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-
     // Perform a specified number of iterations of function/kernel accumulation
     perform_goblin_accumulation_rounds(state, goblin);
 
diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp
index 69408f8aee9..eef0001e0c2 100644
--- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp
+++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp
@@ -2,12 +2,6 @@
 
 namespace bb {
 
-ClientIVC::ClientIVC()
-{
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723):
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-}
-
 /**
  * @brief Initialize the IVC with a first circuit
  * @details Initializes the accumulator and performs the initial goblin merge
@@ -83,6 +77,9 @@ HonkProof ClientIVC::decider_prove() const
  * recursive merge verifier), initial kernel verification key (with recursive merge verifier appended, no previous
  * kernel to fold), "full" kernel verification key( two recursive folding verifiers and merge verifier).
  *
+ * TODO(https://github.com/AztecProtocol/barretenberg/issues/904): This function should ultimately be moved outside of
+ * this class since it's used only for testing and benchmarking purposes and it requires us to clear state afterwards.
+ * (e.g. in the Goblin object)
  */
 void ClientIVC::precompute_folding_verification_keys()
 {
@@ -125,10 +122,8 @@ void ClientIVC::precompute_folding_verification_keys()
 
     vks.kernel_vk = std::make_shared<VerificationKey>(prover_instance->proving_key);
 
-    // Clean the ivc state
-    goblin.op_queue = std::make_shared<Goblin::OpQueue>();
-    goblin.merge_proof_exists = false;
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
+    // Clean the Goblin state (reinitialise op_queue with mocking and clear merge proofs)
+    goblin = Goblin();
 }
 
 } // namespace bb
\ No newline at end of file
diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp
index 1d26519f323..f2e0ee309c3 100644
--- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp
+++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp
@@ -63,8 +63,6 @@ class ClientIVC {
     // be needed in the real IVC as they are provided as inputs
     std::shared_ptr<ProverInstance> prover_instance;
 
-    ClientIVC();
-
     void initialize(ClientCircuit& circuit);
 
     FoldProof accumulate(ClientCircuit& circuit);
diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp
index 339d7f1f03a..f273170edd2 100644
--- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp
+++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp
@@ -2,6 +2,7 @@
 
 #include "barretenberg/eccvm/eccvm_composer.hpp"
 #include "barretenberg/flavor/goblin_ultra.hpp"
+#include "barretenberg/goblin/mock_circuits.hpp"
 #include "barretenberg/proof_system/circuit_builder/eccvm/eccvm_circuit_builder.hpp"
 #include "barretenberg/proof_system/circuit_builder/goblin_translator_circuit_builder.hpp"
 #include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp"
@@ -88,6 +89,12 @@ class Goblin {
     AccumulationOutput accumulator; // Used only for ACIR methods for now
 
   public:
+    Goblin()
+    { // Mocks the interaction of a first circuit with the op queue due to the inability to currently handle zero
+      // commitments (https://github.com/AztecProtocol/barretenberg/issues/871) which would otherwise appear in the
+      // first round of the merge protocol. To be removed once the issue has been resolved.
+        GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
+    }
     /**
      * @brief Construct a GUH proof and a merge proof for the present circuit.
      * @details If there is a previous merge proof, recursively verify it.
diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin_recursion.test.cpp b/barretenberg/cpp/src/barretenberg/goblin/goblin_recursion.test.cpp
index 96463863ebb..2f10cd03845 100644
--- a/barretenberg/cpp/src/barretenberg/goblin/goblin_recursion.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/goblin/goblin_recursion.test.cpp
@@ -42,9 +42,6 @@ TEST_F(GoblinRecursionTests, Vanilla)
 
     Goblin::AccumulationOutput kernel_accum;
 
-    // TODO(https://github.com/AztecProtocol/barretenberg/issues/723):
-    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
-
     size_t NUM_CIRCUITS = 2;
     for (size_t circuit_idx = 0; circuit_idx < NUM_CIRCUITS; ++circuit_idx) {
 
@@ -58,7 +55,9 @@ TEST_F(GoblinRecursionTests, Vanilla)
 
         // Construct and accumulate the mock kernel circuit (no kernel accum in first round)
         GoblinUltraCircuitBuilder kernel_circuit{ goblin.op_queue };
-        GoblinMockCircuits::construct_mock_kernel_small(kernel_circuit, function_accum, kernel_accum);
+        GoblinMockCircuits::construct_mock_kernel_small(kernel_circuit,
+                                                        { function_accum.proof, function_accum.verification_key },
+                                                        { kernel_accum.proof, kernel_accum.verification_key });
         info("kernel accum");
         goblin.merge(kernel_circuit);
         kernel_accum = construct_accumulator(kernel_circuit);
diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp
index 58cc8fc2d2c..c3b5824f614 100644
--- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp
+++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp
@@ -7,7 +7,6 @@
 #include "barretenberg/crypto/merkle_tree/memory_store.hpp"
 #include "barretenberg/crypto/merkle_tree/merkle_tree.hpp"
 #include "barretenberg/flavor/goblin_ultra.hpp"
-#include "barretenberg/goblin/goblin.hpp"
 #include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp"
 #include "barretenberg/srs/global_crs.hpp"
 #include "barretenberg/stdlib/encryption/ecdsa/ecdsa.hpp"
@@ -30,13 +29,17 @@ class GoblinMockCircuits {
     using Flavor = bb::GoblinUltraFlavor;
     using RecursiveFlavor = bb::GoblinUltraRecursiveFlavor_<GoblinUltraBuilder>;
     using RecursiveVerifier = bb::stdlib::recursion::honk::UltraRecursiveVerifier_<RecursiveFlavor>;
-    using KernelInput = Goblin::AccumulationOutput;
     using VerifierInstance = bb::VerifierInstance_<Flavor>;
     using RecursiveVerifierInstance = ::bb::stdlib::recursion::honk::RecursiveVerifierInstance_<RecursiveFlavor>;
     using RecursiveVerifierAccumulator = std::shared_ptr<RecursiveVerifierInstance>;
     using VerificationKey = Flavor::VerificationKey;
     static constexpr size_t NUM_OP_QUEUE_COLUMNS = Flavor::NUM_WIRES;
 
+    struct KernelInput {
+        HonkProof proof;
+        std::shared_ptr<Flavor::VerificationKey> verification_key;
+    };
+
     /**
      * @brief Information required by the verifier to verify a folding round besides the previous accumulator.
      */
@@ -147,6 +150,7 @@ class GoblinMockCircuits {
         op_queue->set_size_data();
 
         // Manually compute the op queue transcript commitments (which would normally be done by the merge prover)
+        bb::srs::init_crs_factory("../srs_db/ignition");
         auto commitment_key = CommitmentKey(op_queue->get_current_size());
         std::array<Point, Flavor::NUM_WIRES> op_queue_commitments;
         size_t idx = 0;
@@ -162,11 +166,8 @@ class GoblinMockCircuits {
      *
      * @param builder
      */
-    static void construct_simple_initial_circuit(GoblinUltraBuilder& builder)
+    static void construct_simple_circuit(GoblinUltraBuilder& builder)
     {
-        // TODO(https://github.com/AztecProtocol/barretenberg/issues/800) Testing cleanup
-        perform_op_queue_interactions_for_mock_first_circuit(builder.op_queue);
-
         // Add some arbitrary ecc op gates
         for (size_t i = 0; i < 3; ++i) {
             auto point = Point::random_element();
diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp
index 0b9e06e0ff8..3646a5be696 100644
--- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp
@@ -39,13 +39,15 @@ TEST_F(MockCircuits, PinRecursionKernelSizes)
     const auto run_test = [](bool large) {
         {
             Goblin goblin;
-            GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(goblin.op_queue);
             Goblin::AccumulationOutput kernel_accum;
             GoblinUltraCircuitBuilder app_circuit{ goblin.op_queue };
             GoblinMockCircuits::construct_mock_function_circuit(app_circuit, large);
             auto function_accum = goblin.accumulate(app_circuit);
             GoblinUltraCircuitBuilder kernel_circuit{ goblin.op_queue };
-            GoblinMockCircuits::construct_mock_recursion_kernel_circuit(kernel_circuit, function_accum, kernel_accum);
+            GoblinMockCircuits::construct_mock_recursion_kernel_circuit(
+                kernel_circuit,
+                { function_accum.proof, function_accum.verification_key },
+                { kernel_accum.proof, kernel_accum.verification_key });
 
             auto instance = std::make_shared<ProverInstance>(kernel_circuit);
             if (large) {
diff --git a/barretenberg/cpp/src/barretenberg/proof_system/op_queue/ecc_op_queue.hpp b/barretenberg/cpp/src/barretenberg/proof_system/op_queue/ecc_op_queue.hpp
index 3443fbdd2e0..7afee28f38f 100644
--- a/barretenberg/cpp/src/barretenberg/proof_system/op_queue/ecc_op_queue.hpp
+++ b/barretenberg/cpp/src/barretenberg/proof_system/op_queue/ecc_op_queue.hpp
@@ -166,30 +166,6 @@ class ECCOpQueue {
         return result;
     }
 
-    /**
-     * @brief TESTING PURPOSES ONLY: Populate ECC op queue with mock data as stand in for "previous circuit" in tests
-     * @details TODO(#723): We currently cannot support Goblin proofs (specifically, transcript aggregation) if there
-     * is not existing data in the ECC op queue (since this leads to zero-commitment issues). This method populates the
-     * op queue with mock data so that the prover of an arbitrary 'first' circuit can behave as if it were not the
-     * prover over the first circuit in the stack. This method should be removed entirely once this is resolved.
-     *
-     * @param op_queue
-     */
-    void populate_with_mock_initital_data()
-    {
-        // Add a single row of data to the op queue and commit to each column as [1] * FF(data)
-        std::array<Point, 4> mock_op_queue_commitments;
-        for (size_t idx = 0; idx < 4; idx++) {
-            auto mock_data = Fr::random_element();
-            this->ultra_ops[idx].emplace_back(mock_data);
-            mock_op_queue_commitments[idx] = Point::one() * mock_data;
-        }
-        // Set some internal data based on the size of the op queue data
-        this->set_size_data();
-        // Add the commitments to the op queue data for use by the next circuit
-        this->set_commitment_data(mock_op_queue_commitments);
-    }
-
     /**
      * @brief Write point addition op to queue and natively perform addition
      *
diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp
index 242977c212b..362b90af041 100644
--- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp
@@ -58,9 +58,13 @@ template <typename OuterFlavor> class GoblinRecursiveVerifierTest : public testi
 
         // Instantiate ECC op queue and add mock data to simulate interaction with a previous circuit
         auto op_queue = std::make_shared<ECCOpQueue>();
-        op_queue->populate_with_mock_initital_data();
 
         InnerBuilder builder(op_queue);
+        // Add a mul accum op and an equality op
+        auto p = point::one() * fr::random_element();
+        auto scalar = fr::random_element();
+        builder.queue_ecc_mul_accum(p, scalar);
+        builder.queue_ecc_eq();
 
         // Create 2^log_n many add gates based on input log num gates
         const size_t num_gates = 1 << log_num_gates;
diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/merge_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/merge_verifier.test.cpp
index 011f26e7c9d..f20c79a6c19 100644
--- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/merge_verifier.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/merge_verifier.test.cpp
@@ -1,7 +1,11 @@
+#include "barretenberg/ultra_honk/merge_verifier.hpp"
 #include "barretenberg/common/test.hpp"
 #include "barretenberg/goblin/mock_circuits.hpp"
 #include "barretenberg/stdlib/primitives/curves/bn254.hpp"
 #include "barretenberg/stdlib/recursion/honk/verifier/merge_recursive_verifier.hpp"
+#include "barretenberg/ultra_honk/merge_prover.hpp"
+#include "barretenberg/ultra_honk/ultra_prover.hpp"
+#include "barretenberg/ultra_honk/ultra_verifier.hpp"
 
 namespace bb::stdlib::recursion::goblin {
 
@@ -42,9 +46,11 @@ class RecursiveMergeVerifierTest : public testing::Test {
     static void test_recursive_merge_verification()
     {
         auto op_queue = std::make_shared<ECCOpQueue>();
+        // TODO(https://github.com/AztecProtocol/barretenberg/issues/800) Testing cleanup
+        GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
 
         InnerBuilder sample_circuit{ op_queue };
-        GoblinMockCircuits::construct_simple_initial_circuit(sample_circuit);
+        GoblinMockCircuits::construct_simple_circuit(sample_circuit);
 
         // Generate a proof over the inner circuit
         MergeProver merge_prover{ op_queue };
diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/databus_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/databus_composer.test.cpp
index 089a6e14572..eb6c858f327 100644
--- a/barretenberg/cpp/src/barretenberg/ultra_honk/databus_composer.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/ultra_honk/databus_composer.test.cpp
@@ -9,6 +9,8 @@
 #include "barretenberg/proof_system/instance_inspector.hpp"
 
 #include "barretenberg/ultra_honk/ultra_prover.hpp"
+#include "barretenberg/ultra_honk/ultra_verifier.hpp"
+
 using namespace bb;
 
 namespace {
@@ -49,7 +51,7 @@ TEST_F(DataBusComposerTests, CallDataRead)
     auto op_queue = std::make_shared<bb::ECCOpQueue>();
 
     // Add mock data to op queue to simulate interaction with a previous circuit
-    op_queue->populate_with_mock_initital_data();
+    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
 
     auto builder = GoblinUltraCircuitBuilder{ op_queue };
 
diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_composer.test.cpp
index bed11a6fb4b..f998b8f492a 100644
--- a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_composer.test.cpp
+++ b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_composer.test.cpp
@@ -3,6 +3,7 @@
 #include <gtest/gtest.h>
 
 #include "barretenberg/common/log.hpp"
+#include "barretenberg/goblin/mock_circuits.hpp"
 #include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp"
 #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp"
 #include "barretenberg/ultra_honk/merge_prover.hpp"
@@ -26,36 +27,6 @@ class GoblinUltraHonkComposerTests : public ::testing::Test {
     using MergeProver = MergeProver_<GoblinUltraFlavor>;
     using MergeVerifier = MergeVerifier_<GoblinUltraFlavor>;
 
-    /**
-     * @brief Generate a simple test circuit with some ECC op gates and conventional arithmetic gates
-     *
-     * @param builder
-     */
-    void generate_test_circuit(auto& builder)
-    {
-        // Add some ecc op gates
-        for (size_t i = 0; i < 3; ++i) {
-            auto point = Point::one() * FF::random_element();
-            auto scalar = FF::random_element();
-            builder.queue_ecc_mul_accum(point, scalar);
-        }
-        builder.queue_ecc_eq();
-
-        // Add some conventional gates that utilize public inputs
-        for (size_t i = 0; i < 10; ++i) {
-            FF a = FF::random_element();
-            FF b = FF::random_element();
-            FF c = FF::random_element();
-            FF d = a + b + c;
-            uint32_t a_idx = builder.add_public_variable(a);
-            uint32_t b_idx = builder.add_variable(b);
-            uint32_t c_idx = builder.add_variable(c);
-            uint32_t d_idx = builder.add_variable(d);
-
-            builder.create_big_add_gate({ a_idx, b_idx, c_idx, d_idx, FF(1), FF(1), FF(1), FF(-1), FF(0) });
-        }
-    }
-
     /**
      * @brief Construct and a verify a Honk proof
      *
@@ -99,12 +70,10 @@ TEST_F(GoblinUltraHonkComposerTests, SingleCircuit)
 {
     auto op_queue = std::make_shared<bb::ECCOpQueue>();
 
-    // Add mock data to op queue to simulate interaction with a previous circuit
-    op_queue->populate_with_mock_initital_data();
-
+    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
     auto builder = GoblinUltraCircuitBuilder{ op_queue };
 
-    generate_test_circuit(builder);
+    GoblinMockCircuits::construct_simple_circuit(builder);
 
     // Construct and verify Honk proof
     bool honk_verified = construct_and_verify_honk_proof(builder);
@@ -125,15 +94,14 @@ TEST_F(GoblinUltraHonkComposerTests, MultipleCircuitsMergeOnly)
     // Instantiate EccOpQueue. This will be shared across all circuits in the series
     auto op_queue = std::make_shared<bb::ECCOpQueue>();
 
-    // Add mock data to op queue to simulate interaction with a previous circuit
-    op_queue->populate_with_mock_initital_data();
+    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
 
     // Construct multiple test circuits that share an ECC op queue. Generate and verify a proof for each.
     size_t NUM_CIRCUITS = 3;
     for (size_t i = 0; i < NUM_CIRCUITS; ++i) {
         auto builder = GoblinUltraCircuitBuilder{ op_queue };
 
-        generate_test_circuit(builder);
+        GoblinMockCircuits::construct_simple_circuit(builder);
 
         // Construct and verify Goblin ECC op queue Merge proof
         auto merge_verified = construct_and_verify_merge_proof(op_queue);
@@ -151,15 +119,14 @@ TEST_F(GoblinUltraHonkComposerTests, MultipleCircuitsHonkOnly)
     // Instantiate EccOpQueue. This will be shared across all circuits in the series
     auto op_queue = std::make_shared<bb::ECCOpQueue>();
 
-    // Add mock data to op queue to simulate interaction with a previous circuit
-    op_queue->populate_with_mock_initital_data();
+    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
 
     // Construct multiple test circuits that share an ECC op queue. Generate and verify a proof for each.
     size_t NUM_CIRCUITS = 3;
     for (size_t i = 0; i < NUM_CIRCUITS; ++i) {
         auto builder = GoblinUltraCircuitBuilder{ op_queue };
 
-        generate_test_circuit(builder);
+        GoblinMockCircuits::construct_simple_circuit(builder);
 
         // Construct and verify Honk proof
         bool honk_verified = construct_and_verify_honk_proof(builder);
@@ -177,15 +144,14 @@ TEST_F(GoblinUltraHonkComposerTests, MultipleCircuitsHonkAndMerge)
     // Instantiate EccOpQueue. This will be shared across all circuits in the series
     auto op_queue = std::make_shared<bb::ECCOpQueue>();
 
-    // Add mock data to op queue to simulate interaction with a previous circuit
-    op_queue->populate_with_mock_initital_data();
+    GoblinMockCircuits::perform_op_queue_interactions_for_mock_first_circuit(op_queue);
 
     // Construct multiple test circuits that share an ECC op queue. Generate and verify a proof for each.
     size_t NUM_CIRCUITS = 3;
     for (size_t i = 0; i < NUM_CIRCUITS; ++i) {
         auto builder = GoblinUltraCircuitBuilder{ op_queue };
 
-        generate_test_circuit(builder);
+        GoblinMockCircuits::construct_simple_circuit(builder);
 
         // Construct and verify Honk proof
         bool honk_verified = construct_and_verify_honk_proof(builder);