Skip to content

Commit 71e81ce

Browse files
authored
feat: VK generation test for HonkRecursionConstraint (#13637)
Adds a new test that checks whether the HonkRecursionConstraint circuit is the same with valid inputs vs with dummy inputs.
1 parent 66a61ba commit 71e81ce

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,12 @@ void create_dummy_vkey_and_proof(typename Flavor::CircuitBuilder& builder,
9797
builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index);
9898
offset++;
9999
}
100+
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1352): Using SMALL_DUMMY_VALUE might resolve this
101+
// issue.
102+
fr SMALL_DUMMY_VALUE(2); // arbtirary small value that shouldn't cause builder problems.
100103
// The aggregation object
101104
for (size_t i = 0; i < AggregationObject::PUBLIC_INPUTS_SIZE; i++) {
102-
builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index);
105+
builder.assert_equal(builder.add_variable(SMALL_DUMMY_VALUE), proof_fields[offset].witness_index);
103106
offset++;
104107
}
105108

barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ template <typename RecursiveFlavor> class AcirHonkRecursionConstraint : public :
155155
* @param inner_circuits
156156
* @return Composer
157157
*/
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)
159160
{
160161
std::vector<RecursionConstraint> honk_recursion_constraints;
161162

@@ -208,6 +209,9 @@ template <typename RecursiveFlavor> class AcirHonkRecursionConstraint : public :
208209
honk_recursion = 2;
209210
}
210211
ProgramMetadata metadata{ .honk_recursion = honk_recursion };
212+
if (dummy_witnesses) {
213+
witness = {}; // set it all to 0
214+
}
211215
AcirProgram program{ constraint_system, witness };
212216
BuilderType outer_circuit = create_circuit<BuilderType>(program, metadata);
213217

@@ -228,6 +232,30 @@ using Flavors = testing::Types<UltraRecursiveFlavor_<UltraCircuitBuilder>,
228232

229233
TYPED_TEST_SUITE(AcirHonkRecursionConstraint, Flavors);
230234

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+
231259
TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint)
232260
{
233261
std::vector<typename TestFixture::InnerBuilder> layer_1_circuits;
@@ -243,7 +271,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint)
243271
info("prover gates = ", proving_key->proving_key.circuit_size);
244272
auto proof = prover.construct_proof();
245273
auto verification_key = std::make_shared<typename TestFixture::OuterVerificationKey>(proving_key->proving_key);
246-
info(HasIPAAccumulator<TypeParam>);
274+
247275
if constexpr (HasIPAAccumulator<TypeParam>) {
248276
auto ipa_verification_key = std::make_shared<VerifierCommitmentKey<curve::Grumpkin>>(1 << CONST_ECCVM_LOG_N);
249277
typename TestFixture::OuterVerifier verifier(verification_key, ipa_verification_key);

barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ UltraRecursiveVerifier_<Flavor>::Output UltraRecursiveVerifier_<Flavor>::verify_
128128

129129
auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript);
130130

131+
// TODO(https://github.com/AztecProtocol/barretenberg/issues/1352): Investigate if normalize() calls are needed.
131132
pairing_points[0] = pairing_points[0].normalize();
132133
pairing_points[1] = pairing_points[1].normalize();
133134
// TODO(https://github.com/AztecProtocol/barretenberg/issues/995): generate recursion separator challenge properly.

0 commit comments

Comments
 (0)