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 BB_BENCH_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<ProverInstance_<Flavor>>& prover_inst)
126{
127 // Generate random eta, beta and gamma
128 prover_inst->relation_parameters.eta = FF::random_element();
129 prover_inst->relation_parameters.eta = FF::random_element();
130 prover_inst->relation_parameters.eta_two = FF::random_element();
131 prover_inst->relation_parameters.eta_three = FF::random_element();
132 prover_inst->relation_parameters.beta = FF::random_element();
133 prover_inst->relation_parameters.gamma = FF::random_element();
134
135 add_ram_rom_memory_records_to_wire_4(prover_inst->polynomials,
136 prover_inst->memory_read_records,
137 prover_inst->memory_write_records,
138 prover_inst->relation_parameters.eta,
139 prover_inst->relation_parameters.eta_two,
140 prover_inst->relation_parameters.eta_three);
141
142 compute_logderivative_inverses(
143 prover_inst->polynomials, prover_inst->dyadic_size(), prover_inst->relation_parameters);
144
145 compute_grand_product_polynomial(prover_inst->polynomials,
146 prover_inst->public_inputs,
147 prover_inst->pub_inputs_offset(),
148 prover_inst->active_region_data,
149 prover_inst->relation_parameters,
150 prover_inst->get_final_active_wire_idx() + 1);
151}
152
156#ifdef STARKNET_GARAGA_FLAVORS
159#endif
162template class WitnessComputation<MegaFlavor>;
164
165} // namespace bb
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:218
A container for the prover polynomials handles.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
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_prover_instance_for_test(const std::shared_ptr< ProverInstance_< Flavor > > &prover_inst)
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 ...
Container for parameters used by the grand product (permutation, lookup) Honk relations.
static field random_element(numeric::RNG *engine=nullptr) noexcept