From e091325e8fc700fe8d6432ef606e4687a06a1e63 Mon Sep 17 00:00:00 2001 From: Suyash Bagad Date: Sat, 25 Mar 2023 08:30:18 +0000 Subject: [PATCH 1/2] Add `contains_recursive_proof` to recursive vk. --- .../stdlib/recursion/verification_key/verification_key.hpp | 4 ++++ cpp/src/barretenberg/stdlib/recursion/verifier/verifier.hpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp b/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp index d5169518bd..4714233f1c 100644 --- a/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp +++ b/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp @@ -259,6 +259,10 @@ template struct verification_key { field_t num_public_inputs; field_t z_pow_n; + // NOTE: This does not strictly need to be a circuit type. It can be used to check in the circuit + // if a proof contains any aggregated state. + bool_t contains_recursive_proof; + evaluation_domain domain; std::map commitments; diff --git a/cpp/src/barretenberg/stdlib/recursion/verifier/verifier.hpp b/cpp/src/barretenberg/stdlib/recursion/verifier/verifier.hpp index 5802ad8f75..429eafa915 100644 --- a/cpp/src/barretenberg/stdlib/recursion/verifier/verifier.hpp +++ b/cpp/src/barretenberg/stdlib/recursion/verifier/verifier.hpp @@ -352,6 +352,10 @@ recursion_output verify_proof(typename Curve::Composer* context, rhs_scalars.push_back(random_separator); } + // Check if recursive proof information is correctly set. + key->contains_recursive_proof.assert_equal(key->base_key->contains_recursive_proof, + "contains_recursive_proof is incorrectly set"); + /** * N.B. if this key contains a recursive proof, then ALL potential verification keys being verified by the outer *circuit must ALSO contain a recursive proof (this is not a concern if the key is being generated from circuit From 81d82430e048e80b0ebbb59e8354dac2e919d2d3 Mon Sep 17 00:00:00 2001 From: Suyash Bagad Date: Sat, 25 Mar 2023 09:19:16 +0000 Subject: [PATCH 2/2] Fix constructors. --- .../stdlib/recursion/verification_key/verification_key.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp b/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp index 4714233f1c..4d9bc421eb 100644 --- a/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp +++ b/cpp/src/barretenberg/stdlib/recursion/verification_key/verification_key.hpp @@ -120,6 +120,7 @@ template struct verification_key { key->n = witness_t(ctx, barretenberg::fr(input_key->circuit_size)); key->num_public_inputs = witness_t(ctx, input_key->num_public_inputs); key->domain = evaluation_domain::from_witness(ctx, input_key->domain); + key->contains_recursive_proof = witness_t(ctx, input_key->contains_recursive_proof); for (const auto& [tag, value] : input_key->commitments) { key->commitments.insert({ tag, Curve::g1_ct::from_witness(ctx, value) }); @@ -136,6 +137,7 @@ template struct verification_key { key->base_key = input_key; key->n = field_t(ctx, input_key->circuit_size); key->num_public_inputs = field_t(ctx, input_key->num_public_inputs); + key->contains_recursive_proof = bool_t(ctx, input_key->contains_recursive_proof); key->domain = evaluation_domain::from_constants(ctx, input_key->domain);