barretenberg
Loading...
Searching...
No Matches
recursion_constraint.hpp
1#pragma once
2#include "barretenberg/dsl/types.hpp"
3#include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp"
4#include <vector>
5
6namespace acir_format {
7
8using namespace proof_system::plonk;
9
46 // An aggregation state is represented by two G1 affine elements. Each G1 point has
47 // two field element coordinates (x, y). Thus, four field elements
48 static constexpr size_t NUM_AGGREGATION_ELEMENTS = 4;
49 // Four limbs are used when simulating a non-native field using the bigfield class
50 static constexpr size_t AGGREGATION_OBJECT_SIZE =
51 NUM_AGGREGATION_ELEMENTS * NUM_QUOTIENT_PARTS; // 16 field elements
52 std::vector<uint32_t> key;
53 std::vector<uint32_t> proof;
54 std::vector<uint32_t> public_inputs;
55 uint32_t key_hash;
56 // TODO(maxim):This is now unused, but we keep it here for backwards compatibility
57 std::array<uint32_t, AGGREGATION_OBJECT_SIZE> input_aggregation_object;
58 // TODO(maxim): This is now unused, but we keep it here for backwards compatibility
59 std::array<uint32_t, AGGREGATION_OBJECT_SIZE> output_aggregation_object;
60 // TODO(maxim): This is currently not being used on the Noir level at all,
61 // TODO(maxim): but we keep it here for backwards compatibility
62 // TODO(maxim): The object is now currently contained by the `proof` field
63 // TODO(maxim): and is handled when serializing ACIR to a barretenberg circuit
64 std::array<uint32_t, AGGREGATION_OBJECT_SIZE> nested_aggregation_object;
65
66 friend bool operator==(RecursionConstraint const& lhs, RecursionConstraint const& rhs) = default;
67};
68
69std::array<uint32_t, RecursionConstraint::AGGREGATION_OBJECT_SIZE> create_recursion_constraints(
70 Builder& builder,
71 const RecursionConstraint& input,
72 std::array<uint32_t, RecursionConstraint::AGGREGATION_OBJECT_SIZE> input_aggregation_object,
73 std::array<uint32_t, RecursionConstraint::AGGREGATION_OBJECT_SIZE> nested_aggregation_object,
74 bool has_valid_witness_assignments = false);
75
76std::vector<barretenberg::fr> export_key_in_recursion_format(std::shared_ptr<verification_key> const& vkey);
77std::vector<barretenberg::fr> export_dummy_key_in_recursion_format(const PolynomialManifest& polynomial_manifest,
78 bool contains_recursive_proof = 0);
79
80std::vector<barretenberg::fr> export_transcript_in_recursion_format(const transcript::StandardTranscript& transcript);
81std::vector<barretenberg::fr> export_dummy_transcript_in_recursion_format(const transcript::Manifest& manifest,
82 const bool contains_recursive_proof);
83size_t recursion_proof_size_without_public_inputs();
84
85// In order to interact with a recursive aggregation state inside of a circuit, we need to represent its internal G1
86// elements as field elements. This happens in multiple locations when creating a recursion constraint. The struct and
87// method below export a g1 affine element as fields to use as part of the recursive circuit.
88struct G1AsFields {
93};
94G1AsFields export_g1_affine_element_as_fields(const barretenberg::g1::affine_element& group_element);
95
96template <typename B> inline void read(B& buf, RecursionConstraint& constraint)
97{
98 using serialize::read;
99 read(buf, constraint.key);
100 read(buf, constraint.proof);
101 read(buf, constraint.public_inputs);
102 read(buf, constraint.key_hash);
103 read(buf, constraint.input_aggregation_object);
104 read(buf, constraint.output_aggregation_object);
105 read(buf, constraint.nested_aggregation_object);
106}
107
108template <typename B> inline void write(B& buf, RecursionConstraint const& constraint)
109{
110 using serialize::write;
111 write(buf, constraint.key);
112 write(buf, constraint.proof);
113 write(buf, constraint.public_inputs);
114 write(buf, constraint.key_hash);
115 write(buf, constraint.input_aggregation_object);
116 write(buf, constraint.output_aggregation_object);
117 write(buf, constraint.nested_aggregation_object);
118}
119
120} // namespace acir_format
Definition: affine_element.hpp:11
Definition: ultra_circuit_builder.hpp:31
Definition: polynomial_manifest.hpp:142
Definition: manifest.hpp:11
Definition: transcript_wrappers.hpp:13
Definition: widget.bench.cpp:13
Definition: recursion_constraint.hpp:88
RecursionConstraint struct contains information required to recursively verify a proof!
Definition: recursion_constraint.hpp:45
Definition: proof.hpp:11