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