@@ -155,7 +155,8 @@ template <typename RecursiveFlavor> class AcirHonkRecursionConstraint : public :
155
155
* @param inner_circuits
156
156
* @return Composer
157
157
*/
158
- template <typename BuilderType> BuilderType create_outer_circuit (std::vector<InnerBuilder>& inner_circuits)
158
+ template <typename BuilderType>
159
+ BuilderType create_outer_circuit (std::vector<InnerBuilder>& inner_circuits, bool dummy_witnesses = false )
159
160
{
160
161
std::vector<RecursionConstraint> honk_recursion_constraints;
161
162
@@ -208,6 +209,9 @@ template <typename RecursiveFlavor> class AcirHonkRecursionConstraint : public :
208
209
honk_recursion = 2 ;
209
210
}
210
211
ProgramMetadata metadata{ .honk_recursion = honk_recursion };
212
+ if (dummy_witnesses) {
213
+ witness = {}; // set it all to 0
214
+ }
211
215
AcirProgram program{ constraint_system, witness };
212
216
BuilderType outer_circuit = create_circuit<BuilderType>(program, metadata);
213
217
@@ -228,6 +232,30 @@ using Flavors = testing::Types<UltraRecursiveFlavor_<UltraCircuitBuilder>,
228
232
229
233
TYPED_TEST_SUITE (AcirHonkRecursionConstraint, Flavors);
230
234
235
+ TYPED_TEST (AcirHonkRecursionConstraint, TestHonkRecursionConstraintVKGeneration)
236
+ {
237
+ std::vector<typename TestFixture::InnerBuilder> layer_1_circuits;
238
+ layer_1_circuits.push_back (TestFixture::create_inner_circuit ());
239
+
240
+ auto layer_2_circuit =
241
+ TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits);
242
+
243
+ auto layer_2_circuit_with_dummy_witnesses =
244
+ TestFixture::template create_outer_circuit<typename TestFixture::OuterBuilder>(layer_1_circuits,
245
+ /* dummy_witnesses=*/ true );
246
+
247
+ auto proving_key = std::make_shared<typename TestFixture::OuterDeciderProvingKey>(layer_2_circuit);
248
+ auto verification_key = std::make_shared<typename TestFixture::OuterVerificationKey>(proving_key->proving_key );
249
+
250
+ auto proving_key_dummy =
251
+ std::make_shared<typename TestFixture::OuterDeciderProvingKey>(layer_2_circuit_with_dummy_witnesses);
252
+ auto verification_key_dummy =
253
+ std::make_shared<typename TestFixture::OuterVerificationKey>(proving_key_dummy->proving_key );
254
+
255
+ // Compare the two vks
256
+ EXPECT_EQ (*verification_key_dummy, *verification_key);
257
+ }
258
+
231
259
TYPED_TEST (AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint)
232
260
{
233
261
std::vector<typename TestFixture::InnerBuilder> layer_1_circuits;
@@ -243,7 +271,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint)
243
271
info (" prover gates = " , proving_key->proving_key .circuit_size );
244
272
auto proof = prover.construct_proof ();
245
273
auto verification_key = std::make_shared<typename TestFixture::OuterVerificationKey>(proving_key->proving_key );
246
- info (HasIPAAccumulator<TypeParam>);
274
+
247
275
if constexpr (HasIPAAccumulator<TypeParam>) {
248
276
auto ipa_verification_key = std::make_shared<VerifierCommitmentKey<curve::Grumpkin>>(1 << CONST_ECCVM_LOG_N);
249
277
typename TestFixture::OuterVerifier verifier (verification_key, ipa_verification_key);
0 commit comments