2021-06-08 19:32:23 +02:00
|
|
|
use crate::field::extension_field::target::{flatten_target, ExtensionTarget};
|
2021-06-14 15:15:22 +02:00
|
|
|
use crate::field::extension_field::Extendable;
|
2021-07-29 22:00:29 -07:00
|
|
|
use crate::field::field_types::Field;
|
|
|
|
|
use crate::fri::proof::{FriInitialTreeProofTarget, FriProofTarget, FriQueryRoundTarget};
|
2021-06-04 15:40:54 +02:00
|
|
|
use crate::fri::FriConfig;
|
2021-08-10 16:18:42 +02:00
|
|
|
use crate::hash::hash_types::MerkleCapTarget;
|
2021-07-29 22:00:29 -07:00
|
|
|
use crate::iop::challenger::RecursiveChallenger;
|
2021-08-14 08:53:39 -07:00
|
|
|
use crate::iop::target::{BoolTarget, Target};
|
2021-07-29 22:00:29 -07:00
|
|
|
use crate::plonk::circuit_builder::CircuitBuilder;
|
|
|
|
|
use crate::plonk::circuit_data::CommonCircuitData;
|
|
|
|
|
use crate::plonk::plonk_common::PlonkPolynomials;
|
|
|
|
|
use crate::plonk::proof::OpeningSetTarget;
|
2021-07-23 17:31:00 +02:00
|
|
|
use crate::util::reducing::ReducingFactorTarget;
|
2021-06-14 15:15:22 +02:00
|
|
|
use crate::util::{log2_strict, reverse_index_bits_in_place};
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
use crate::with_context;
|
2021-06-04 15:40:54 +02:00
|
|
|
|
|
|
|
|
impl<F: Extendable<D>, const D: usize> CircuitBuilder<F, D> {
|
|
|
|
|
/// Computes P'(x^arity) from {P(x*g^i)}_(i=0..arity), where g is a `arity`-th root of unity
|
|
|
|
|
/// and P' is the FRI reduced polynomial.
|
2021-06-09 17:39:45 +02:00
|
|
|
fn compute_evaluation(
|
|
|
|
|
&mut self,
|
|
|
|
|
x: Target,
|
2021-08-14 08:53:39 -07:00
|
|
|
x_index_within_coset_bits: &[BoolTarget],
|
2021-06-09 17:39:45 +02:00
|
|
|
arity_bits: usize,
|
2021-08-14 08:47:03 -07:00
|
|
|
evals: &[ExtensionTarget<D>],
|
2021-06-09 17:39:45 +02:00
|
|
|
beta: ExtensionTarget<D>,
|
|
|
|
|
) -> ExtensionTarget<D> {
|
2021-07-23 14:58:41 +02:00
|
|
|
let arity = 1 << arity_bits;
|
2021-08-14 08:47:03 -07:00
|
|
|
debug_assert_eq!(evals.len(), arity);
|
2021-06-11 16:22:29 +02:00
|
|
|
|
|
|
|
|
let g = F::primitive_root_of_unity(arity_bits);
|
2021-07-23 14:58:41 +02:00
|
|
|
let g_inv = g.exp((arity as u64) - 1);
|
|
|
|
|
let g_inv_t = self.constant(g_inv);
|
2021-06-11 16:22:29 +02:00
|
|
|
|
|
|
|
|
// The evaluation vector needs to be reordered first.
|
2021-08-14 08:47:03 -07:00
|
|
|
let mut evals = evals.to_vec();
|
2021-06-11 16:22:29 +02:00
|
|
|
reverse_index_bits_in_place(&mut evals);
|
2021-08-12 07:27:33 -07:00
|
|
|
// Want `g^(arity - rev_x_index_within_coset)` as in the out-of-circuit version. Compute it
|
|
|
|
|
// as `(g^-1)^rev_x_index_within_coset`.
|
|
|
|
|
let start = self.exp_from_bits(g_inv_t, x_index_within_coset_bits.iter().rev());
|
2021-07-23 14:58:41 +02:00
|
|
|
let coset_start = self.mul(start, x);
|
2021-06-11 16:22:29 +02:00
|
|
|
|
|
|
|
|
// The answer is gotten by interpolating {(x*g^i, P(x*g^i))} and evaluating at beta.
|
2021-08-16 10:18:10 +02:00
|
|
|
let points = g
|
2021-06-11 16:22:29 +02:00
|
|
|
.powers()
|
2021-08-17 08:47:52 +02:00
|
|
|
.map(|y| {
|
2021-08-16 10:18:10 +02:00
|
|
|
let yc = self.constant(y);
|
2021-08-17 08:47:52 +02:00
|
|
|
self.mul(coset_start, yc)
|
2021-08-16 10:18:10 +02:00
|
|
|
})
|
2021-08-17 08:47:52 +02:00
|
|
|
.zip(evals)
|
2021-06-11 16:22:29 +02:00
|
|
|
.collect::<Vec<_>>();
|
|
|
|
|
|
|
|
|
|
self.interpolate(&points, beta)
|
2021-06-04 15:40:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn fri_verify_proof_of_work(
|
|
|
|
|
&mut self,
|
|
|
|
|
proof: &FriProofTarget<D>,
|
|
|
|
|
challenger: &mut RecursiveChallenger,
|
|
|
|
|
config: &FriConfig,
|
2021-06-14 13:26:22 +02:00
|
|
|
) {
|
2021-06-04 15:40:54 +02:00
|
|
|
let mut inputs = challenger.get_hash(self).elements.to_vec();
|
|
|
|
|
inputs.push(proof.pow_witness);
|
|
|
|
|
|
|
|
|
|
let hash = self.hash_n_to_m(inputs, 1, false)[0];
|
2021-07-21 13:05:40 -07:00
|
|
|
self.assert_leading_zeros(
|
|
|
|
|
hash,
|
|
|
|
|
config.proof_of_work_bits + (64 - F::order().bits()) as u32,
|
|
|
|
|
);
|
2021-06-04 15:40:54 +02:00
|
|
|
}
|
|
|
|
|
|
2021-06-14 13:26:22 +02:00
|
|
|
pub fn verify_fri_proof(
|
|
|
|
|
&mut self,
|
|
|
|
|
// Openings of the PLONK polynomials.
|
|
|
|
|
os: &OpeningSetTarget<D>,
|
|
|
|
|
// Point at which the PLONK polynomials are opened.
|
|
|
|
|
zeta: ExtensionTarget<D>,
|
2021-08-10 15:53:27 +02:00
|
|
|
initial_merkle_caps: &[MerkleCapTarget],
|
2021-06-14 13:26:22 +02:00
|
|
|
proof: &FriProofTarget<D>,
|
|
|
|
|
challenger: &mut RecursiveChallenger,
|
2021-07-12 14:25:28 +02:00
|
|
|
common_data: &CommonCircuitData<F, D>,
|
2021-06-14 13:26:22 +02:00
|
|
|
) {
|
2021-07-18 23:24:33 -07:00
|
|
|
let config = &common_data.config;
|
|
|
|
|
let total_arities = config.fri_config.reduction_arity_bits.iter().sum::<usize>();
|
2021-06-14 13:26:22 +02:00
|
|
|
debug_assert_eq!(
|
2021-08-08 09:14:07 -07:00
|
|
|
common_data.degree_bits,
|
2021-07-19 16:24:21 +02:00
|
|
|
log2_strict(proof.final_poly.len()) + total_arities,
|
2021-06-14 13:26:22 +02:00
|
|
|
"Final polynomial has wrong degree."
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Size of the LDE domain.
|
2021-07-19 16:24:21 +02:00
|
|
|
let n = proof.final_poly.len() << (total_arities + config.rate_bits);
|
2021-06-14 13:26:22 +02:00
|
|
|
|
2021-08-16 10:41:12 +02:00
|
|
|
challenger.observe_opening_set(os);
|
2021-08-08 09:14:07 -07:00
|
|
|
|
|
|
|
|
// Scaling factor to combine polynomials.
|
|
|
|
|
let alpha = challenger.get_extension_challenge(self);
|
|
|
|
|
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
let betas = with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
"recover the random betas used in the FRI reductions.",
|
|
|
|
|
proof
|
2021-08-10 15:53:27 +02:00
|
|
|
.commit_phase_merkle_caps
|
2021-07-19 12:22:18 -07:00
|
|
|
.iter()
|
2021-08-10 15:53:27 +02:00
|
|
|
.map(|cap| {
|
|
|
|
|
challenger.observe_cap(cap);
|
2021-07-19 12:22:18 -07:00
|
|
|
challenger.get_extension_challenge(self)
|
|
|
|
|
})
|
|
|
|
|
.collect::<Vec<_>>()
|
|
|
|
|
);
|
2021-06-14 13:26:22 +02:00
|
|
|
challenger.observe_extension_elements(&proof.final_poly.0);
|
|
|
|
|
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
"check PoW",
|
|
|
|
|
self.fri_verify_proof_of_work(proof, challenger, &config.fri_config)
|
|
|
|
|
);
|
2021-06-14 13:26:22 +02:00
|
|
|
|
|
|
|
|
// Check that parameters are coherent.
|
|
|
|
|
debug_assert_eq!(
|
2021-07-18 23:24:33 -07:00
|
|
|
config.fri_config.num_query_rounds,
|
2021-06-14 13:26:22 +02:00
|
|
|
proof.query_round_proofs.len(),
|
|
|
|
|
"Number of query rounds does not match config."
|
|
|
|
|
);
|
|
|
|
|
debug_assert!(
|
2021-07-18 23:24:33 -07:00
|
|
|
!config.fri_config.reduction_arity_bits.is_empty(),
|
2021-06-14 13:26:22 +02:00
|
|
|
"Number of reductions should be non-zero."
|
|
|
|
|
);
|
|
|
|
|
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
let precomputed_reduced_evals = with_context!(
|
|
|
|
|
self,
|
|
|
|
|
"precompute reduced evaluations",
|
2021-08-13 11:35:20 +02:00
|
|
|
PrecomputedReducedEvalsTarget::from_os_and_alpha(
|
|
|
|
|
os,
|
|
|
|
|
alpha,
|
|
|
|
|
common_data.degree_bits,
|
|
|
|
|
zeta,
|
|
|
|
|
self
|
|
|
|
|
)
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
);
|
|
|
|
|
|
2021-07-19 12:22:18 -07:00
|
|
|
for (i, round_proof) in proof.query_round_proofs.iter().enumerate() {
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
// To minimize noise in our logs, we will only record a context for a single FRI query.
|
|
|
|
|
// The very first query will have some extra gates due to constants being registered, so
|
|
|
|
|
// the second query is a better representative.
|
|
|
|
|
let level = if i == 1 {
|
|
|
|
|
log::Level::Debug
|
|
|
|
|
} else {
|
|
|
|
|
log::Level::Trace
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let num_queries = proof.query_round_proofs.len();
|
|
|
|
|
with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
level,
|
|
|
|
|
&format!("verify one (of {}) query rounds", num_queries),
|
2021-07-19 12:22:18 -07:00
|
|
|
self.fri_verifier_query_round(
|
|
|
|
|
zeta,
|
|
|
|
|
alpha,
|
2021-07-20 11:08:53 +02:00
|
|
|
precomputed_reduced_evals,
|
2021-08-10 15:53:27 +02:00
|
|
|
initial_merkle_caps,
|
2021-07-19 12:22:18 -07:00
|
|
|
proof,
|
|
|
|
|
challenger,
|
|
|
|
|
n,
|
|
|
|
|
&betas,
|
|
|
|
|
round_proof,
|
|
|
|
|
common_data,
|
|
|
|
|
)
|
2021-06-14 13:26:22 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-06-04 17:36:48 +02:00
|
|
|
|
|
|
|
|
fn fri_verify_initial_proof(
|
|
|
|
|
&mut self,
|
2021-08-14 08:53:39 -07:00
|
|
|
x_index_bits: &[BoolTarget],
|
2021-06-04 17:36:48 +02:00
|
|
|
proof: &FriInitialTreeProofTarget,
|
2021-08-10 15:53:27 +02:00
|
|
|
initial_merkle_caps: &[MerkleCapTarget],
|
2021-08-10 15:28:41 +02:00
|
|
|
cap_index: Target,
|
2021-06-04 17:36:48 +02:00
|
|
|
) {
|
2021-08-10 15:53:27 +02:00
|
|
|
for (i, ((evals, merkle_proof), cap)) in proof
|
2021-07-14 20:54:30 +02:00
|
|
|
.evals_proofs
|
|
|
|
|
.iter()
|
2021-08-10 15:53:27 +02:00
|
|
|
.zip(initial_merkle_caps)
|
2021-07-14 20:54:30 +02:00
|
|
|
.enumerate()
|
|
|
|
|
{
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
&format!("verify {}'th initial Merkle proof", i),
|
2021-08-10 15:28:41 +02:00
|
|
|
self.verify_merkle_proof_with_cap_index(
|
|
|
|
|
evals.clone(),
|
|
|
|
|
x_index_bits,
|
|
|
|
|
cap_index,
|
2021-08-10 15:53:27 +02:00
|
|
|
cap,
|
2021-08-10 15:28:41 +02:00
|
|
|
merkle_proof
|
|
|
|
|
)
|
2021-07-19 12:22:18 -07:00
|
|
|
);
|
2021-06-04 17:36:48 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn fri_combine_initial(
|
|
|
|
|
&mut self,
|
|
|
|
|
proof: &FriInitialTreeProofTarget,
|
|
|
|
|
alpha: ExtensionTarget<D>,
|
|
|
|
|
subgroup_x: Target,
|
2021-08-13 11:35:20 +02:00
|
|
|
vanish_zeta: ExtensionTarget<D>,
|
2021-07-20 10:57:20 +02:00
|
|
|
precomputed_reduced_evals: PrecomputedReducedEvalsTarget<D>,
|
2021-07-13 15:20:14 +02:00
|
|
|
common_data: &CommonCircuitData<F, D>,
|
2021-06-04 17:36:48 +02:00
|
|
|
) -> ExtensionTarget<D> {
|
|
|
|
|
assert!(D > 1, "Not implemented for D=1.");
|
2021-07-18 23:24:33 -07:00
|
|
|
let config = self.config.clone();
|
2021-08-11 08:33:58 +02:00
|
|
|
let degree_log = common_data.degree_bits;
|
|
|
|
|
debug_assert_eq!(
|
|
|
|
|
degree_log,
|
|
|
|
|
common_data.config.cap_height + proof.evals_proofs[0].1.siblings.len()
|
|
|
|
|
- config.rate_bits
|
|
|
|
|
);
|
2021-06-04 17:36:48 +02:00
|
|
|
let subgroup_x = self.convert_to_ext(subgroup_x);
|
2021-07-13 15:20:14 +02:00
|
|
|
let mut alpha = ReducingFactorTarget::new(alpha);
|
2021-06-04 17:36:48 +02:00
|
|
|
let mut sum = self.zero_extension();
|
|
|
|
|
|
|
|
|
|
// We will add three terms to `sum`:
|
|
|
|
|
// - one for polynomials opened at `x` only
|
|
|
|
|
// - one for polynomials opened at `x` and `g x`
|
|
|
|
|
|
2021-07-19 16:45:38 +02:00
|
|
|
// Polynomials opened at `x`, i.e., the constants-sigmas, wires, quotient and partial products polynomials.
|
2021-06-17 11:54:31 +02:00
|
|
|
let single_evals = [
|
2021-06-25 11:24:26 +02:00
|
|
|
PlonkPolynomials::CONSTANTS_SIGMAS,
|
2021-07-19 16:45:38 +02:00
|
|
|
PlonkPolynomials::WIRES,
|
2021-06-17 11:54:31 +02:00
|
|
|
PlonkPolynomials::QUOTIENT,
|
|
|
|
|
]
|
|
|
|
|
.iter()
|
2021-07-18 23:24:33 -07:00
|
|
|
.flat_map(|&p| proof.unsalted_evals(p, config.zero_knowledge))
|
2021-07-13 15:20:14 +02:00
|
|
|
.chain(
|
2021-07-18 23:24:33 -07:00
|
|
|
&proof.unsalted_evals(PlonkPolynomials::ZS_PARTIAL_PRODUCTS, config.zero_knowledge)
|
2021-07-13 15:20:14 +02:00
|
|
|
[common_data.partial_products_range()],
|
|
|
|
|
)
|
2021-07-23 17:29:31 +02:00
|
|
|
.copied()
|
2021-06-17 11:54:31 +02:00
|
|
|
.collect::<Vec<_>>();
|
2021-07-23 17:29:31 +02:00
|
|
|
let single_composition_eval = alpha.reduce_base(&single_evals, self);
|
2021-07-20 10:57:20 +02:00
|
|
|
let single_numerator =
|
|
|
|
|
self.sub_extension(single_composition_eval, precomputed_reduced_evals.single);
|
2021-08-10 09:07:01 +02:00
|
|
|
sum = self.div_add_extension(single_numerator, vanish_zeta, sum);
|
2021-07-13 15:20:14 +02:00
|
|
|
alpha.reset();
|
2021-06-04 17:36:48 +02:00
|
|
|
|
2021-06-17 11:31:14 +02:00
|
|
|
// Polynomials opened at `x` and `g x`, i.e., the Zs polynomials.
|
|
|
|
|
let zs_evals = proof
|
2021-07-18 23:24:33 -07:00
|
|
|
.unsalted_evals(PlonkPolynomials::ZS_PARTIAL_PRODUCTS, config.zero_knowledge)
|
2021-06-07 21:24:41 +02:00
|
|
|
.iter()
|
2021-07-13 15:20:14 +02:00
|
|
|
.take(common_data.zs_range().end)
|
2021-07-23 17:29:31 +02:00
|
|
|
.copied()
|
2021-06-07 21:24:41 +02:00
|
|
|
.collect::<Vec<_>>();
|
2021-07-23 17:29:31 +02:00
|
|
|
let zs_composition_eval = alpha.reduce_base(&zs_evals, self);
|
2021-06-07 21:24:41 +02:00
|
|
|
|
2021-08-13 11:35:20 +02:00
|
|
|
let interpol_val = self.mul_add_extension(
|
|
|
|
|
vanish_zeta,
|
|
|
|
|
precomputed_reduced_evals.slope,
|
|
|
|
|
precomputed_reduced_evals.zs,
|
|
|
|
|
);
|
2021-08-16 10:18:10 +02:00
|
|
|
let zs_numerator = self.sub_extension(zs_composition_eval, interpol_val);
|
|
|
|
|
let vanish_zeta_right =
|
|
|
|
|
self.sub_extension(subgroup_x, precomputed_reduced_evals.zeta_right);
|
|
|
|
|
sum = alpha.shift(sum, self);
|
|
|
|
|
let zs_denominator = self.mul_extension(vanish_zeta, vanish_zeta_right);
|
2021-08-10 09:07:01 +02:00
|
|
|
sum = self.div_add_extension(zs_numerator, zs_denominator, sum);
|
2021-06-08 14:56:49 +02:00
|
|
|
|
2021-06-04 17:36:48 +02:00
|
|
|
sum
|
|
|
|
|
}
|
2021-06-08 19:32:23 +02:00
|
|
|
|
|
|
|
|
fn fri_verifier_query_round(
|
|
|
|
|
&mut self,
|
|
|
|
|
zeta: ExtensionTarget<D>,
|
|
|
|
|
alpha: ExtensionTarget<D>,
|
2021-07-20 10:57:20 +02:00
|
|
|
precomputed_reduced_evals: PrecomputedReducedEvalsTarget<D>,
|
2021-08-10 15:53:27 +02:00
|
|
|
initial_merkle_caps: &[MerkleCapTarget],
|
2021-06-08 19:32:23 +02:00
|
|
|
proof: &FriProofTarget<D>,
|
|
|
|
|
challenger: &mut RecursiveChallenger,
|
|
|
|
|
n: usize,
|
|
|
|
|
betas: &[ExtensionTarget<D>],
|
|
|
|
|
round_proof: &FriQueryRoundTarget<D>,
|
2021-07-13 15:20:14 +02:00
|
|
|
common_data: &CommonCircuitData<F, D>,
|
2021-06-14 13:26:22 +02:00
|
|
|
) {
|
2021-08-14 10:01:10 -07:00
|
|
|
let config = &common_data.config;
|
2021-06-10 16:08:57 +02:00
|
|
|
let n_log = log2_strict(n);
|
2021-06-08 19:32:23 +02:00
|
|
|
// TODO: Do we need to range check `x_index` to a target smaller than `p`?
|
2021-07-22 16:07:07 +02:00
|
|
|
let x_index = challenger.get_challenge(self);
|
2021-07-22 15:10:55 +02:00
|
|
|
let mut x_index_bits = self.low_bits(x_index, n_log, 64);
|
2021-08-16 10:41:12 +02:00
|
|
|
let cap_index =
|
|
|
|
|
self.le_sum(x_index_bits[x_index_bits.len() - common_data.config.cap_height..].iter());
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
"check FRI initial proof",
|
|
|
|
|
self.fri_verify_initial_proof(
|
2021-07-22 15:10:55 +02:00
|
|
|
&x_index_bits,
|
2021-07-19 12:22:18 -07:00
|
|
|
&round_proof.initial_trees_proof,
|
2021-08-10 15:53:27 +02:00
|
|
|
initial_merkle_caps,
|
2021-08-10 15:28:41 +02:00
|
|
|
cap_index
|
2021-07-19 12:22:18 -07:00
|
|
|
)
|
2021-06-08 19:32:23 +02:00
|
|
|
);
|
2021-07-19 12:22:18 -07:00
|
|
|
|
2021-06-08 19:32:23 +02:00
|
|
|
// `subgroup_x` is `subgroup[x_index]`, i.e., the actual field element in the domain.
|
2021-08-13 11:35:20 +02:00
|
|
|
let (mut subgroup_x, vanish_zeta) = with_context!(self, "compute x from its index", {
|
|
|
|
|
let g = self.constant(F::coset_shift());
|
2021-07-19 12:22:18 -07:00
|
|
|
let phi = self.constant(F::primitive_root_of_unity(n_log));
|
2021-06-09 17:39:45 +02:00
|
|
|
|
2021-07-23 08:53:00 +02:00
|
|
|
let phi = self.exp_from_bits(phi, x_index_bits.iter().rev());
|
2021-08-13 11:35:20 +02:00
|
|
|
let g_ext = self.convert_to_ext(g);
|
|
|
|
|
let phi_ext = self.convert_to_ext(phi);
|
2021-08-13 18:00:40 +02:00
|
|
|
// `subgroup_x = g*phi, vanish_zeta = g*phi - zeta`
|
2021-08-16 10:18:10 +02:00
|
|
|
let subgroup_x = self.mul(g, phi);
|
|
|
|
|
let vanish_zeta = self.mul_sub_extension(g_ext, phi_ext, zeta);
|
|
|
|
|
(subgroup_x, vanish_zeta)
|
2021-07-19 12:22:18 -07:00
|
|
|
});
|
2021-06-09 17:39:45 +02:00
|
|
|
|
2021-08-12 07:27:33 -07:00
|
|
|
// old_eval is the last derived evaluation; it will be checked for consistency with its
|
|
|
|
|
// committed "parent" value in the next iteration.
|
|
|
|
|
let mut old_eval = with_context!(
|
|
|
|
|
self,
|
|
|
|
|
"combine initial oracles",
|
|
|
|
|
self.fri_combine_initial(
|
|
|
|
|
&round_proof.initial_trees_proof,
|
|
|
|
|
alpha,
|
|
|
|
|
subgroup_x,
|
2021-08-13 11:35:20 +02:00
|
|
|
vanish_zeta,
|
2021-08-12 07:27:33 -07:00
|
|
|
precomputed_reduced_evals,
|
|
|
|
|
common_data,
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
2021-08-14 10:01:10 -07:00
|
|
|
for (i, &arity_bits) in config.fri_config.reduction_arity_bits.iter().enumerate() {
|
2021-08-12 07:27:33 -07:00
|
|
|
let evals = &round_proof.steps[i].evals;
|
|
|
|
|
|
|
|
|
|
// Split x_index into the index of the coset x is in, and the index of x within that coset.
|
|
|
|
|
let coset_index_bits = x_index_bits[arity_bits..].to_vec();
|
|
|
|
|
let x_index_within_coset_bits = &x_index_bits[..arity_bits];
|
|
|
|
|
let x_index_within_coset = self.le_sum(x_index_within_coset_bits.iter());
|
|
|
|
|
|
|
|
|
|
// Check consistency with our old evaluation from the previous round.
|
2021-08-12 13:32:49 -07:00
|
|
|
self.random_access_padded(
|
|
|
|
|
x_index_within_coset,
|
|
|
|
|
old_eval,
|
|
|
|
|
evals.clone(),
|
|
|
|
|
1 << config.cap_height,
|
|
|
|
|
);
|
2021-08-12 07:27:33 -07:00
|
|
|
|
|
|
|
|
// Infer P(y) from {P(x)}_{x^arity=y}.
|
|
|
|
|
old_eval = with_context!(
|
|
|
|
|
self,
|
|
|
|
|
"infer evaluation using interpolation",
|
|
|
|
|
self.compute_evaluation(
|
|
|
|
|
subgroup_x,
|
2021-08-16 10:41:12 +02:00
|
|
|
x_index_within_coset_bits,
|
2021-08-12 07:27:33 -07:00
|
|
|
arity_bits,
|
|
|
|
|
evals,
|
|
|
|
|
betas[i],
|
2021-06-08 19:32:23 +02:00
|
|
|
)
|
2021-08-12 07:27:33 -07:00
|
|
|
);
|
|
|
|
|
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
"verify FRI round Merkle proof.",
|
2021-08-10 15:03:29 +02:00
|
|
|
self.verify_merkle_proof_with_cap_index(
|
2021-08-12 07:27:33 -07:00
|
|
|
flatten_target(evals),
|
|
|
|
|
&coset_index_bits,
|
2021-08-10 15:03:29 +02:00
|
|
|
cap_index,
|
2021-08-10 15:53:27 +02:00
|
|
|
&proof.commit_phase_merkle_caps[i],
|
2021-07-19 12:22:18 -07:00
|
|
|
&round_proof.steps[i].merkle_proof,
|
|
|
|
|
)
|
2021-06-14 13:26:22 +02:00
|
|
|
);
|
2021-06-08 19:32:23 +02:00
|
|
|
|
2021-08-12 07:27:33 -07:00
|
|
|
// Update the point x to x^arity.
|
|
|
|
|
subgroup_x = self.exp_power_of_2(subgroup_x, arity_bits);
|
|
|
|
|
|
|
|
|
|
x_index_bits = coset_index_bits;
|
|
|
|
|
}
|
2021-06-08 19:32:23 +02:00
|
|
|
|
|
|
|
|
// Final check of FRI. After all the reductions, we check that the final polynomial is equal
|
|
|
|
|
// to the one sent by the prover.
|
Reduce noise in FRI logging (#129)
* Reduce noise in FRI logging
Previously, all logs related to gate counts were at the `Debug` log level. This PR gives us more flexibility to adjust the log levels of particular scopes.
In particular, our circuit checks 40 FRI queries, and we log a bunch of steps for each query, creating a lot of noise. With this change, we log just a single FRI query at the `Debug` level, and demote others to the `Trace` level.
With `RUST_LOG=debug`, our logs now look like
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] 17631 gates to root
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 8 gates to observe proof and generates challenges
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 4150 gates to evaluate the vanishing polynomial at our challenge point, zeta.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 3184 gates to evaluate gate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 227 gates to evaluate InterpolationGate { num_points: 4, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 867 gates to evaluate <R=101> GMiMCGate { ... } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 576 gates to evaluate BaseSumGate { num_limbs: 63 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 78 gates to evaluate ArithmeticExtensionGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 288 gates to evaluate BaseSumGate { num_limbs: 31 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 115 gates to evaluate InsertionGate { vec_size: 3, _phantom: PhantomData }<D=4> constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 26 gates to evaluate BaseSumGate { num_limbs: 2 } + Base: 2 constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 633 gates to evaluate ReducingGate { num_coeffs: 21 } constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 4 gates to evaluate ConstantGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to evaluate PublicInputGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 2 gates to evaluate NoopGate constraints
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 16 gates to check vanishing and quotient polynomials.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | 13336 gates to verify FRI proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 6 gates to recover the random betas used in the FRI reductions.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 4 gates to check PoW
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 104 gates to precompute reduced evaluations
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 95 gates to check FRI initial proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 22 gates to verify 0'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 33 gates to verify 1'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 2'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | | 20 gates to verify 3'th initial Merkle proof
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 34 gates to compute x from its index
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 32 gates to combine initial oracles
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 17 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 15 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 13 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 11 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 9 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 7 gates to verify FRI round Merkle proof.
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 10 gates to infer final evaluation using interpolation
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | | 8 gates to evaluate final polynomial
```
This bit corresponds to the single FRI query being shown:
```
[2021-07-26T21:07:45Z DEBUG plonky2::context_tree] | | 330 gates to verify one (of 40) query rounds
```
* Minor cleanup
* Address feedback
2021-07-26 16:21:14 -07:00
|
|
|
let eval = with_context!(
|
2021-07-19 12:22:18 -07:00
|
|
|
self,
|
|
|
|
|
"evaluate final polynomial",
|
|
|
|
|
proof.final_poly.eval_scalar(self, subgroup_x)
|
|
|
|
|
);
|
2021-08-24 08:30:34 +02:00
|
|
|
self.connect_extension(eval, old_eval);
|
2021-06-08 19:32:23 +02:00
|
|
|
}
|
2021-06-04 15:40:54 +02:00
|
|
|
}
|
2021-07-20 10:57:20 +02:00
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
|
struct PrecomputedReducedEvalsTarget<const D: usize> {
|
|
|
|
|
pub single: ExtensionTarget<D>,
|
|
|
|
|
pub zs: ExtensionTarget<D>,
|
2021-08-14 11:48:13 +02:00
|
|
|
/// Slope of the line from `(zeta, zs)` to `(zeta_right, zs_right)`.
|
2021-08-13 11:35:20 +02:00
|
|
|
pub slope: ExtensionTarget<D>,
|
|
|
|
|
pub zeta_right: ExtensionTarget<D>,
|
2021-07-20 10:57:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<const D: usize> PrecomputedReducedEvalsTarget<D> {
|
|
|
|
|
fn from_os_and_alpha<F: Extendable<D>>(
|
|
|
|
|
os: &OpeningSetTarget<D>,
|
|
|
|
|
alpha: ExtensionTarget<D>,
|
2021-08-13 11:35:20 +02:00
|
|
|
degree_log: usize,
|
|
|
|
|
zeta: ExtensionTarget<D>,
|
2021-07-20 10:57:20 +02:00
|
|
|
builder: &mut CircuitBuilder<F, D>,
|
|
|
|
|
) -> Self {
|
|
|
|
|
let mut alpha = ReducingFactorTarget::new(alpha);
|
|
|
|
|
let single = alpha.reduce(
|
|
|
|
|
&os.constants
|
|
|
|
|
.iter()
|
|
|
|
|
.chain(&os.plonk_sigmas)
|
|
|
|
|
.chain(&os.wires)
|
|
|
|
|
.chain(&os.quotient_polys)
|
|
|
|
|
.chain(&os.partial_products)
|
|
|
|
|
.copied()
|
|
|
|
|
.collect::<Vec<_>>(),
|
|
|
|
|
builder,
|
|
|
|
|
);
|
|
|
|
|
let zs = alpha.reduce(&os.plonk_zs, builder);
|
|
|
|
|
let zs_right = alpha.reduce(&os.plonk_zs_right, builder);
|
|
|
|
|
|
2021-08-13 11:35:20 +02:00
|
|
|
let g = builder.constant_extension(F::Extension::primitive_root_of_unity(degree_log));
|
|
|
|
|
let zeta_right = builder.mul_extension(g, zeta);
|
2021-08-16 10:18:10 +02:00
|
|
|
let numerator = builder.sub_extension(zs_right, zs);
|
|
|
|
|
let denominator = builder.sub_extension(zeta_right, zeta);
|
2021-08-13 11:35:20 +02:00
|
|
|
|
2021-07-20 10:57:20 +02:00
|
|
|
Self {
|
|
|
|
|
single,
|
|
|
|
|
zs,
|
2021-08-13 11:35:20 +02:00
|
|
|
slope: builder.div_extension(numerator, denominator),
|
|
|
|
|
zeta_right,
|
2021-07-20 10:57:20 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|