Index into q_evals consistently between prover and verifier.

This commit is contained in:
Sean Bowe 2020-09-05 12:08:56 -06:00
parent 869aba389a
commit d7132404ba
No known key found for this signature in database
GPG key ID: 95684257D8F8B031
3 changed files with 10 additions and 12 deletions

View file

@ -1,6 +1,6 @@
use core::cmp::max; use core::cmp::max;
use core::ops::{Add, Mul}; use core::ops::{Add, Mul};
use std::collections::HashMap; use std::collections::BTreeMap;
use super::Error; use super::Error;
use crate::arithmetic::Field; use crate::arithmetic::Field;
@ -160,7 +160,7 @@ pub struct MetaCircuit<F> {
pub(crate) fixed_queries: Vec<(FixedWire, Rotation)>, pub(crate) fixed_queries: Vec<(FixedWire, Rotation)>,
// Mapping from a witness vector rotation to the index in the point vector. // Mapping from a witness vector rotation to the index in the point vector.
pub(crate) rotations: HashMap<Rotation, PointIndex>, pub(crate) rotations: BTreeMap<Rotation, PointIndex>,
// Vector of permutation arguments, where each corresponds to a set of wires // Vector of permutation arguments, where each corresponds to a set of wires
// that are involved in a permutation argument. As an example, we could have // that are involved in a permutation argument. As an example, we could have
@ -174,7 +174,7 @@ pub struct MetaCircuit<F> {
impl<F: Field> Default for MetaCircuit<F> { impl<F: Field> Default for MetaCircuit<F> {
fn default() -> MetaCircuit<F> { fn default() -> MetaCircuit<F> {
let mut rotations = HashMap::new(); let mut rotations = BTreeMap::new();
rotations.insert(Rotation::default(), PointIndex(0)); rotations.insert(Rotation::default(), PointIndex(0));
MetaCircuit { MetaCircuit {
@ -195,9 +195,9 @@ impl<F: Field> MetaCircuit<F> {
pub fn permutation(&mut self, wires: &[AdviceWire]) -> usize { pub fn permutation(&mut self, wires: &[AdviceWire]) -> usize {
let index = self.permutations.len(); let index = self.permutations.len();
if index == 0 { if index == 0 {
// no permutations let at = Rotation(-1);
let point_idx = self.rotations.len(); let len = self.rotations.len();
self.rotations.insert(Rotation(-1), PointIndex(point_idx)); self.rotations.entry(at).or_insert(PointIndex(len));
} }
self.permutations.push(wires.to_vec()); self.permutations.push(wires.to_vec());

View file

@ -2,7 +2,7 @@ use crate::arithmetic::{best_fft, parallelize, Field, Group};
/// Describes a relative location in the evaluation domain; applying a rotation /// Describes a relative location in the evaluation domain; applying a rotation
/// by i will rotate the vector in the evaluation domain by i. /// by i will rotate the vector in the evaluation domain by i.
#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)] #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, Ord, PartialOrd)]
pub struct Rotation(pub i32); pub struct Rotation(pub i32);
impl Default for Rotation { impl Default for Rotation {

View file

@ -562,13 +562,11 @@ impl<C: CurveAffine> Proof<C> {
let x_6: C::Scalar = get_challenge_scalar(Challenge(transcript.squeeze().get_lower_128())); let x_6: C::Scalar = get_challenge_scalar(Challenge(transcript.squeeze().get_lower_128()));
let mut q_evals = vec![]; let mut q_evals = vec![C::Scalar::zero(); meta.rotations.len()];
for (_, &point_index) in meta.rotations.iter() { for (_, &point_index) in meta.rotations.iter() {
q_evals.push(eval_polynomial( q_evals[point_index.0] =
&q_polys[point_index.0].as_ref().unwrap(), eval_polynomial(&q_polys[point_index.0].as_ref().unwrap(), x_6);
x_6,
));
} }
for eval in q_evals.iter() { for eval in q_evals.iter() {