Skip to content

Commit 1d33ba1

Browse files
authored
Merge pull request #90 from paritytech/domain-ref
ZK_ROWS can differ
2 parents 83d1779 + e96c349 commit 1d33ba1

12 files changed

Lines changed: 76 additions & 79 deletions

File tree

pasta-tree/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ fn piop_params<G: AffineRepr<BaseField: PrimeField>, R: Rng>(
8686
h: G,
8787
rng: &mut R,
8888
) -> PiopParams<G> {
89-
let domain = Domain::<G::BaseField>::new(domain_size, true);
89+
let domain = Domain::<G::BaseField>::with_zk_rows(domain_size, 3);
9090
let seed = G::rand(rng);
9191
let padding = G::rand(rng);
9292
PiopParams::setup(domain, h, seed, padding)

w3f-plonk-common/benches/plonk_common.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ fn bench_domain_creation(c: &mut Criterion) {
1616
for log_n in [9, 10, 12, 14] {
1717
let n = 1usize << log_n;
1818
group.bench_with_input(BenchmarkId::new("hiding", n), &n, |b, &n| {
19-
b.iter(|| Domain::<Fq>::new(n, true));
19+
b.iter(|| Domain::<Fq>::with_zk_rows(n, 3));
2020
});
2121
group.bench_with_input(BenchmarkId::new("non_hiding", n), &n, |b, &n| {
22-
b.iter(|| Domain::<Fq>::new(n, false));
22+
b.iter(|| Domain::<Fq>::no_zk(n));
2323
});
2424
}
2525
group.finish();
@@ -30,14 +30,14 @@ fn bench_field_column(c: &mut Criterion) {
3030
let mut group = c.benchmark_group("field_column");
3131
for log_n in [9, 10, 12] {
3232
let n = 1usize << log_n;
33-
let domain = Domain::<Fq>::new(n, true);
33+
let domain = Domain::<Fq>::with_zk_rows(n, 3);
3434
let vals: Vec<Fq> = random_vec(domain.capacity - 1, rng);
3535

3636
group.bench_with_input(
3737
BenchmarkId::new("private_column", n),
3838
&(vals.clone(), &domain),
3939
|b, (vals, domain)| {
40-
b.iter(|| domain.private_column(vals.clone()));
40+
b.iter(|| domain.column(vals.clone()));
4141
},
4242
);
4343

@@ -62,7 +62,7 @@ fn bench_booleanity_gadget(c: &mut Criterion) {
6262
let mut group = c.benchmark_group("booleanity");
6363
for log_n in [9, 10, 12] {
6464
let n = 1usize << log_n;
65-
let domain = Domain::<Fq>::new(n, true);
65+
let domain = Domain::<Fq>::with_zk_rows(n, 3);
6666
let bits = random_bitvec(domain.capacity - 1, 0.5, rng);
6767
let bit_col = BitColumn::init(bits, &domain);
6868

@@ -83,7 +83,7 @@ fn bench_inner_prod_gadget(c: &mut Criterion) {
8383
let mut group = c.benchmark_group("inner_prod");
8484
for log_n in [9, 10, 12] {
8585
let n = 1usize << log_n;
86-
let domain = Domain::<Fq>::new(n, true);
86+
let domain = Domain::<Fq>::with_zk_rows(n, 3);
8787
let a: Vec<Fq> = random_vec(domain.capacity - 1, rng);
8888
let b_vals: Vec<Fq> = random_vec(domain.capacity - 1, rng);
8989

@@ -92,8 +92,8 @@ fn bench_inner_prod_gadget(c: &mut Criterion) {
9292
&(a.clone(), b_vals.clone(), &domain),
9393
|bench, (a, b_vals, domain)| {
9494
bench.iter(|| {
95-
let a_col = domain.private_column(a.clone());
96-
let b_col = domain.private_column(b_vals.clone());
95+
let a_col = domain.column(a.clone());
96+
let b_col = domain.column(b_vals.clone());
9797
InnerProd::<Fq>::init(a_col, b_col, domain);
9898
});
9999
},
@@ -128,7 +128,7 @@ fn bench_te_cond_add_gadget(c: &mut Criterion) {
128128
let mut group = c.benchmark_group("te_cond_add");
129129
for log_n in [9, 10, 12] {
130130
let n = 1usize << log_n;
131-
let domain = Domain::<Fq>::new(n, true);
131+
let domain = Domain::<Fq>::with_zk_rows(n, 3);
132132
let seed = EdwardsAffine::generator();
133133

134134
let bitmask = random_bitvec(domain.capacity - 1, 0.5, rng);

w3f-plonk-common/src/domain.rs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ use ark_poly::{
77
use ark_std::{vec, vec::Vec};
88
use getrandom_or_panic::getrandom_or_panic;
99

10-
pub const ZK_ROWS: usize = 3;
11-
1210
// Domains for performing calculations with constraint polynomials of degree up to 4.
1311
#[derive(Clone)]
1412
pub struct Domains<F: FftField> {
@@ -69,14 +67,14 @@ pub struct Domain<F: FftField> {
6967
}
7068

7169
impl<F: FftField> Domain<F> {
72-
pub fn new(n: usize, hiding: bool) -> Self {
73-
if hiding {
74-
Self::with_zk_rows(n, ZK_ROWS)
75-
} else {
76-
Self::with_zk_rows(n, 0)
77-
}
70+
/// Returns a "non-blinding" domain of full `capacity = N`.
71+
pub fn no_zk(n: usize) -> Self {
72+
Self::with_zk_rows(n, 0)
7873
}
7974

75+
/// Returns a domain that blinds (column) polynomials.
76+
/// The highest `zk_rows` evaluations (aka Lagrange coefficients) are set random.
77+
/// After interpolation that is equivallent to adding `r(X).Z'(X)`, for a random `deg(r) = zk_rows - 1`.
8078
pub fn with_zk_rows(n: usize, zk_rows: usize) -> Self {
8179
let domains = Domains::new(n);
8280
let domain_size = domains.x1.size();
@@ -88,7 +86,7 @@ impl<F: FftField> Domain<F> {
8886
let l_last = l_i(last_row_index, domain_size);
8987
let l_last = domains.column_from_evals(l_last, 0);
9088

91-
let (zk_rows_prod, last_row) = compute_row_polys(domains.x1, zk_rows).unwrap();
89+
let (zk_rows_prod, last_row) = compute_row_polys(domains.x1, zk_rows);
9290
let not_last_row = domains.column_from_poly(last_row);
9391

9492
Self {
@@ -102,6 +100,18 @@ impl<F: FftField> Domain<F> {
102100
}
103101
}
104102

103+
#[cfg(test)]
104+
pub const ZK_ROWS_TEST: usize = 3;
105+
106+
#[cfg(test)]
107+
pub fn test_domain(n: usize, hiding: bool) -> Self {
108+
if hiding {
109+
Self::with_zk_rows(n, Self::ZK_ROWS_TEST)
110+
} else {
111+
Self::with_zk_rows(n, 0)
112+
}
113+
}
114+
105115
pub fn is_hiding(&self) -> bool {
106116
self.zk_rows != 0
107117
}
@@ -176,27 +186,27 @@ fn elements_rev<F: FftField, D: EvaluationDomain<F>>(domain: D) -> impl Iterator
176186
}
177187

178188
/// `Z(c) = X - c`
179-
fn z<F: Field>(c: F) -> DensePolynomial<F> {
189+
fn z_poly<F: Field>(c: F) -> DensePolynomial<F> {
180190
DensePolynomial::from_coefficients_vec(vec![-c, F::one()])
181191
}
182192

183193
fn one<F: Field>() -> DensePolynomial<F> {
184194
DensePolynomial::from_coefficients_vec(vec![F::one()])
185195
}
186196

187-
/// For a domain of size `N`, returns `(Z(X), (X - w^{N - zk_rows - 1}))`,
188-
/// where `Z(X) = (X - w^{N-1}) * (X - w^{N-2}) * ... * (X - w^{N - zk_rows})`.
197+
/// For a domain of size `N` returns the vanishing polynomial `Z` of its suffix, `deg(Z) = zk_rows`,
198+
/// `Z(X) = (X - w^{N-1}) * (X - w^{N-2}) * ... * (X - w^{N-zk_rows})`,
199+
/// and the following not included term `X - w^{N-zk_rows-1}`.
189200
fn compute_row_polys<F: FftField, D: EvaluationDomain<F>>(
190201
domain: D,
191202
zk_rows: usize,
192-
) -> Option<(DensePolynomial<F>, DensePolynomial<F>)> {
193-
if domain.size() < zk_rows + 1 {
194-
return None;
195-
}
196-
let mut wis = elements_rev(domain).map(|wi| z(wi));
197-
let zk_rows_prod = wis.by_ref().take(zk_rows).fold(one(), |acc, x| acc * x);
198-
let last_row = wis.by_ref().next().unwrap();
199-
Some((zk_rows_prod, last_row))
203+
) -> (DensePolynomial<F>, DensePolynomial<F>) {
204+
assert!(domain.size() >= 1 + zk_rows, "0 domain");
205+
let ws_rev_iter = elements_rev(domain); // `w^{N-1},...,0 = w^N`
206+
let mut z_polys = ws_rev_iter.map(|wi| z_poly(wi));
207+
let zk_rows_prod = z_polys.by_ref().take(zk_rows).fold(one(), |acc, x| acc * x);
208+
let last_row = z_polys.next().unwrap();
209+
(zk_rows_prod, last_row)
200210
}
201211

202212
pub struct EvaluatedDomain<F: FftField> {
@@ -268,7 +278,7 @@ mod tests {
268278

269279
// let domain = GeneralEvaluationDomain::new(1024);
270280
let n = 1024;
271-
let domain = Domain::new(n, hiding);
281+
let domain = Domain::test_domain(n, hiding);
272282
let z = Fq::rand(rng);
273283
let domain_eval = domain.evaluate(z);
274284
assert_eq!(domain.l_first.poly.evaluate(&z), domain_eval.l_first);
@@ -280,31 +290,32 @@ mod tests {
280290
}
281291

282292
#[test]
293+
#[should_panic(expected = "0 domain")]
283294
fn test_domain_zk_rows() {
284295
let log_n = 4;
285296
let n = 1 << log_n;
286297
let domain = Radix2EvaluationDomain::<Fq>::new(n).unwrap();
287298
let w = domain.group_gen();
288-
let (zk_rows_prod, last_row) = compute_row_polys(domain, 0).unwrap();
299+
let (zk_rows_prod, last_row) = compute_row_polys(domain, 0);
289300
assert_eq!(zk_rows_prod, one());
290-
assert_eq!(last_row, z(domain.group_gen_inv()));
301+
assert_eq!(last_row, z_poly(domain.group_gen_inv()));
291302

292303
let zk_rows = 3;
293-
let (zk_rows_prod, last_row) = compute_row_polys(domain, zk_rows).unwrap();
304+
let (zk_rows_prod, last_row) = compute_row_polys(domain, zk_rows);
294305
assert_eq!(zk_rows_prod.degree(), zk_rows);
295306
let last_row_index = n - (zk_rows + 1);
296-
assert_eq!(last_row, z(w.pow([last_row_index as u64])));
307+
assert_eq!(last_row, z_poly(w.pow([last_row_index as u64])));
297308

298309
let zk_rows = n - 1;
299-
let (zk_rows_prod, last_row) = compute_row_polys(domain, zk_rows).unwrap();
300-
assert_eq!(last_row, z(Fq::one()));
310+
let (zk_rows_prod, last_row) = compute_row_polys(domain, zk_rows);
311+
assert_eq!(last_row, z_poly(Fq::one()));
301312
assert_eq!(
302313
zk_rows_prod * last_row,
303314
domain.vanishing_polynomial().into()
304315
);
305316

306317
let zk_rows = n;
307-
assert!(compute_row_polys(domain, zk_rows).is_none());
318+
compute_row_polys(domain, zk_rows);
308319
}
309320

310321
#[test]

w3f-plonk-common/src/gadgets/column_sum.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ mod tests {
110110

111111
let log_n = 10;
112112
let n = 2usize.pow(log_n);
113-
let domain = Domain::new(n, hiding);
113+
let domain = Domain::test_domain(n, hiding);
114114

115115
let col = random_vec(domain.capacity - 1, rng);
116116
let sum = col.iter().sum();

w3f-plonk-common/src/gadgets/ec/sw_cond_add.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ mod tests {
168168

169169
let log_n = 10;
170170
let n = 2usize.pow(log_n);
171-
let domain = Domain::new(n, hiding);
171+
let domain = Domain::test_domain(n, hiding);
172172
let seed = SWAffine::generator();
173173

174174
let bitmask = random_bitvec(domain.capacity - 1, 0.5, rng);

w3f-plonk-common/src/gadgets/ec/te_cond_add.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ mod tests {
170170

171171
let log_n = 10;
172172
let n = 2usize.pow(log_n);
173-
let domain = Domain::new(n, hiding);
173+
let domain = Domain::test_domain(n, hiding);
174174
let seed = EdwardsAffine::generator();
175175

176176
let bitmask = random_bitvec(domain.capacity - 1, 0.5, rng);

w3f-plonk-common/src/gadgets/ec/te_doubling.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ mod tests {
169169

170170
let log_n = 4;
171171
let n = 2usize.pow(log_n);
172-
let domain = Domain::new(n, false);
172+
let domain = Domain::test_domain(n, false);
173173
let p = EdwardsAffine::rand(rng);
174174

175175
let gadget = Doubling::init(p, &domain);

w3f-plonk-common/src/gadgets/inner_prod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ mod tests {
106106

107107
let log_n = 10;
108108
let n = 2usize.pow(log_n);
109-
let domain = Domain::new(n, hiding);
109+
let domain = Domain::test_domain(n, hiding);
110110

111111
let a = random_vec(domain.capacity - 1, rng);
112112
let b = random_vec(domain.capacity - 1, rng);

w3f-ring-proof/benches/ring_proof.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ use criterion::{criterion_group, criterion_main, BatchSize, BenchmarkId, Criteri
22

33
use ark_bls12_381::Bls12_381;
44
use ark_ec::CurveGroup;
5-
use ark_ed_on_bls12_381_bandersnatch::{BandersnatchConfig, EdwardsAffine, Fq, Fr};
5+
use ark_ed_on_bls12_381_bandersnatch::{EdwardsAffine, Fq, Fr};
66
use ark_serialize::CanonicalSerialize;
77
use ark_std::ops::Mul;
88
use ark_std::rand::Rng;
99
use ark_std::{test_rng, UniformRand};
1010
use w3f_pcs::pcs::kzg::KZG;
1111
use w3f_pcs::pcs::PCS;
1212

13-
use w3f_plonk_common::domain::Domain;
1413
use w3f_plonk_common::test_helpers::random_vec;
1514
use w3f_ring_proof::ring_prover::RingProver;
1615
use w3f_ring_proof::ring_verifier::RingVerifier;
@@ -21,14 +20,10 @@ type CS = KZG<Bls12_381>;
2120
fn setup(
2221
rng: &mut impl Rng,
2322
domain_size: usize,
24-
) -> (<CS as PCS<Fq>>::Params, PiopParams<Fq, BandersnatchConfig>) {
23+
) -> (<CS as PCS<Fq>>::Params, PiopParams<EdwardsAffine>) {
2524
let setup_degree = 3 * domain_size;
2625
let pcs_params = CS::setup(setup_degree, rng);
27-
let domain = Domain::new(domain_size, true);
28-
let h = EdwardsAffine::rand(rng);
29-
let seed = EdwardsAffine::rand(rng);
30-
let padding = EdwardsAffine::rand(rng);
31-
let piop_params = PiopParams::setup(domain, h, seed, padding);
26+
let piop_params = PiopParams::rand(domain_size, rng);
3227
(pcs_params, piop_params)
3328
}
3429

@@ -37,13 +32,13 @@ fn make_transcript() -> ArkTranscript {
3732
}
3833

3934
/// Get the Pedersen blinding base H from the PIOP params (first element of the power-of-2 multiples).
40-
fn get_h(piop_params: &PiopParams<Fq, BandersnatchConfig>) -> EdwardsAffine {
35+
fn get_h(piop_params: &PiopParams<EdwardsAffine>) -> EdwardsAffine {
4136
piop_params.power_of_2_multiples_of_h()[0]
4237
}
4338

4439
/// Generate a proof and its corresponding blinded public key.
4540
fn generate_proof(
46-
piop_params: &PiopParams<Fq, BandersnatchConfig>,
41+
piop_params: &PiopParams<EdwardsAffine>,
4742
pcs_params: &<CS as PCS<Fq>>::Params,
4843
pks: &[EdwardsAffine],
4944
rng: &mut impl Rng,

w3f-ring-proof/src/lib.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,7 @@ mod tests {
155155
) -> (CS::Params, PiopParams<EdwardsAffine>) {
156156
let setup_degree = 3 * domain_size;
157157
let pcs_params = CS::setup(setup_degree, rng);
158-
159-
let domain = Domain::new(domain_size, true);
160-
let h = EdwardsAffine::rand(rng);
161-
let seed = EdwardsAffine::rand(rng);
162-
let padding = EdwardsAffine::rand(rng);
163-
let piop_params = PiopParams::setup(domain, h, seed, padding);
164-
158+
let piop_params = PiopParams::rand(domain_size, rng);
165159
(pcs_params, piop_params)
166160
}
167161

0 commit comments

Comments
 (0)