Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
witness_computation.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
22
23namespace bb {
24
34template <IsUltraOrMegaHonk Flavor>
36 const std::vector<uint32_t>& memory_read_records,
37 const std::vector<uint32_t>& memory_write_records,
38 const typename Flavor::FF& eta,
39 const typename Flavor::FF& eta_two,
40 const typename Flavor::FF& eta_three)
41{
42 // The memory record values are computed at the indicated indices as
43 // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag;
44 // (See the Memory relation for details)
45 auto wires = polynomials.get_wires();
46
47 // Compute read record values
48 for (const auto& gate_idx : memory_read_records) {
49 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
50 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
51 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
52 }
53
54 // Compute write record values
55 for (const auto& gate_idx : memory_write_records) {
56 wires[3].at(gate_idx) = wires[2][gate_idx] * eta_three;
57 wires[3].at(gate_idx) += wires[1][gate_idx] * eta_two;
58 wires[3].at(gate_idx) += wires[0][gate_idx] * eta;
59 wires[3].at(gate_idx) += 1;
60 }
61}
62
70template <IsUltraOrMegaHonk Flavor>
72 const size_t circuit_size,
73 RelationParameters<FF>& relation_parameters)
74{
75 PROFILE_THIS_NAME("compute_logderivative_inverses");
76
77 // Compute inverses for conventional lookups
78 LogDerivLookupRelation<FF>::compute_logderivative_inverse(polynomials, relation_parameters, circuit_size);
79
80 if constexpr (HasDataBus<Flavor>) {
81 // Compute inverses for calldata reads
83 polynomials, relation_parameters, circuit_size);
84
85 // Compute inverses for secondary_calldata reads
87 polynomials, relation_parameters, circuit_size);
88
89 // Compute inverses for return data reads
91 polynomials, relation_parameters, circuit_size);
92 }
93}
94
101template <IsUltraOrMegaHonk Flavor>
103 std::vector<FF>& public_inputs,
104 const size_t pub_inputs_offset,
105 ActiveRegionData& active_region_data,
106 RelationParameters<FF>& relation_parameters,
107 size_t size_override)
108{
109 relation_parameters.public_input_delta = compute_public_input_delta<Flavor>(
110 public_inputs, relation_parameters.beta, relation_parameters.gamma, pub_inputs_offset);
111
112 // Compute permutation grand product polynomial
113 compute_grand_product<Flavor, UltraPermutationRelation<FF>>(
114 polynomials, relation_parameters, size_override, active_region_data);
115}
116
123template <IsUltraOrMegaHonk Flavor>
125 const std::shared_ptr<DeciderProvingKey_<Flavor>>& decider_pk)
126{
127 // Generate random eta, beta and gamma
128 decider_pk->relation_parameters.eta = FF::random_element();
129 decider_pk->relation_parameters.eta = FF::random_element();
130 decider_pk->relation_parameters.eta_two = FF::random_element();
131 decider_pk->relation_parameters.eta_three = FF::random_element();
132 decider_pk->relation_parameters.beta = FF::random_element();
133 decider_pk->relation_parameters.gamma = FF::random_element();
134
135 add_ram_rom_memory_records_to_wire_4(decider_pk->polynomials,
136 decider_pk->memory_read_records,
137 decider_pk->memory_write_records,
138 decider_pk->relation_parameters.eta,
139 decider_pk->relation_parameters.eta_two,
140 decider_pk->relation_parameters.eta_three);
141
142 compute_logderivative_inverses(decider_pk->polynomials, decider_pk->dyadic_size(), decider_pk->relation_parameters);
143
144 compute_grand_product_polynomial(decider_pk->polynomials,
145 decider_pk->public_inputs,
146 decider_pk->pub_inputs_offset(),
147 decider_pk->active_region_data,
148 decider_pk->relation_parameters,
149 decider_pk->get_final_active_wire_idx() + 1);
150}
151
155#ifdef STARKNET_GARAGA_FLAVORS
158#endif
161template class WitnessComputation<MegaFlavor>;
163
164} // namespace bb
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
A container for the prover polynomials handles.
A wrapper for Relations to expose methods used by the Sumcheck prover or verifier to add the contribu...
Methods for managing the compututation of derived witness polynomials such as the permutation grand p...
static void complete_proving_key_for_test(const std::shared_ptr< DeciderProvingKey_< Flavor > > &decider_pk)
TEST only method for completing computation of the prover polynomials using random challenges.
static void compute_logderivative_inverses(Flavor::ProverPolynomials &polynomials, const size_t circuit_size, RelationParameters< FF > &relation_parameters)
Compute the inverse polynomials used in the log derivative lookup relations.
static void add_ram_rom_memory_records_to_wire_4(typename Flavor::ProverPolynomials &polynomials, const std::vector< uint32_t > &memory_read_records, const std::vector< uint32_t > &memory_write_records, const FF &eta, const FF &eta_two, const FF &eta_three)
Add RAM/ROM memory records to the fourth wire polynomial.
static void compute_grand_product_polynomial(Flavor::ProverPolynomials &polynomials, std::vector< FF > &public_inputs, const size_t pub_inputs_offset, ActiveRegionData &active_region_data, RelationParameters< FF > &relation_parameters, size_t size_override=0)
Computes public_input_delta and the permutation grand product polynomial.
Entry point for Barretenberg command-line interface.
void compute_logderivative_inverse(Polynomials &polynomials, auto &relation_parameters, const size_t circuit_size)
Compute the inverse polynomial I(X) required for logderivative lookupsdetails Inverse may be defined ...
#define PROFILE_THIS_NAME(name)
Definition op_count.hpp:16
Container for parameters used by the grand product (permutation, lookup) Honk relations.
static field random_element(numeric::RNG *engine=nullptr) noexcept