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 RelationParameters<FF>& relation_parameters,
106 size_t size_override)
107{
108 relation_parameters.public_input_delta = compute_public_input_delta<Flavor>(
109 public_inputs, relation_parameters.beta, relation_parameters.gamma, pub_inputs_offset);
110
111 // Compute permutation grand product polynomial
112 compute_grand_product<Flavor, UltraPermutationRelation<FF>>(polynomials, relation_parameters, size_override);
113}
114
121template <IsUltraOrMegaHonk Flavor>
123 const std::shared_ptr<ProverInstance_<Flavor>>& prover_inst)
124{
125 // Generate random eta, beta and gamma
126 prover_inst->relation_parameters.eta = FF::random_element();
127 prover_inst->relation_parameters.eta = FF::random_element();
128 prover_inst->relation_parameters.eta_two = FF::random_element();
129 prover_inst->relation_parameters.eta_three = FF::random_element();
130 prover_inst->relation_parameters.beta = FF::random_element();
131 prover_inst->relation_parameters.gamma = FF::random_element();
132
133 add_ram_rom_memory_records_to_wire_4(prover_inst->polynomials,
134 prover_inst->memory_read_records,
135 prover_inst->memory_write_records,
136 prover_inst->relation_parameters.eta,
137 prover_inst->relation_parameters.eta_two,
138 prover_inst->relation_parameters.eta_three);
139
140 compute_logderivative_inverses(
141 prover_inst->polynomials, prover_inst->dyadic_size(), prover_inst->relation_parameters);
142
143 compute_grand_product_polynomial(prover_inst->polynomials,
144 prover_inst->public_inputs,
145 prover_inst->pub_inputs_offset(),
146 prover_inst->relation_parameters,
147 prover_inst->get_final_active_wire_idx() + 1);
148}
149
153#ifdef STARKNET_GARAGA_FLAVORS
156#endif
159template class WitnessComputation<MegaFlavor>;
161
162} // namespace bb
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:219
A container for the prover polynomials.
typename Curve::ScalarField FF
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 compute_grand_product_polynomial(Flavor::ProverPolynomials &polynomials, std::vector< FF > &public_inputs, const size_t pub_inputs_offset, RelationParameters< FF > &relation_parameters, size_t size_override=0)
Computes public_input_delta and the permutation grand product polynomial.
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.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
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