Skip to content

Commit f25d18a

Browse files
authored
refactor: improve visibilities (#65)
* refactor: improve visibilities * feat: update curve25519-dalek version
1 parent e0f964c commit f25d18a

File tree

4 files changed

+75
-91
lines changed

4 files changed

+75
-91
lines changed

Cargo.toml

+2-5
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,8 @@ license-file = "LICENSE"
1111
keywords = ["zkSNARKs", "cryptography", "proofs"]
1212

1313
[dependencies]
14-
curve25519-dalek = { version = "3.2.0", features = [
14+
curve25519-dalek = { version = "4.1.1", features = [
1515
"serde",
16-
"u64_backend",
1716
"alloc",
1817
], default-features = false }
1918
merlin = { version = "3.0.0", default-features = false }
@@ -58,9 +57,8 @@ harness = false
5857
required-features = ["std"]
5958

6059
[features]
61-
default = ["std", "simd_backend"]
60+
default = ["std"]
6261
std = [
63-
"curve25519-dalek/std",
6462
"digest/std",
6563
"merlin/std",
6664
"rand/std",
@@ -72,6 +70,5 @@ std = [
7270
"itertools/use_std",
7371
"flate2/rust_backend",
7472
]
75-
simd_backend = ["curve25519-dalek/simd_backend"]
7673
multicore = ["rayon"]
7774
profile = ["colored"]

src/commitments.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::group::{GroupElement, VartimeMultiscalarMul, GROUP_BASEPOINT_COMPRESSED};
22
use super::scalar::Scalar;
3-
use digest::XofReader;
4-
use digest::{ExtendableOutput, Input};
3+
use digest::{ExtendableOutput, Input, XofReader};
54
use sha3::Shake256;
65

76
#[derive(Debug)]

src/r1csinstance.rs

+11-12
Original file line numberDiff line numberDiff line change
@@ -110,21 +110,24 @@ impl R1CSInstance {
110110
let num_poly_vars_x = num_cons.log_2();
111111
let num_poly_vars_y = (2 * num_vars).log_2();
112112

113-
let mat_A = (0..A.len())
114-
.map(|i| SparseMatEntry::new(A[i].0, A[i].1, A[i].2))
113+
let mat_A = A
114+
.iter()
115+
.map(|(row, col, val)| SparseMatEntry::new(*row, *col, *val))
115116
.collect::<Vec<SparseMatEntry>>();
116-
let mat_B = (0..B.len())
117-
.map(|i| SparseMatEntry::new(B[i].0, B[i].1, B[i].2))
117+
let mat_B = B
118+
.iter()
119+
.map(|(row, col, val)| SparseMatEntry::new(*row, *col, *val))
118120
.collect::<Vec<SparseMatEntry>>();
119-
let mat_C = (0..C.len())
120-
.map(|i| SparseMatEntry::new(C[i].0, C[i].1, C[i].2))
121+
let mat_C = C
122+
.iter()
123+
.map(|(row, col, val)| SparseMatEntry::new(*row, *col, *val))
121124
.collect::<Vec<SparseMatEntry>>();
122125

123126
let poly_A = SparseMatPolynomial::new(num_poly_vars_x, num_poly_vars_y, mat_A);
124127
let poly_B = SparseMatPolynomial::new(num_poly_vars_x, num_poly_vars_y, mat_B);
125128
let poly_C = SparseMatPolynomial::new(num_poly_vars_x, num_poly_vars_y, mat_C);
126129

127-
R1CSInstance {
130+
Self {
128131
num_cons,
129132
num_vars,
130133
num_inputs,
@@ -257,11 +260,7 @@ impl R1CSInstance {
257260
assert_eq!(Az.len(), self.num_cons);
258261
assert_eq!(Bz.len(), self.num_cons);
259262
assert_eq!(Cz.len(), self.num_cons);
260-
let res: usize = (0..self.num_cons)
261-
.map(|i| usize::from(Az[i] * Bz[i] != Cz[i]))
262-
.sum();
263-
264-
res == 0
263+
(0..self.num_cons).all(|i| Az[i] * Bz[i] == Cz[i])
265264
}
266265

267266
pub fn multiply_vec(

src/sparse_mlpoly.rs

+61-72
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,14 @@ impl Derefs {
5151
pub fn new(row_ops_val: Vec<DensePolynomial>, col_ops_val: Vec<DensePolynomial>) -> Self {
5252
assert_eq!(row_ops_val.len(), col_ops_val.len());
5353

54-
let derefs = {
55-
// combine all polynomials into a single polynomial (used below to produce a single commitment)
56-
let comb = DensePolynomial::merge(row_ops_val.iter().chain(col_ops_val.iter()));
57-
58-
Derefs {
59-
row_ops_val,
60-
col_ops_val,
61-
comb,
62-
}
63-
};
54+
// combine all polynomials into a single polynomial (used below to produce a single commitment)
55+
let comb = DensePolynomial::merge(row_ops_val.iter().chain(col_ops_val.iter()));
6456

65-
derefs
57+
Derefs {
58+
row_ops_val,
59+
col_ops_val,
60+
comb,
61+
}
6662
}
6763

6864
pub fn commit(&self, gens: &PolyCommitmentGens) -> DerefsCommitment {
@@ -343,7 +339,7 @@ impl AppendToTranscript for SparseMatPolyCommitment {
343339

344340
impl SparseMatPolynomial {
345341
pub fn new(num_vars_x: usize, num_vars_y: usize, M: Vec<SparseMatEntry>) -> Self {
346-
SparseMatPolynomial {
342+
Self {
347343
num_vars_x,
348344
num_vars_y,
349345
M,
@@ -377,8 +373,9 @@ impl SparseMatPolynomial {
377373
assert_eq!(sparse_polys[i].num_vars_y, sparse_polys[0].num_vars_y);
378374
}
379375

380-
let N = (0..sparse_polys.len())
381-
.map(|i| sparse_polys[i].get_num_nz_entries())
376+
let N = sparse_polys
377+
.iter()
378+
.map(|sparse_poly| sparse_poly.get_num_nz_entries())
382379
.max()
383380
.unwrap();
384381

@@ -430,13 +427,10 @@ impl SparseMatPolynomial {
430427
assert_eq!(self.num_vars_x.pow2(), eval_table_rx.len());
431428
assert_eq!(self.num_vars_y.pow2(), eval_table_ry.len());
432429

433-
(0..self.M.len())
434-
.map(|i| {
435-
let row = self.M[i].row;
436-
let col = self.M[i].col;
437-
let val = &self.M[i].val;
438-
eval_table_rx[row] * eval_table_ry[col] * val
439-
})
430+
self
431+
.M
432+
.iter()
433+
.map(|SparseMatEntry { row, col, val }| eval_table_rx[*row] * eval_table_ry[*col] * val)
440434
.sum()
441435
}
442436

@@ -448,25 +442,22 @@ impl SparseMatPolynomial {
448442
let eval_table_rx = EqPolynomial::new(rx.to_vec()).evals();
449443
let eval_table_ry = EqPolynomial::new(ry.to_vec()).evals();
450444

451-
(0..polys.len())
452-
.map(|i| polys[i].evaluate_with_tables(&eval_table_rx, &eval_table_ry))
445+
polys
446+
.iter()
447+
.map(|poly| poly.evaluate_with_tables(&eval_table_rx, &eval_table_ry))
453448
.collect::<Vec<Scalar>>()
454449
}
455450

456451
pub fn multiply_vec(&self, num_rows: usize, num_cols: usize, z: &[Scalar]) -> Vec<Scalar> {
457452
assert_eq!(z.len(), num_cols);
458453

459-
(0..self.M.len())
460-
.map(|i| {
461-
let row = self.M[i].row;
462-
let col = self.M[i].col;
463-
let val = &self.M[i].val;
464-
(row, val * z[col])
465-
})
466-
.fold(vec![Scalar::zero(); num_rows], |mut Mz, (r, v)| {
467-
Mz[r] += v;
454+
self.M.iter().fold(
455+
vec![Scalar::zero(); num_rows],
456+
|mut Mz, SparseMatEntry { row, col, val }| {
457+
Mz[*row] += val * z[*col];
468458
Mz
469-
})
459+
},
460+
)
470461
}
471462

472463
pub fn compute_eval_table_sparse(
@@ -477,13 +468,13 @@ impl SparseMatPolynomial {
477468
) -> Vec<Scalar> {
478469
assert_eq!(rx.len(), num_rows);
479470

480-
let mut M_evals: Vec<Scalar> = vec![Scalar::zero(); num_cols];
481-
482-
for i in 0..self.M.len() {
483-
let entry = &self.M[i];
484-
M_evals[entry.col] += rx[entry.row] * entry.val;
485-
}
486-
M_evals
471+
self.M.iter().fold(
472+
vec![Scalar::zero(); num_cols],
473+
|mut M_evals, SparseMatEntry { row, col, val }| {
474+
M_evals[*col] += rx[*row] * val;
475+
M_evals
476+
},
477+
)
487478
}
488479

489480
pub fn multi_commit(
@@ -706,18 +697,18 @@ impl HashLayerProof {
706697
let (rand_mem, rand_ops) = rand;
707698

708699
// decommit ops-addr at rand_ops
709-
let mut eval_ops_addr_vec: Vec<Scalar> = Vec::new();
710-
for i in 0..addr_timestamps.ops_addr.len() {
711-
let eval_ops_addr = addr_timestamps.ops_addr[i].evaluate(rand_ops);
712-
eval_ops_addr_vec.push(eval_ops_addr);
713-
}
700+
let eval_ops_addr_vec = addr_timestamps
701+
.ops_addr
702+
.iter()
703+
.map(|addr| addr.evaluate(rand_ops))
704+
.collect();
714705

715706
// decommit read_ts at rand_ops
716-
let mut eval_read_ts_vec: Vec<Scalar> = Vec::new();
717-
for i in 0..addr_timestamps.read_ts.len() {
718-
let eval_read_ts = addr_timestamps.read_ts[i].evaluate(rand_ops);
719-
eval_read_ts_vec.push(eval_read_ts);
720-
}
707+
let eval_read_ts_vec = addr_timestamps
708+
.read_ts
709+
.iter()
710+
.map(|addr| addr.evaluate(rand_ops))
711+
.collect();
721712

722713
// decommit audit-ts at rand_mem
723714
let eval_audit_ts = addr_timestamps.audit_ts.evaluate(rand_mem);
@@ -738,11 +729,15 @@ impl HashLayerProof {
738729
let (rand_mem, rand_ops) = rand;
739730

740731
// decommit derefs at rand_ops
741-
let eval_row_ops_val = (0..derefs.row_ops_val.len())
742-
.map(|i| derefs.row_ops_val[i].evaluate(rand_ops))
732+
let eval_row_ops_val = derefs
733+
.row_ops_val
734+
.iter()
735+
.map(|row| row.evaluate(rand_ops))
743736
.collect::<Vec<Scalar>>();
744-
let eval_col_ops_val = (0..derefs.col_ops_val.len())
745-
.map(|i| derefs.col_ops_val[i].evaluate(rand_ops))
737+
let eval_col_ops_val = derefs
738+
.col_ops_val
739+
.iter()
740+
.map(|col| col.evaluate(rand_ops))
746741
.collect::<Vec<Scalar>>();
747742
let proof_derefs = DerefsEvalProof::prove(
748743
derefs,
@@ -1581,15 +1576,9 @@ impl SparsePolynomial {
15811576

15821577
fn compute_chi(a: &[bool], r: &[Scalar]) -> Scalar {
15831578
assert_eq!(a.len(), r.len());
1584-
let mut chi_i = Scalar::one();
1585-
for j in 0..r.len() {
1586-
if a[j] {
1587-
chi_i *= r[j];
1588-
} else {
1589-
chi_i *= Scalar::one() - r[j];
1590-
}
1591-
}
1592-
chi_i
1579+
a.iter().zip(r.iter()).fold(Scalar::one(), |sum, (a, r)| {
1580+
sum * if *a { *r } else { Scalar::one() - r }
1581+
})
15931582
}
15941583

15951584
// Takes O(n log n). TODO: do this in O(n) where n is the number of entries in Z
@@ -1620,15 +1609,15 @@ mod tests {
16201609
let num_vars_x: usize = num_rows.log_2();
16211610
let num_vars_y: usize = num_cols.log_2();
16221611

1623-
let mut M: Vec<SparseMatEntry> = Vec::new();
1624-
1625-
for _i in 0..num_nz_entries {
1626-
M.push(SparseMatEntry::new(
1627-
(csprng.next_u64() % (num_rows as u64)) as usize,
1628-
(csprng.next_u64() % (num_cols as u64)) as usize,
1629-
Scalar::random(&mut csprng),
1630-
));
1631-
}
1612+
let M = (0..num_nz_entries)
1613+
.map(|_i| {
1614+
SparseMatEntry::new(
1615+
(csprng.next_u64() % (num_rows as u64)) as usize,
1616+
(csprng.next_u64() % (num_cols as u64)) as usize,
1617+
Scalar::random(&mut csprng),
1618+
)
1619+
})
1620+
.collect();
16321621

16331622
let poly_M = SparseMatPolynomial::new(num_vars_x, num_vars_y, M);
16341623
let gens = SparseMatPolyCommitmentGens::new(

0 commit comments

Comments
 (0)