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
82TEST_F(ChonkTranscriptInvariantTests, AccumulationTranscriptCount)
83{
84 // Pinned expected transcript count for 2 app circuits
85 constexpr size_t EXPECTED_TOTAL_TRANSCRIPTS = 12;
86 constexpr size_t EXPECTED_NUM_CIRCUITS = 7;
87 constexpr std::array<size_t, EXPECTED_NUM_CIRCUITS> EXPECTED_CIRCUIT_TRANSCRIPTS = { 0, 2, 0, 3, 2, 2, 3 };
88
89 // Record transcript index before IVC
90 size_t index_before_ivc = bb::unique_transcript_index.load();
91
92 // Track indices at each circuit accumulation
93 std::vector<size_t> indices_before_accumulation;
94 std::vector<size_t> indices_after_accumulation;
95
96 // Create IVC with 2 app circuits
97 constexpr size_t NUM_APP_CIRCUITS = 2;
98 PrivateFunctionExecutionMockCircuitProducer circuit_producer(NUM_APP_CIRCUITS);
99 const size_t num_circuits = circuit_producer.total_num_circuits;
100 ASSERT_EQ(num_circuits, EXPECTED_NUM_CIRCUITS) << "Circuit count mismatch - test assumptions invalid";
101
102 Chonk ivc{ num_circuits };
103
104 for (size_t j = 0; j < num_circuits; ++j) {
105 indices_before_accumulation.push_back(bb::unique_transcript_index.load());
106 circuit_producer.construct_and_accumulate_next_circuit(ivc);
107 indices_after_accumulation.push_back(bb::unique_transcript_index.load());
108 }
109
110 size_t index_after_ivc = bb::unique_transcript_index.load();
111 size_t total_transcripts = index_after_ivc - index_before_ivc;
112
113 // Pin the total number of transcripts created during accumulation
114 EXPECT_EQ(total_transcripts, EXPECTED_TOTAL_TRANSCRIPTS)
115 << "Total transcript count during 2-app IVC accumulation changed. "
116 << "If intentional, update EXPECTED_TOTAL_TRANSCRIPTS. "
117 << "Unexpected changes may indicate security-relevant transcript isolation issues.";
118
119 // Pin per-circuit transcript counts
120 for (size_t i = 0; i < num_circuits; ++i) {
121 size_t circuit_transcripts = indices_after_accumulation[i] - indices_before_accumulation[i];
122 EXPECT_EQ(circuit_transcripts, EXPECTED_CIRCUIT_TRANSCRIPTS[i])
123 << "Circuit " << i << " transcript count changed from " << EXPECTED_CIRCUIT_TRANSCRIPTS[i] << " to "
124 << circuit_transcripts;
125 }
126
127 // Generate and verify proof
128 auto proof = ivc.prove();
129 auto vk_and_hash = ivc.get_hiding_kernel_vk_and_hash();
130 ChonkNativeVerifier verifier(vk_and_hash);
131 EXPECT_TRUE(verifier.verify(proof)) << "IVC proof should verify";
132}
133
145TEST_F(ChonkTranscriptInvariantTests, RecursiveVerificationTranscriptCount)
146{
147 using RecursiveVerifier = ChonkRecursiveVerifier;
148
149 // Create a minimal IVC and generate proof
150 constexpr size_t NUM_APP_CIRCUITS = 1;
151 PrivateFunctionExecutionMockCircuitProducer circuit_producer(NUM_APP_CIRCUITS);
152 const size_t num_circuits = circuit_producer.total_num_circuits;
153 Chonk ivc{ num_circuits };
154
155 for (size_t j = 0; j < num_circuits; ++j) {
156 circuit_producer.construct_and_accumulate_next_circuit(ivc);
157 }
158
159 auto proof = ivc.prove();
160 auto vk_and_hash = ivc.get_hiding_kernel_vk_and_hash();
161
162 // Perform recursive verification and track transcript creation
163 // unique_transcript_index is only incremented for in-circuit transcripts (in_circuit == true)
165 size_t index_before_verify = bb::unique_transcript_index.load();
166
167 // Create stdlib VK and hash from native VK
168 auto stdlib_vk_and_hash = std::make_shared<RecursiveVerifier::VKAndHash>(builder, vk_and_hash->vk);
169
170 RecursiveVerifier verifier(stdlib_vk_and_hash);
171 ChonkStdlibProof stdlib_proof(builder, proof);
172 [[maybe_unused]] auto output = verifier.verify(stdlib_proof);
173
174 size_t index_after_verify = bb::unique_transcript_index.load();
175 size_t transcripts_created = index_after_verify - index_before_verify;
176
177 // Pin the exact number of transcripts created during recursive verification
178 constexpr size_t EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY = 2;
179 EXPECT_EQ(transcripts_created, EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY)
180 << "ChonkRecursiveVerifier transcript count changed. "
181 << "If intentional, update EXPECTED_TRANSCRIPTS_DURING_RECURSIVE_VERIFY. "
182 << "Unexpected changes may indicate security-relevant transcript isolation issues.";
183}
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:617
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.