14#include "gtest/gtest.h"
18static constexpr size_t SMALL_LOG_2_NUM_GATES = 5;
52 Commitment commitment = bb::field_conversion::convert_from_bn254_frs<Commitment>(
53 std::span{ proof }.subspan(public_inputs_offset, bb::field_conversion::calc_num_bn254_frs<Commitment>()));
54 commitment = commitment + Commitment::one();
55 auto commitment_frs = bb::field_conversion::convert_to_bn254_frs<Commitment>(commitment);
56 for (
size_t idx = 0; idx < 4; ++idx) {
57 proof[public_inputs_offset + idx] = commitment_frs[idx];
65 const size_t num_circuits = circuit_producer.total_num_circuits;
67 ClientIVC ivc{ num_circuits, trace_settings };
69 for (
size_t j = 0; j < num_circuits; ++j) {
71 if (j == num_circuits - 1) {
74 circuit_producer.construct_and_accumulate_next_circuit(ivc, settings);
76 return { ivc.
prove(), ivc.get_vk() };
86 const size_t NUM_APP_CIRCUITS = 1;
87 auto [proof,
vk] = accumulate_and_prove_ivc(NUM_APP_CIRCUITS);
101 const size_t NUM_APP_CIRCUITS = 2;
106 CircuitProducer circuit_producer(NUM_APP_CIRCUITS);
107 const size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
108 ClientIVC ivc{ NUM_CIRCUITS, trace_settings };
109 TestSettings settings{ .log2_num_gates = SMALL_LOG_2_NUM_GATES };
112 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
113 circuit_producer.construct_and_accumulate_next_circuit(ivc, settings);
115 EXPECT_TRUE(ivc.prove_and_verify());
120 CircuitProducer circuit_producer(NUM_APP_CIRCUITS);
121 const size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
122 ClientIVC ivc{ NUM_CIRCUITS, trace_settings };
124 size_t num_public_inputs = 0;
127 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
129 circuit_producer.create_next_circuit_and_vk(ivc, { .log2_num_gates = SMALL_LOG_2_NUM_GATES });
133 num_public_inputs = circuit.num_public_inputs();
137 EXPECT_EQ(ivc.verification_queue.size(), 2);
142 EXPECT_FALSE(ivc.prove_and_verify());
147 CircuitProducer circuit_producer(NUM_APP_CIRCUITS);
148 const size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
149 ClientIVC ivc{ NUM_CIRCUITS, trace_settings };
152 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
154 circuit_producer.create_next_circuit_and_vk(ivc, { .log2_num_gates = SMALL_LOG_2_NUM_GATES });
158 EXPECT_EQ(ivc.verification_queue.size(), 2);
160 circuit.num_public_inputs());
163 EXPECT_FALSE(ivc.prove_and_verify());
177 auto [civc_proof_1, civc_vk_1] = accumulate_and_prove_ivc(1);
182 auto [civc_proof_2, civc_vk_2] = accumulate_and_prove_ivc(1);
200 tampered_proof.
mega_proof = civc_proof_2.mega_proof;
230 const TestSettings settings{ .log2_num_gates = SMALL_LOG_2_NUM_GATES };
232 auto [unused_1, civc_vk_1] = accumulate_and_prove_ivc(1, settings);
233 auto [unused_2, civc_vk_2] = accumulate_and_prove_ivc(3, settings);
236 EXPECT_EQ(*civc_vk_1.mega.get(), *civc_vk_2.mega.get());
239 EXPECT_EQ(*civc_vk_1.eccvm.get(), *civc_vk_2.eccvm.get());
242 EXPECT_EQ(*civc_vk_1.translator.get(), *civc_vk_2.translator.get());
257 const size_t NUM_APP_CIRCUITS = 1;
258 const size_t log2_num_gates_nominal = 5;
259 const size_t log2_num_gates_overflow = 18;
261 const TestSettings settings_1{ .log2_num_gates = log2_num_gates_nominal };
262 const TestSettings settings_2{ .log2_num_gates = log2_num_gates_overflow };
264 auto [unused_1, civc_vk_1] = accumulate_and_prove_ivc(NUM_APP_CIRCUITS, settings_1);
265 auto [unused_2, civc_vk_2] = accumulate_and_prove_ivc(NUM_APP_CIRCUITS, settings_2);
268 EXPECT_EQ(*civc_vk_1.mega.get(), *civc_vk_2.mega.get());
271 EXPECT_EQ(*civc_vk_1.eccvm.get(), *civc_vk_2.eccvm.get());
274 EXPECT_EQ(*civc_vk_1.translator.get(), *civc_vk_2.translator.get());
285 const size_t NUM_APP_CIRCUITS = 14;
289 EXPECT_TRUE(verified);
302 size_t NUM_APP_CIRCUITS = 1;
303 CircuitProducer circuit_producer(NUM_APP_CIRCUITS);
304 size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
305 ClientIVC ivc{ NUM_CIRCUITS, { SMALL_TEST_STRUCTURE, 1 << 17 } };
309 size_t log2_num_gates = 14;
310 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
311 settings.log2_num_gates = log2_num_gates;
312 circuit_producer.construct_and_accumulate_next_circuit(ivc, settings);
316 EXPECT_TRUE(ivc.prove_and_verify());
327 std::vector<size_t> log2_num_arith_gates;
334 {
"Case 1", { 14, 18, 14, 16, 14 } },
335 {
"Case 2", { 14, 16, 14, 18, 14 } },
338 for (
const auto& test : test_cases) {
339 SCOPED_TRACE(test.name);
341 CircuitProducer circuit_producer(1);
342 const size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
343 ClientIVC ivc{ NUM_CIRCUITS, { SMALL_TEST_STRUCTURE_FOR_OVERFLOWS } };
346 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
347 circuit_producer.construct_and_accumulate_next_circuit(
348 ivc, { .log2_num_gates = test.log2_num_arith_gates[idx] });
351 EXPECT_EQ(check_accumulator_target_sum_manual(ivc.fold_output.accumulator),
true);
352 EXPECT_TRUE(ivc.prove_and_verify());
363 TestSettings settings{ .log2_num_gates = SMALL_LOG_2_NUM_GATES };
364 auto [proof,
vk] = accumulate_and_prove_ivc(1, settings);
367 const std::string filename =
"proof.msgpack";
368 proof.to_file_msgpack(filename);
375 uint8_t*
buffer = proof.to_msgpack_heap_buffer();
376 auto uint8_buffer = from_buffer<std::vector<uint8_t>>(
buffer);
377 uint8_t
const* uint8_ptr = uint8_buffer.data();
384 msgpack::sbuffer
buffer = proof.to_msgpack_buffer();
388 std::vector<uint8_t> random_bytes(
buffer.size());
389 std::generate(random_bytes.begin(), random_bytes.end(), []() { return static_cast<uint8_t>(rand() % 256); });
408 PrivateFunctionExecutionMockCircuitProducer circuit_producer{ 1 };
409 const size_t NUM_CIRCUITS = circuit_producer.total_num_circuits;
410 ClientIVC ivc{ NUM_CIRCUITS, { AZTEC_TRACE_STRUCTURE } };
413 for (
size_t idx = 0; idx < NUM_CIRCUITS; ++idx) {
414 auto [circuit,
vk] = circuit_producer.create_next_circuit_and_vk(ivc);
418 circuit_producer.tamper_with_databus();
424 EXPECT_FALSE(ivc.prove_and_verify());
#define EXPECT_THROW_OR_ABORT(statement, matcher)
static std::pair< ClientIVC::Proof, ClientIVC::VerificationKey > accumulate_and_prove_ivc(size_t num_app_circuits, TestSettings settings={})
static void SetUpTestSuite()
PrivateFunctionExecutionMockCircuitProducer CircuitProducer
static void tamper_with_proof(FoldProof &proof, size_t public_inputs_offset)
Tamper with a proof.
Flavor::Commitment Commitment
ClientIVC::FoldProof FoldProof
The IVC scheme used by the aztec client for private function execution.
Proof prove()
Construct a proof for the IVC, which, if verified, fully establishes its correctness.
DeciderProvingKey_< Flavor > DeciderProvingKey
void accumulate(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk)
Perform prover work for accumulation (e.g. PG folding, merge proving)
DeciderVerifier_< Flavor > DeciderVerifier
DeciderProver_< Flavor > DeciderProver
std::vector< FF > FoldProof
MegaCircuitBuilder ClientCircuit
DeciderVerificationKey_< Flavor > DeciderVerificationKey
static bool verify(const Proof &proof, const VerificationKey &vk)
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
The DeciderVerificationKey encapsulates all the necessary information for a Mega Honk Verifier to ver...
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
Curve::AffineElement Commitment
TEST_F(ClientIVCTests, BasicStructured)
Using a structured trace allows for the accumulation of circuits of varying size.
uint8_t buffer[RANDOM_BUFFER_SIZE]
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
::testing::Types< BN254Settings, GrumpkinSettings > TestSettings
void tamper_with_proof(InnerProver &inner_prover, ProofType &inner_proof, TamperType type)
Test method that provides several ways to tamper with a proof. TODO(https://github....
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
A full proof for the IVC scheme containing a Mega proof showing correctness of the hiding circuit (wh...
static Proof from_msgpack_buffer(uint8_t const *&buffer)
static Proof from_file_msgpack(const std::string &filename)
HonkProof translator_proof