Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
chonk_transcript_invariants.test.cpp
Go to the documentation of this file.
1
43#include <gtest/gtest.h>
44
45using namespace bb;
46
50class ChonkTranscriptInvariantTests : public ::testing::Test {
51 protected:
53};
54
83TEST_F(ChonkTranscriptInvariantTests, AccumulationTranscriptCount)
84{
85 // Pinned expected transcript count for 4 app circuits
86 constexpr size_t EXPECTED_TOTAL_TRANSCRIPTS = 13;
87 constexpr size_t EXPECTED_NUM_CIRCUITS = 9;
88 constexpr std::array<size_t, EXPECTED_NUM_CIRCUITS> EXPECTED_CIRCUIT_TRANSCRIPTS = { 0, 0, 0, 3, 0, 3, 2, 2, 3 };
89
90 // Record transcript index before IVC
91 size_t index_before_ivc = bb::unique_transcript_index.load();
92
93 // Track indices at each circuit accumulation
94 std::vector<size_t> indices_before_accumulation;
95 std::vector<size_t> indices_after_accumulation;
96
97 // Create IVC with 4 app circuits
98 constexpr size_t NUM_APP_CIRCUITS = 4;
99 PrivateFunctionExecutionMockCircuitProducer circuit_producer(NUM_APP_CIRCUITS);
100 const size_t num_circuits = circuit_producer.total_num_circuits;
101 ASSERT_EQ(num_circuits, EXPECTED_NUM_CIRCUITS) << "Circuit count mismatch - test assumptions invalid";
102
103 Chonk ivc{ num_circuits };
104
105 for (size_t j = 0; j < num_circuits; ++j) {
106 indices_before_accumulation.push_back(bb::unique_transcript_index.load());
107 circuit_producer.construct_and_accumulate_next_circuit(ivc);
108 indices_after_accumulation.push_back(bb::unique_transcript_index.load());
109 }
110
111 size_t index_after_ivc = bb::unique_transcript_index.load();
112 size_t total_transcripts = index_after_ivc - index_before_ivc;
113
114 // Pin the total number of transcripts created during accumulation
115 EXPECT_EQ(total_transcripts, EXPECTED_TOTAL_TRANSCRIPTS)
116 << "Total transcript count during 4-app IVC accumulation changed. "
117 << "If intentional, update EXPECTED_TOTAL_TRANSCRIPTS. "
118 << "Unexpected changes may indicate security-relevant transcript isolation issues.";
119
120 // Pin per-circuit transcript counts
121 for (size_t i = 0; i < num_circuits; ++i) {
122 size_t circuit_transcripts = indices_after_accumulation[i] - indices_before_accumulation[i];
123 EXPECT_EQ(circuit_transcripts, EXPECTED_CIRCUIT_TRANSCRIPTS[i])
124 << "Circuit " << i << " transcript count changed from " << EXPECTED_CIRCUIT_TRANSCRIPTS[i] << " to "
125 << circuit_transcripts;
126 }
127
128 // Generate and verify proof
129 auto proof = ivc.prove();
130 auto vk_and_hash = ivc.get_hiding_kernel_vk_and_hash();
131 ChonkNativeVerifier verifier(vk_and_hash);
132 EXPECT_TRUE(verifier.verify(proof)) << "IVC proof should verify";
133}
134
146TEST_F(ChonkTranscriptInvariantTests, RecursiveVerificationTranscriptCount)
147{
148 using RecursiveVerifier = ChonkRecursiveVerifier;
149
150 // Create a minimal IVC and generate proof
151 constexpr size_t NUM_APP_CIRCUITS = 1;
152 PrivateFunctionExecutionMockCircuitProducer circuit_producer(NUM_APP_CIRCUITS);
153 const size_t num_circuits = circuit_producer.total_num_circuits;
154 Chonk ivc{ num_circuits };
155
156 for (size_t j = 0; j < num_circuits; ++j) {
157 circuit_producer.construct_and_accumulate_next_circuit(ivc);
158 }
159
160 auto proof = ivc.prove();
161 auto vk_and_hash = ivc.get_hiding_kernel_vk_and_hash();
162
163 // Perform recursive verification and track transcript creation
164 // unique_transcript_index is only incremented for in-circuit transcripts (in_circuit == true)
166 size_t index_before_verify = bb::unique_transcript_index.load();
167
168 // Create stdlib VK and hash from native VK
169 auto stdlib_vk_and_hash = std::make_shared<RecursiveVerifier::VKAndHash>(builder, vk_and_hash->vk);
170
171 RecursiveVerifier verifier(stdlib_vk_and_hash);
172 ChonkStdlibProof stdlib_proof(builder, proof);
173 [[maybe_unused]] auto output = verifier.verify(stdlib_proof);
174
175 size_t index_after_verify = bb::unique_transcript_index.load();
176 size_t transcripts_created = index_after_verify - index_before_verify;
177
178 // Pin the exact number of transcripts created during recursive verification
179 constexpr size_t EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY = 2;
180 EXPECT_EQ(transcripts_created, EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY)
181 << "ChonkRecursiveVerifier transcript count changed. "
182 << "If intentional, update EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY. "
183 << "Unexpected changes may indicate security-relevant transcript isolation issues.";
184}
TEST_F(ChonkTranscriptInvariantTests, AccumulationTranscriptCount)
Pin the exact number of transcripts created during IVC accumulation.
Test fixture for Chonk transcript invariant tests.
The IVC scheme used by the aztec client for private function execution.
Definition chonk.hpp:39
ChonkProof prove()
Construct Chonk proof using the batched MegaZK + Translator protocol.
Definition chonk.cpp:626
Verifier for Chonk IVC proofs (both native and recursive).
Output verify(const Proof &proof)
Verify a Chonk proof.
AluTraceBuilder builder
Definition alu.test.cpp:124
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::atomic< size_t > unique_transcript_index
ChonkVerifier< true > ChonkRecursiveVerifier
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Chonk proof type.